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 | |
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')
-rw-r--r-- | tests/auto/quick/qquicktableview/data/countingtableview.qml | 85 | ||||
-rw-r--r-- | tests/auto/quick/qquicktableview/tst_qquicktableview.cpp | 56 |
2 files changed, 141 insertions, 0 deletions
diff --git a/tests/auto/quick/qquicktableview/data/countingtableview.qml b/tests/auto/quick/qquicktableview/data/countingtableview.qml new file mode 100644 index 0000000000..1e8e9f43fb --- /dev/null +++ b/tests/auto/quick/qquicktableview/data/countingtableview.qml @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtQuick module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.12 +import QtQuick.Window 2.3 +import Qt.labs.tableview 1.0 + +Item { + id: root + width: 640 + height: 450 + + property alias tableView: tableView + property int currentDelegateCount: 0 + property int maxDelegateCount: 0 + + TableView { + id: tableView + width: 600 + height: 400 + anchors.margins: 1 + clip: true + delegate: tableViewDelegate + cacheBuffer: 0 + } + + Component { + id: tableViewDelegate + Rectangle { + objectName: "tableViewDelegate" + implicitWidth: 100 + implicitHeight: 50 + color: "lightgray" + border.width: 1 + Text { + anchors.centerIn: parent + text: modelData + } + Component.onCompleted: { + currentDelegateCount++; + maxDelegateCount = Math.max(maxDelegateCount, currentDelegateCount); + } + Component.onDestruction: { + currentDelegateCount--; + } + } + } + +} 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" |