From c1df856d6b7fbbf3f21e294cdb481aeaec8110e4 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 10 Aug 2012 18:30:19 +0200 Subject: [PATCH] Make rowIntersectsSelection take account of the parent argument. Task-number: QTBUG-22370 Change-Id: I497194793eab624b760deea93dac0df767850330 Reviewed-by: Olivier Goffart --- src/corelib/itemmodels/qitemselectionmodel.cpp | 11 ++++++---- .../tst_qitemselectionmodel.cpp | 25 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/corelib/itemmodels/qitemselectionmodel.cpp b/src/corelib/itemmodels/qitemselectionmodel.cpp index 9cc9502..a7aa404 100644 --- a/src/corelib/itemmodels/qitemselectionmodel.cpp +++ b/src/corelib/itemmodels/qitemselectionmodel.cpp @@ -1379,10 +1379,13 @@ bool QItemSelectionModel::rowIntersectsSelection(int row, const QModelIndex &par QItemSelection sel = d->ranges; sel.merge(d->currentSelection, d->currentCommand); for (int i = 0; i < sel.count(); ++i) { - int top = sel.at(i).top(); - int bottom = sel.at(i).bottom(); - int left = sel.at(i).left(); - int right = sel.at(i).right(); + QItemSelectionRange range = sel.at(i); + if (range.parent() != parent) + return false; + int top = range.top(); + int bottom = range.bottom(); + int left = range.left(); + int right = range.right(); if (top <= row && bottom >= row) { for (int j = left; j <= right; j++) { const Qt::ItemFlags flags = d->model->index(row, j, parent).flags(); diff --git a/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp b/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp index 94a81b9..2a7180c 100644 --- a/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp +++ b/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp @@ -79,6 +79,7 @@ private slots: void splitOnInsert(); void rowIntersectsSelection1(); void rowIntersectsSelection2(); + void rowIntersectsSelection3(); void unselectable(); void selectedIndexes(); void layoutChanged(); @@ -2037,6 +2038,30 @@ void tst_QItemSelectionModel::rowIntersectsSelection2() QVERIFY(!selected.columnIntersectsSelection(5, QModelIndex())); } +void tst_QItemSelectionModel::rowIntersectsSelection3() +{ + QStandardItemModel model; + QStandardItem *parentItem = model.invisibleRootItem(); + for (int i = 0; i < 4; ++i) { + QStandardItem *item = new QStandardItem(QString("item %0").arg(i)); + parentItem->appendRow(item); + parentItem = item; + } + + QItemSelectionModel selectionModel(&model); + + selectionModel.select(model.index(0, 0, model.index(0, 0)), QItemSelectionModel::Select); + + QModelIndex parent; + QVERIFY(!selectionModel.rowIntersectsSelection(0, parent)); + parent = model.index(0, 0, parent); + QVERIFY(selectionModel.rowIntersectsSelection(0, parent)); + parent = model.index(0, 0, parent); + QVERIFY(!selectionModel.rowIntersectsSelection(0, parent)); + parent = model.index(0, 0, parent); + QVERIFY(!selectionModel.rowIntersectsSelection(0, parent)); +} + void tst_QItemSelectionModel::unselectable() { QTreeWidget w; -- 2.7.4