diff options
author | Richard Moe Gustavsen <richard.gustavsen@qt.io> | 2018-05-08 11:13:27 +0200 |
---|---|---|
committer | Richard Moe Gustavsen <richard.gustavsen@qt.io> | 2018-05-23 20:24:12 +0000 |
commit | 1b0e6861ba7af231c29ebba10c93976845f7f78d (patch) | |
tree | 01444b4d13d212ab44079d9c00a5241eee38e884 /tests/auto/quick/qquicktableview/tst_qquicktableview.cpp | |
parent | 8db3e76960241bebaf82b2a7a4186190c93f7660 (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.cpp | 56 |
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" |