aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorRichard Moe Gustavsen <richard.gustavsen@qt.io>2018-08-23 14:16:07 +0200
committerRichard Moe Gustavsen <richard.gustavsen@qt.io>2018-08-23 13:57:20 +0000
commitee0713e3988b0acf3a1ec6cad1c7722dbec76ea7 (patch)
tree6dbf89401f77f0d07f00ac9c4013e200c02a2d2a /tests
parent7c55485b75548fe6538f6d5227066640a2cbb878 (diff)
QQuickTableView: don't overwrite rebuildState
Since it's fully possible to end up calling invalidateTable() while in the process of rebuilding the table, we need to ensure that we don't mess with the current rebuildState. Instead, just schedule that we need to rebuild once more later. Change-Id: If27bb14f0bc9f72c53eb47e6115d7ad580cdb516 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/quick/qquicktableview/data/changemodelfromdelegate.qml97
-rw-r--r--tests/auto/quick/qquicktableview/testmodel.h5
-rw-r--r--tests/auto/quick/qquicktableview/tst_qquicktableview.cpp29
3 files changed, 131 insertions, 0 deletions
diff --git a/tests/auto/quick/qquicktableview/data/changemodelfromdelegate.qml b/tests/auto/quick/qquicktableview/data/changemodelfromdelegate.qml
new file mode 100644
index 0000000000..79a8e4351a
--- /dev/null
+++ b/tests/auto/quick/qquicktableview/data/changemodelfromdelegate.qml
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** 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 TestModel 0.1
+
+Item {
+ width: 640
+ height: 450
+
+ property alias tableView: tableView
+ property bool addRowFromDelegate: false
+
+ onAddRowFromDelegateChanged: {
+ if (!addRowFromDelegate)
+ return;
+ tableModel.addRow(0);
+ tableView.forceLayout();
+ }
+
+ TestModel {
+ id: tableModel
+ rowCount: 1
+ columnCount: 4
+ }
+
+ TableView {
+ id: tableView
+ width: 600
+ height: 400
+ clip: true
+ model: tableModel
+ delegate: tableViewDelegate
+ }
+
+ Component {
+ id: tableViewDelegate
+ Rectangle {
+ objectName: "tableViewDelegate"
+ implicitWidth: 100
+ implicitHeight: 100
+ color: "lightgray"
+ border.width: 1
+
+ Text {
+ anchors.centerIn: parent
+ text: modelData
+ }
+
+ Component.onCompleted: {
+ if (!addRowFromDelegate)
+ return;
+ addRowFromDelegate = false;
+ tableModel.addRow(0);
+ }
+ }
+ }
+
+}
+
diff --git a/tests/auto/quick/qquicktableview/testmodel.h b/tests/auto/quick/qquicktableview/testmodel.h
index 56d5021cec..28ea466b82 100644
--- a/tests/auto/quick/qquicktableview/testmodel.h
+++ b/tests/auto/quick/qquicktableview/testmodel.h
@@ -136,6 +136,11 @@ public:
endResetModel();
}
+ Q_INVOKABLE void addRow(int row)
+ {
+ insertRow(row, QModelIndex());
+ }
+
signals:
void rowCountChanged();
void columnCountChanged();
diff --git a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp
index ea3531ba13..5e1c21fce8 100644
--- a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp
+++ b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp
@@ -128,6 +128,7 @@ private slots:
void checkContextPropertiesQQmlListProperyModel_data();
void checkContextPropertiesQQmlListProperyModel();
void checkRowAndColumnChangedButNotIndex();
+ void checkChangingModelFromDelegate();
};
tst_QQuickTableView::tst_QQuickTableView()
@@ -1622,6 +1623,34 @@ void tst_QQuickTableView::checkRowAndColumnChangedButNotIndex()
QCOMPARE(contextColumn, 1);
}
+void tst_QQuickTableView::checkChangingModelFromDelegate()
+{
+ // Check that we don't restart a rebuild of the table
+ // while we're in the middle of rebuilding it from before
+ LOAD_TABLEVIEW("changemodelfromdelegate.qml");
+
+ // Set addRowFromDelegate. This will trigger the QML code to add a new
+ // row and call forceLayout(). When TableView instantiates the first
+ // delegate in the new row, the Component.onCompleted handler will try to
+ // add a new row. But since we're currently rebuilding, this should be
+ // scheduled for later.
+ view->rootObject()->setProperty("addRowFromDelegate", true);
+
+ // We now expect two rows in the table, one more than initially
+ QCOMPARE(tableViewPrivate->tableSize.height(), 2);
+ QCOMPARE(tableViewPrivate->loadedTable.height(), 2);
+
+ // And since the QML code tried to add another row as well, we
+ // expect rebuildScheduled to be true, and a polish event to be pending.
+ QCOMPARE(tableViewPrivate->rebuildScheduled, true);
+ QCOMPARE(tableViewPrivate->polishScheduled, true);
+ WAIT_UNTIL_POLISHED;
+
+ // After handling the polish event, we expect also the third row to now be added
+ QCOMPARE(tableViewPrivate->tableSize.height(), 3);
+ QCOMPARE(tableViewPrivate->loadedTable.height(), 3);
+}
+
QTEST_MAIN(tst_QQuickTableView)
#include "tst_qquicktableview.moc"