[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [elisa] /: simplify AllArtistsModel to not have filtering and use a QSortFilterProxyModel
From:       Matthieu Gallien <matthieu_gallien () yahoo ! fr>
Date:       2016-12-06 22:10:58
Message-ID: E1cENww-00046P-0S () code ! kde ! org
[Download RAW message or body]

Git commit a123090265cecbcabe1ba6b820bac72404ba7c33 by Matthieu Gallien.
Committed on 06/12/2016 at 21:53.
Pushed by mgallien into branch 'master'.

simplify AllArtistsModel to not have filtering and use a QSortFilterProxyModel

the QSortFilterProxyModel is faster than my hand made solution by not
requirign a freeze of the ui that is easy to perceive

M  +1    -1    autotests/databaseinterfacetest.cpp
M  +9    -4    src/MediaAllArtistView.qml
M  +2    -26   src/allartistsmodel.cpp
M  +2    -11   src/allartistsmodel.h
M  +14   -18   src/databaseinterface.cpp
M  +1    -1    src/databaseinterface.h
M  +3    -0    src/upnpControl.cpp

https://commits.kde.org/elisa/a123090265cecbcabe1ba6b820bac72404ba7c33

diff --git a/autotests/databaseinterfacetest.cpp \
b/autotests/databaseinterfacetest.cpp index b67f390..0d4bacc 100644
--- a/autotests/databaseinterfacetest.cpp
+++ b/autotests/databaseinterfacetest.cpp
@@ -60,7 +60,7 @@ private Q_SLOTS:
     void avoidCrashInAllArtists()
     {
         DatabaseInterface musicDb;
-        musicDb.allArtists({});
+        musicDb.allArtists();
     }
 
     void avoidCrashInAllAlbums()
diff --git a/src/MediaAllArtistView.qml b/src/MediaAllArtistView.qml
index 03ac507..3d79682 100644
--- a/src/MediaAllArtistView.qml
+++ b/src/MediaAllArtistView.qml
@@ -107,11 +107,16 @@ Item {
                     model: DelegateModel {
                         id: delegateContentModel
 
-                        model: AllArtistsModel {
-                            id: allArtistsModel
+                        model: SortFilterProxyModel {
+                            sourceModel: AllArtistsModel {
+                                id: allArtistsModel
 
-                            databaseInterface: rootElement.musicDatabase
-                            filter: filterTextInput.text
+                                databaseInterface: rootElement.musicDatabase
+                            }
+
+                            filterRole: AllArtistsModel.NameRole
+
+                            filterRegExp: new RegExp(filterTextInput.text, 'i')
                         }
 
                         delegate: MediaArtistDelegate {
diff --git a/src/allartistsmodel.cpp b/src/allartistsmodel.cpp
index 3571d83..b6f15ce 100644
--- a/src/allartistsmodel.cpp
+++ b/src/allartistsmodel.cpp
@@ -34,8 +34,6 @@ public:
     {
     }
 
-    QString mFilter;
-
     DatabaseInterface *mMusicDatabase = nullptr;
 
     QVector<MusicArtist> mAllArtists;
@@ -184,11 +182,6 @@ DatabaseInterface *AllArtistsModel::databaseInterface() const
     return d->mMusicDatabase;
 }
 
-QString AllArtistsModel::filter() const
-{
-    return d->mFilter;
-}
-
 void AllArtistsModel::setDatabaseInterface(DatabaseInterface *musicDatabase)
 {
     if (d->mMusicDatabase == musicDatabase) {
@@ -207,30 +200,13 @@ void AllArtistsModel::setDatabaseInterface(DatabaseInterface \
*musicDatabase)  }
 
     beginResetModel();
-    d->mAllArtists = d->mMusicDatabase->allArtists(d->mFilter);
+    d->mAllArtists = d->mMusicDatabase->allArtists();
     d->mArtistsCount = d->mAllArtists.count();
     endResetModel();
 
     emit databaseInterfaceChanged();
 }
 
-void AllArtistsModel::setFilter(const QString &filter)
-{
-    if (d->mFilter == filter) {
-        return;
-    }
-
-    beginResetModel();
-
-    d->mFilter = filter;
-    d->mAllArtists = d->mMusicDatabase->allArtists(d->mFilter);
-    d->mArtistsCount = d->mAllArtists.count();
-
-    endResetModel();
-
-    Q_EMIT filterChanged();
-}
-
 void AllArtistsModel::beginArtistAdded(QVector<qulonglong> newArtists)
 {
     Q_UNUSED(newArtists);
@@ -241,7 +217,7 @@ void AllArtistsModel::endArtistAdded(QVector<qulonglong> \
newArtists)  Q_UNUSED(newArtists);
 
     beginResetModel();
-    d->mAllArtists = d->mMusicDatabase->allArtists(d->mFilter);
+    d->mAllArtists = d->mMusicDatabase->allArtists();
     d->mArtistsCount = d->mAllArtists.count();
 
     endResetModel();
diff --git a/src/allartistsmodel.h b/src/allartistsmodel.h
index 6b95467..cd3575b 100644
--- a/src/allartistsmodel.h
+++ b/src/allartistsmodel.h
@@ -39,11 +39,6 @@ class AllArtistsModel : public QAbstractItemModel
                WRITE setDatabaseInterface
                NOTIFY databaseInterfaceChanged)
 
-    Q_PROPERTY(QString filter
-               READ filter
-               WRITE setFilter
-               NOTIFY filterChanged)
-
 public:
 
     enum ColumnsRoles {
@@ -53,6 +48,8 @@ public:
         IdRole = ImageRole + 1,
     };
 
+    Q_ENUM(ColumnsRoles)
+
     explicit AllArtistsModel(QObject *parent = 0);
 
     virtual ~AllArtistsModel();
@@ -73,20 +70,14 @@ public:
 
     DatabaseInterface* databaseInterface() const;
 
-    QString filter() const;
-
 Q_SIGNALS:
 
     void databaseInterfaceChanged();
 
-    void filterChanged();
-
 public Q_SLOTS:
 
     void setDatabaseInterface(DatabaseInterface* databaseInterface);
 
-    void setFilter(const QString &filter);
-
 
 private Q_SLOTS:
 
diff --git a/src/databaseinterface.cpp b/src/databaseinterface.cpp
index 2d567af..08ecdf6 100644
--- a/src/databaseinterface.cpp
+++ b/src/databaseinterface.cpp
@@ -44,7 +44,7 @@ public:
           mUpdateAlbumQuery(mTracksDatabase), \
                mSelectTracksFromArtist(mTracksDatabase),
           mSelectTrackFromIdQuery(mTracksDatabase), \
                mSelectCountAlbumsForArtistQuery(mTracksDatabase),
           mSelectTrackIdFromTitleAlbumArtistQuery(mTracksDatabase), \
                mSelectAllAlbumsWithFilterQuery(mTracksDatabase),
-          mSelectAllAlbumsFromArtistQuery(mTracksDatabase), \
mSelectAllArtistsWithFilterQuery(mTracksDatabase), +          \
mSelectAllAlbumsFromArtistQuery(mTracksDatabase), \
                mSelectAllArtistsQuery(mTracksDatabase),
           mInsertArtistsQuery(mTracksDatabase), \
mSelectArtistByNameQuery(mTracksDatabase)  {
     }
@@ -79,7 +79,7 @@ public:
 
     QSqlQuery mSelectAllAlbumsFromArtistQuery;
 
-    QSqlQuery mSelectAllArtistsWithFilterQuery;
+    QSqlQuery mSelectAllArtistsQuery;
 
     QSqlQuery mInsertArtistsQuery;
 
@@ -277,7 +277,7 @@ QVector<MusicAlbum> \
DatabaseInterface::allAlbumsFromArtist(QString artistName) c  return result;
 }
 
-QVector<MusicArtist> DatabaseInterface::allArtists(QString filter) const
+QVector<MusicArtist> DatabaseInterface::allArtists() const
 {
     auto result = QVector<MusicArtist>();
 
@@ -292,15 +292,13 @@ QVector<MusicArtist> DatabaseInterface::allArtists(QString \
filter) const  
     QString currentFilter(QStringLiteral("%%1%"));
 
-    d->mSelectAllArtistsWithFilterQuery.bindValue(QStringLiteral(":filter"), \
currentFilter.arg(filter)); +    auto queryResult = d->mSelectAllArtistsQuery.exec();
 
-    auto queryResult = d->mSelectAllArtistsWithFilterQuery.exec();
+    if (!queryResult || !d->mSelectAllArtistsQuery.isSelect() || \
!d->mSelectAllArtistsQuery.isActive()) { +        qDebug() << \
"DatabaseInterface::allArtists" << "not select" << \
d->mSelectAllArtistsQuery.lastQuery(); +        qDebug() << \
"DatabaseInterface::allArtists" << d->mSelectAllArtistsQuery.lastError();  
-    if (!queryResult || !d->mSelectAllArtistsWithFilterQuery.isSelect() || \
                !d->mSelectAllArtistsWithFilterQuery.isActive()) {
-        qDebug() << "DatabaseInterface::allArtists" << "not select" << \
                d->mSelectAllArtistsWithFilterQuery.lastQuery();
-        qDebug() << "DatabaseInterface::allArtists" << \
                d->mSelectAllArtistsWithFilterQuery.lastError();
-
-        d->mSelectAllArtistsWithFilterQuery.finish();
+        d->mSelectAllArtistsQuery.finish();
 
         transactionResult = finishTransaction();
         if (!transactionResult) {
@@ -310,11 +308,11 @@ QVector<MusicArtist> DatabaseInterface::allArtists(QString \
filter) const  return result;
     }
 
-    while(d->mSelectAllArtistsWithFilterQuery.next()) {
+    while(d->mSelectAllArtistsQuery.next()) {
         auto newArtist = MusicArtist();
 
-        newArtist.setDatabaseId(d->mSelectAllArtistsWithFilterQuery.record().value(0).toULongLong());
                
-        newArtist.setName(d->mSelectAllArtistsWithFilterQuery.record().value(1).toString());
 +        newArtist.setDatabaseId(d->mSelectAllArtistsQuery.record().value(0).toULongLong());
 +        newArtist.setName(d->mSelectAllArtistsQuery.record().value(1).toString());
         newArtist.setValid(true);
 
         d->mSelectCountAlbumsForArtistQuery.bindValue(QStringLiteral(":artistName"), \
newArtist.name()); @@ -342,7 +340,7 @@ QVector<MusicArtist> \
DatabaseInterface::allArtists(QString filter) const  result.push_back(newArtist);
     }
 
-    d->mSelectAllArtistsWithFilterQuery.finish();
+    d->mSelectAllArtistsQuery.finish();
 
     transactionResult = finishTransaction();
     if (!transactionResult) {
@@ -885,14 +883,12 @@ void DatabaseInterface::initRequest()
         auto selectAllArtistsWithFilterText = QStringLiteral("SELECT `ID`, "
                                                             "`Name` "
                                                             "FROM `Artists` "
-                                                            "WHERE "
-                                                            "`Name` like :filter "
                                                             "ORDER BY `Name`");
 
-        auto result = \
d->mSelectAllArtistsWithFilterQuery.prepare(selectAllArtistsWithFilterText); +        \
auto result = d->mSelectAllArtistsQuery.prepare(selectAllArtistsWithFilterText);  
         if (!result) {
-            qDebug() << "DatabaseInterface::initRequest" << \
selectAllArtistsWithFilterText << d->mSelectAllArtistsWithFilterQuery.lastError(); +  \
qDebug() << "DatabaseInterface::initRequest" << selectAllArtistsWithFilterText << \
d->mSelectAllArtistsQuery.lastError();  qDebug() << d->mTracksDatabase.lastError();
         }
     }
diff --git a/src/databaseinterface.h b/src/databaseinterface.h
index 7921735..c6d468d 100644
--- a/src/databaseinterface.h
+++ b/src/databaseinterface.h
@@ -69,7 +69,7 @@ public:
 
     QVector<MusicAlbum> allAlbumsFromArtist(QString artistName) const;
 
-    QVector<MusicArtist> allArtists(QString filter) const;
+    QVector<MusicArtist> allArtists() const;
 
     QVector<MusicAudioTrack> tracksFromAuthor(QString artistName) const;
 
diff --git a/src/upnpControl.cpp b/src/upnpControl.cpp
index 7632af2..737eb03 100644
--- a/src/upnpControl.cpp
+++ b/src/upnpControl.cpp
@@ -67,6 +67,8 @@
 #include <KCoreAddons/KAboutData>
 #endif
 
+#include <QtCore/QSortFilterProxyModel>
+
 #include <QtGui/QIcon>
 
 #include <QtWidgets/QApplication>
@@ -120,6 +122,7 @@ int __attribute__((visibility("default"))) main(int argc, char \
                *argv[])
     qmlRegisterType<AllArtistsModel>("org.mgallien.QmlExtension", 1, 0, \
                "AllArtistsModel");
     qmlRegisterType<AlbumModel>("org.mgallien.QmlExtension", 1, 0, "AlbumModel");
     qmlRegisterType<MusicListenersManager>("org.mgallien.QmlExtension", 1, 0, \
"MusicListenersManager"); +    \
qmlRegisterType<QSortFilterProxyModel>("org.mgallien.QmlExtension", 1, 0, \
"SortFilterProxyModel");  
 #if defined Qt5DBus_FOUND && Qt5DBus_FOUND
     qmlRegisterType<Mpris2>("org.mgallien.QmlExtension", 1, 0, "Mpris2");


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic