From 8405b384a3f491750b50aeb0f90a286fa61069a2 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 26 Jun 2024 16:59:37 +0200 Subject: [PATCH] ExtensionManager: Introduce own SortFilterProxyModel We want to sort by type and then alphabetically. That requires a custom lessThan() implementation, thus a custom QSortFilterProxyModel. Will come handy for further filtering/sorting requirements in the future. Change-Id: Iaacd955015d56026e41d404dcf4781a1715dc55a Reviewed-by: hjk --- .../extensionmanager/extensionsbrowser.cpp | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/plugins/extensionmanager/extensionsbrowser.cpp b/src/plugins/extensionmanager/extensionsbrowser.cpp index 13816ff5dd2..d88e7f41d3e 100644 --- a/src/plugins/extensionmanager/extensionsbrowser.cpp +++ b/src/plugins/extensionmanager/extensionsbrowser.cpp @@ -247,6 +247,32 @@ public: } }; +class SortFilterProxyModel : public QSortFilterProxyModel +{ +public: + SortFilterProxyModel(QObject *parent = nullptr); + +protected: + bool lessThan(const QModelIndex &left, const QModelIndex &right) const override; +}; + +SortFilterProxyModel::SortFilterProxyModel(QObject *parent) + : QSortFilterProxyModel(parent) +{ +} + +bool SortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const +{ + const ItemType leftType = left.data(RoleItemType).value(); + const ItemType rightType = right.data(RoleItemType).value(); + if (leftType != rightType) + return leftType < rightType; + + const QString leftName = left.data(RoleName).toString(); + const QString rightName = right.data(RoleName).toString(); + return leftName < rightName; +} + class ExtensionsBrowserPrivate { public: @@ -255,7 +281,7 @@ public: QLineEdit *searchBox; QListView *extensionsView; QItemSelectionModel *selectionModel = nullptr; - QSortFilterProxyModel *filterProxyModel; + SortFilterProxyModel *filterProxyModel; int columnsCount = 2; Tasking::TaskTreeRunner taskTreeRunner; SpinnerSolution::Spinner *m_spinner; @@ -277,7 +303,7 @@ ExtensionsBrowser::ExtensionsBrowser(QWidget *parent) d->model = new ExtensionsModel(this); - d->filterProxyModel = new QSortFilterProxyModel(this); + d->filterProxyModel = new SortFilterProxyModel(this); d->filterProxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); d->filterProxyModel->setFilterRole(RoleSearchText); d->filterProxyModel->setSortRole(RoleItemType);