diff options
Diffstat (limited to 'tests')
3 files changed, 265 insertions, 0 deletions
diff --git a/tests/auto/quick/qquicktableview/data/tableviewwithselected1.qml b/tests/auto/quick/qquicktableview/data/tableviewwithselected1.qml new file mode 100644 index 0000000000..efa0befaf5 --- /dev/null +++ b/tests/auto/quick/qquicktableview/data/tableviewwithselected1.qml @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2021 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 +import QtQuick.Window +import QtQml.Models + +Item { + width: 640 + height: 450 + + property alias tableView: tableView + + TableView { + id: tableView + width: 600 + height: 400 + anchors.margins: 1 + clip: true + delegate: tableViewDelegate + columnSpacing: 1 + rowSpacing: 1 + } + + Component { + id: tableViewDelegate + Rectangle { + objectName: "tableViewDelegate" + implicitWidth: 100 + implicitHeight: 100 + required property bool selected + color: selected ? "lightgray" : "green" + } + } + +} diff --git a/tests/auto/quick/qquicktableview/data/tableviewwithselected2.qml b/tests/auto/quick/qquicktableview/data/tableviewwithselected2.qml new file mode 100644 index 0000000000..bb90d3f4bd --- /dev/null +++ b/tests/auto/quick/qquicktableview/data/tableviewwithselected2.qml @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2021 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 +import QtQuick.Window +import QtQml.Models + +Item { + width: 640 + height: 450 + + property alias tableView: tableView + + TableView { + id: tableView + width: 600 + height: 400 + anchors.margins: 1 + clip: true + delegate: tableViewDelegate + columnSpacing: 1 + rowSpacing: 1 + selectionModel: ItemSelectionModel { + model: tableView.model + } + + } + + Component { + id: tableViewDelegate + Rectangle { + objectName: "tableViewDelegate" + implicitWidth: 100 + implicitHeight: 100 + // Add a selected property, but since it's not + // required, TableView should not touch it. + property bool selected + color: selected ? "lightgray" : "green" + } + } + +} diff --git a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp index 6bd05c876f..dece7e53d9 100644 --- a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp +++ b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp @@ -198,6 +198,10 @@ private slots: void leftRightTopBottomProperties(); void checkContentSize_data(); void checkContentSize(); + void checkSelectionModelWithRequiredSelectedProperty_data(); + void checkSelectionModelWithRequiredSelectedProperty(); + void checkSelectionModelWithUnrequiredSelectedProperty(); + void removeAndAddSelectionModel(); }; tst_QQuickTableView::tst_QQuickTableView() @@ -3451,6 +3455,117 @@ void tst_QQuickTableView::checkContentSize() QCOMPARE(tableView->contentHeight(), rowCount == 0 ? 0 : (rowCount * (delegateHeight + rowSpacing)) - rowSpacing); } +void tst_QQuickTableView::checkSelectionModelWithRequiredSelectedProperty_data() +{ + QTest::addColumn<QVector<QPoint>>("selected"); + QTest::addColumn<QPoint>("toggle"); + + QTest::newRow("nothing selected") << QVector<QPoint>() << QPoint(0,0); + QTest::newRow("one item selected") << (QVector<QPoint>() << QPoint(0, 0)) << QPoint(1, 1); + QTest::newRow("two items selected") << (QVector<QPoint>() << QPoint(1, 1) << QPoint(2, 2)) << QPoint(1, 1); +} + +void tst_QQuickTableView::checkSelectionModelWithRequiredSelectedProperty() +{ + // Check that if you add a "required property selected" to the delegate, + // TableView will give it a value upon creation that matches the state + // in the selection model. + QFETCH(QVector<QPoint>, selected); + QFETCH(QPoint, toggle); + + LOAD_TABLEVIEW("tableviewwithselected1.qml"); + + TestModel model(10, 10); + QItemSelectionModel selectionModel(&model); + + // Set initially selected cells + for (auto it = selected.constBegin(); it != selected.constEnd(); ++it) { + const QPoint &cell = *it; + selectionModel.select(model.index(cell.y(), cell.x()), QItemSelectionModel::Select); + } + + tableView->setModel(QVariant::fromValue(&model)); + tableView->setSelectionModel(&selectionModel); + + WAIT_UNTIL_POLISHED; + + // Check that all delegates have "selected" set with the initial value + for (auto fxItem : tableViewPrivate->loadedItems) { + const auto context = qmlContext(fxItem->item.data()); + const int row = context->contextProperty("row").toInt(); + const int column = context->contextProperty("column").toInt(); + const bool selected = fxItem->item->property("selected").toBool(); + const auto modelIndex = model.index(row, column); + QCOMPARE(selected, selectionModel.isSelected(modelIndex)); + } + + // Toggle selected on one of the model indices, and check + // that the "selected" property got updated as well + const QModelIndex toggleIndex = model.index(toggle.y(), toggle.x()); + const bool wasSelected = selectionModel.isSelected(toggleIndex); + selectionModel.select(toggleIndex, QItemSelectionModel::Toggle); + const auto fxItem = tableViewPrivate->loadedTableItem(toggle); + const bool isSelected = fxItem->item->property("selected").toBool(); + QCOMPARE(isSelected, !wasSelected); +} + +void tst_QQuickTableView::checkSelectionModelWithUnrequiredSelectedProperty() +{ + // Check that if there is a property "selected" in the delegate, but it's + // not required, then TableView will not touch it. This is for legacy reasons, to + // not break applications written before Qt 6.2 that has such a property + // added for application logic. + LOAD_TABLEVIEW("tableviewwithselected2.qml"); + + TestModel model(10, 10); + tableView->setModel(QVariant::fromValue(&model)); + QItemSelectionModel *selectionModel = tableView->selectionModel(); + QVERIFY(selectionModel); + + // Select a cell + selectionModel->select(model.index(1, 1), QItemSelectionModel::Select); + + WAIT_UNTIL_POLISHED; + + const auto fxItem = tableViewPrivate->loadedTableItem(QPoint(1, 1)); + const bool selected = fxItem->item->property("selected").toBool(); + QCOMPARE(selected, false); +} + +void tst_QQuickTableView::removeAndAddSelectionModel() +{ + // Check that if we remove the selection model from TableView, all delegates + // will be unselected. And opposite, if we add the selection model back, the + // delegates will be updated. + LOAD_TABLEVIEW("tableviewwithselected1.qml"); + + TestModel model(10, 10); + QItemSelectionModel selectionModel(&model); + + // Select a cell in the selection model + selectionModel.select(model.index(1, 1), QItemSelectionModel::Select); + + tableView->setModel(QVariant::fromValue(&model)); + tableView->setSelectionModel(&selectionModel); + + WAIT_UNTIL_POLISHED; + + // Check that the delegate item is selected + const auto fxItem = tableViewPrivate->loadedTableItem(QPoint(1, 1)); + bool selected = fxItem->item->property("selected").toBool(); + QCOMPARE(selected, true); + + // Remove the selection model, and check that the delegate item is now unselected + tableView->setSelectionModel(nullptr); + selected = fxItem->item->property("selected").toBool(); + QCOMPARE(selected, false); + + // Add the selection model back, and check that the delegate item is selected again + tableView->setSelectionModel(&selectionModel); + selected = fxItem->item->property("selected").toBool(); + QCOMPARE(selected, true); +} + QTEST_MAIN(tst_QQuickTableView) #include "tst_qquicktableview.moc" |