[vlc-commits] qt: support sorting from SortFilterProxyModel

Prince Gupta git at videolan.org
Thu Jan 14 14:42:38 UTC 2021


vlc | branch: master | Prince Gupta <guptaprince8832 at gmail.com> | Thu Dec 24 22:29:24 2020 +0530| [e661380b05c32fefe10c7e24a1e34ec1dfa2b8d1] | committer: Pierre Lamot

qt: support sorting from SortFilterProxyModel

Signed-off-by: Pierre Lamot <pierre at videolabs.io>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e661380b05c32fefe10c7e24a1e34ec1dfa2b8d1
---

 modules/gui/qt/util/sortfilterproxymodel.cpp | 35 ++++++++++++++++++++++++++++
 modules/gui/qt/util/sortfilterproxymodel.hpp | 13 +++++++++++
 2 files changed, 48 insertions(+)

diff --git a/modules/gui/qt/util/sortfilterproxymodel.cpp b/modules/gui/qt/util/sortfilterproxymodel.cpp
index 8106f9d089..ab70bb9833 100644
--- a/modules/gui/qt/util/sortfilterproxymodel.cpp
+++ b/modules/gui/qt/util/sortfilterproxymodel.cpp
@@ -33,6 +33,7 @@ SortFilterProxyModel::SortFilterProxyModel( QObject *parent )
     connect( this, &QAbstractItemModel::layoutChanged, this, &SortFilterProxyModel::countChanged );
 
     connect( this, &QAbstractProxyModel::sourceModelChanged, this, &SortFilterProxyModel::updateFilterRole );
+    connect( this, &QAbstractProxyModel::sourceModelChanged, this, &SortFilterProxyModel::updateSortRole );
 }
 
 QString SortFilterProxyModel::searchPattern() const
@@ -57,6 +58,35 @@ void SortFilterProxyModel::setSearchRole( const QByteArray &searchRole )
     updateFilterRole();
 }
 
+QString SortFilterProxyModel::sortCriteria() const
+{
+    return m_sortCriteria;
+}
+
+void SortFilterProxyModel::setSortCriteria(const QString &sortCriteria)
+{
+    if (m_sortCriteria == sortCriteria)
+        return;
+
+    m_sortCriteria = sortCriteria;
+    updateSortRole();
+    emit sortCriteriaChanged();
+}
+
+Qt::SortOrder SortFilterProxyModel::sortOrder() const
+{
+    return QSortFilterProxyModel::sortOrder();
+}
+
+void SortFilterProxyModel::setSortOrder(Qt::SortOrder sortOrder)
+{
+    if (this->sortOrder() == sortOrder)
+        return;
+
+    this->sort(0, sortOrder);
+    emit sortOrderChanged();
+}
+
 int SortFilterProxyModel::count() const
 {
     return rowCount();
@@ -91,3 +121,8 @@ void SortFilterProxyModel::updateFilterRole()
 {
     setFilterRole( roleNames().key( m_searchRole ) );
 }
+
+void SortFilterProxyModel::updateSortRole()
+{
+    setSortRole( roleNames().key( m_sortCriteria.toUtf8() ) );
+}
diff --git a/modules/gui/qt/util/sortfilterproxymodel.hpp b/modules/gui/qt/util/sortfilterproxymodel.hpp
index d2fba63f41..d574505304 100644
--- a/modules/gui/qt/util/sortfilterproxymodel.hpp
+++ b/modules/gui/qt/util/sortfilterproxymodel.hpp
@@ -33,6 +33,8 @@ class SortFilterProxyModel : public QSortFilterProxyModel
 
     Q_PROPERTY( QByteArray searchRole READ searchRole WRITE setSearchRole NOTIFY searchRoleChanged )
     Q_PROPERTY( QString searchPattern READ searchPattern WRITE setSearchPattern NOTIFY searchPatternChanged )
+    Q_PROPERTY( QString sortCriteria READ sortCriteria WRITE setSortCriteria NOTIFY sortCriteriaChanged )
+    Q_PROPERTY( Qt::SortOrder sortOrder READ sortOrder WRITE setSortOrder NOTIFY sortOrderChanged )
     Q_PROPERTY( int count READ count NOTIFY countChanged )
 
 public:
@@ -44,6 +46,12 @@ public:
     QByteArray searchRole() const;
     void setSearchRole( const QByteArray &searchRole );
 
+    QString sortCriteria() const;
+    void setSortCriteria( const QString &sortCriteria );
+
+    Qt::SortOrder sortOrder() const;
+    void setSortOrder(Qt::SortOrder sortOrder);
+
     int count() const;
 
     Q_INVOKABLE QMap<QString, QVariant> getDataAt( int idx );
@@ -54,12 +62,17 @@ signals:
     void searchPatternChanged();
     void searchRoleChanged();
     void countChanged();
+    void sortCriteriaChanged();
+    void sortOrderChanged();
 
 private slots:
     void updateFilterRole();
+    void updateSortRole();
 
 private:
     QByteArray m_searchRole;
+    QString m_sortCriteria;
+    Qt::SortOrder m_sortOrder;
 };
 
 #endif // SORT_FILTER_PROXY_MODEL



More information about the vlc-commits mailing list