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 <hjk@qt.io>
This commit is contained in:
Alessandro Portale
2024-06-26 16:59:37 +02:00
parent b94c51995d
commit 8405b384a3

View File

@@ -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<ItemType>();
const ItemType rightType = right.data(RoleItemType).value<ItemType>();
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 class ExtensionsBrowserPrivate
{ {
public: public:
@@ -255,7 +281,7 @@ public:
QLineEdit *searchBox; QLineEdit *searchBox;
QListView *extensionsView; QListView *extensionsView;
QItemSelectionModel *selectionModel = nullptr; QItemSelectionModel *selectionModel = nullptr;
QSortFilterProxyModel *filterProxyModel; SortFilterProxyModel *filterProxyModel;
int columnsCount = 2; int columnsCount = 2;
Tasking::TaskTreeRunner taskTreeRunner; Tasking::TaskTreeRunner taskTreeRunner;
SpinnerSolution::Spinner *m_spinner; SpinnerSolution::Spinner *m_spinner;
@@ -277,7 +303,7 @@ ExtensionsBrowser::ExtensionsBrowser(QWidget *parent)
d->model = new ExtensionsModel(this); d->model = new ExtensionsModel(this);
d->filterProxyModel = new QSortFilterProxyModel(this); d->filterProxyModel = new SortFilterProxyModel(this);
d->filterProxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); d->filterProxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
d->filterProxyModel->setFilterRole(RoleSearchText); d->filterProxyModel->setFilterRole(RoleSearchText);
d->filterProxyModel->setSortRole(RoleItemType); d->filterProxyModel->setSortRole(RoleItemType);