summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/itemmodels
diff options
context:
space:
mode:
authorGiulio Camuffo <giulio.camuffo@kdab.com>2020-03-05 10:08:40 +0100
committerGiulio Camuffo <giulio.camuffo@kdab.com>2020-03-18 15:42:58 +0100
commitb5f6a85d2745ab6ac97f593664d255906923e737 (patch)
treedee1fe238e7b8d7f23545ca42cf4a7bae0f19253 /tests/auto/corelib/itemmodels
parent963c47aece12a0025707c76f6f8cb3de306752b8 (diff)
Add a way to filter only rows or columns in QSortFilterProxyModel
If we want to filter away a column without changing the filtering for the rows calling invalidateFilter() is wasteful because it will call filterAcceptsRow() for all rows even though that is not needed. This commit add two functions, invalidateRowsFilter() and invalidateColumnsFilter() that work the same way as invalidateFilter() except that they will invoke respectively only filterAcceptsRow() and filterAcceptsColumn(). Change-Id: Ib4351cf08c229bd97bbbfee6da92397dca579a84 Reviewed-by: David Faure <david.faure@kdab.com>
Diffstat (limited to 'tests/auto/corelib/itemmodels')
-rw-r--r--tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp80
-rw-r--r--tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h2
2 files changed, 82 insertions, 0 deletions
diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp
index 7f9a996136..a01f5bcf46 100644
--- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp
+++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp
@@ -4940,4 +4940,84 @@ void tst_QSortFilterProxyModel::filterAndInsertRow()
}
}
+void tst_QSortFilterProxyModel::invalidateColumnsOrRowsFilter()
+{
+ class FilterProxy : public QSortFilterProxyModel
+ {
+ public:
+ FilterProxy()
+ {}
+ bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override
+ {
+ rowFiltered++;
+
+ if (sourceModel()->data(sourceModel()->index(source_row, 0, source_parent)).toString() == QLatin1String("A1"))
+ return !rejectA1;
+ return true;
+ }
+ bool filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const override
+ {
+ Q_UNUSED(source_column)
+ Q_UNUSED(source_parent)
+
+ columnFiltered++;
+ return true;
+ }
+
+ mutable int rowFiltered = 0;
+ mutable int columnFiltered = 0;
+ bool rejectA1 = false;
+
+ using QSortFilterProxyModel::invalidateFilter;
+ using QSortFilterProxyModel::invalidateRowsFilter;
+ using QSortFilterProxyModel::invalidateColumnsFilter;
+ };
+ QStandardItemModel model(10, 4);
+ for (int i = 0; i < model.rowCount(); ++i) {
+ for (int j = 0; j < model.columnCount(); ++j) {
+ model.setItem(i, j, new QStandardItem(QString('A' + j) + QString::number(i + 1)));
+ model.item(i, 0)->appendColumn({ new QStandardItem(QString("child col %0").arg(j)) });
+ }
+ }
+ FilterProxy proxy;
+ proxy.setSourceModel(&model);
+
+ QTreeView view;
+ view.setModel(&proxy);
+ view.expandAll();
+
+ QCOMPARE(proxy.rowFiltered, 20); //10 parents + 10 children
+ QCOMPARE(proxy.columnFiltered, 44); // 4 parents + 4 * 10 children
+
+ proxy.rowFiltered = proxy.columnFiltered = 0;
+ proxy.invalidateFilter();
+
+ QCOMPARE(proxy.rowFiltered, 20);
+ QCOMPARE(proxy.columnFiltered, 44);
+
+ proxy.rowFiltered = proxy.columnFiltered = 0;
+ proxy.invalidateRowsFilter();
+
+ QCOMPARE(proxy.rowFiltered, 20);
+ QCOMPARE(proxy.columnFiltered, 0);
+
+ proxy.rowFiltered = proxy.columnFiltered = 0;
+ proxy.invalidateColumnsFilter();
+
+ QCOMPARE(proxy.rowFiltered, 0);
+ QCOMPARE(proxy.columnFiltered, 44);
+
+ QCOMPARE(proxy.rowCount(), 10);
+ proxy.rejectA1 = true;
+ proxy.rowFiltered = proxy.columnFiltered = 0;
+ proxy.invalidateRowsFilter();
+ QCOMPARE(proxy.rowCount(), 9);
+ QCOMPARE(proxy.rowFiltered, 19); // it will not check the child row of A1
+
+ proxy.rowFiltered = proxy.columnFiltered = 0;
+ proxy.setRecursiveFilteringEnabled(true); // this triggers invalidateRowsFilter()
+ QCOMPARE(proxy.rowCount(), 10);
+ QCOMPARE(proxy.rowFiltered, 20);
+}
+
#include "tst_qsortfilterproxymodel.moc"
diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h
index 71662bda07..703f168cdb 100644
--- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h
+++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h
@@ -159,6 +159,8 @@ private slots:
void removeIntervals_data();
void removeIntervals();
+ void invalidateColumnsOrRowsFilter();
+
protected:
void buildHierarchy(const QStringList &data, QAbstractItemModel *model);
void checkHierarchy(const QStringList &data, const QAbstractItemModel *model);