diff options
Diffstat (limited to 'tests/auto/quick/qquicktableview/tst_qquicktableview.cpp')
-rw-r--r-- | tests/auto/quick/qquicktableview/tst_qquicktableview.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
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" |