aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp
diff options
context:
space:
mode:
authorRichard Moe Gustavsen <richard.gustavsen@qt.io>2018-05-08 11:13:27 +0200
committerRichard Moe Gustavsen <richard.gustavsen@qt.io>2018-05-23 20:24:12 +0000
commit1b0e6861ba7af231c29ebba10c93976845f7f78d (patch)
tree01444b4d13d212ab44079d9c00a5241eee38e884 /tests/auto/quick/qquicktableview/tst_qquicktableview.cpp
parent8db3e76960241bebaf82b2a7a4186190c93f7660 (diff)
TableView: load and unload edges in the same loop
Normally when you flick the table around, a column (row) will be flicked out of view on one side, while another column will be flicked in and loaded on the opposite side. But if you flick really fast, you sometimes manage to flick in and out several columns in one go before tableview gets an updatePolish call to catch up. In the latter case, we would then first unload all flicked-out columns, and then afterwards continue loading all flicked-in columns. This approach is currently not a big problem, but it will be once we start recycling delegate items. Because then we should take care to not overflow the pool with unloaded column items, since the pool will most likely have a maximum size. So we therefore change the algorithm a bit so that we always alternate between unloading and loading one column at a time, rather than unload several columns in one go before we start loading new ones. Change-Id: Ia0f1968a4b3579e4445e1f7b6e68a28a1d2b360b Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'tests/auto/quick/qquicktableview/tst_qquicktableview.cpp')
-rw-r--r--tests/auto/quick/qquicktableview/tst_qquicktableview.cpp56
1 files changed, 56 insertions, 0 deletions
diff --git a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp
index 4c9cfacd2d..33437b6eac 100644
--- a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp
+++ b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp
@@ -98,6 +98,7 @@ private slots:
void flick();
void flickOvershoot_data();
void flickOvershoot();
+ void checkRowColumnCount();
};
tst_QQuickTableView::tst_QQuickTableView()
@@ -643,6 +644,61 @@ void tst_QQuickTableView::flickOvershoot()
QCOMPARE(tableViewPrivate->loadedTable.bottom(), rowCount - 1);
}
+void tst_QQuickTableView::checkRowColumnCount()
+{
+ // If we flick several columns (rows) at the same time, check that we don't
+ // end up with loading more delegate items into memory than necessary. We
+ // should free up columns as we go before loading new ones.
+ LOAD_TABLEVIEW("countingtableview.qml");
+
+ const char *maxDelegateCountProp = "maxDelegateCount";
+ auto model = TestModelAsVariant(100, 100);
+
+ tableView->setModel(model);
+
+ WAIT_UNTIL_POLISHED;
+
+ const int tableViewCount = tableViewPrivate->loadedItems.count();
+ const int qmlCountAfterInit = view->rootObject()->property(maxDelegateCountProp).toInt();
+ QCOMPARE(tableViewCount, qmlCountAfterInit);
+
+ // Flick a long distance right
+ tableView->setContentX(tableView->width() * 2);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ const int qmlCountAfterRightFlick = view->rootObject()->property(maxDelegateCountProp).toInt();
+ QCOMPARE(qmlCountAfterRightFlick, qmlCountAfterInit);
+
+ // Flick a long distance down
+ tableView->setContentX(tableView->height() * 2);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ const int qmlCountAfterDownFlick = view->rootObject()->property(maxDelegateCountProp).toInt();
+ QCOMPARE(qmlCountAfterDownFlick, qmlCountAfterInit);
+
+ // Flick a long distance left
+ tableView->setContentX(0);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ const int qmlCountAfterLeftFlick = view->rootObject()->property(maxDelegateCountProp).toInt();
+ QCOMPARE(qmlCountAfterLeftFlick, qmlCountAfterInit);
+
+ // Flick a long distance up
+ tableView->setContentY(0);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ const int qmlCountAfterUpFlick = view->rootObject()->property(maxDelegateCountProp).toInt();
+ QCOMPARE(qmlCountAfterUpFlick, qmlCountAfterInit);
+}
+
QTEST_MAIN(tst_QQuickTableView)
#include "tst_qquicktableview.moc"