diff options
| -rw-r--r-- | src/kitemviews/kitemlistselectionmanager.cpp | 30 | ||||
| -rw-r--r-- | src/tests/kitemlistselectionmanagertest.cpp | 36 |
2 files changed, 66 insertions, 0 deletions
diff --git a/src/kitemviews/kitemlistselectionmanager.cpp b/src/kitemviews/kitemlistselectionmanager.cpp index ee8ba929e..cdc6dbc7d 100644 --- a/src/kitemviews/kitemlistselectionmanager.cpp +++ b/src/kitemviews/kitemlistselectionmanager.cpp @@ -187,6 +187,20 @@ void KItemListSelectionManager::itemsInserted(const KItemRangeList& itemRanges) setCurrentItem(m_currentItem + inc); } + // Update the anchor item + if (m_anchorItem < 0) { + setAnchorItem(0); + } else { + int inc = 0; + foreach (const KItemRange& itemRange, itemRanges) { + if (m_anchorItem < itemRange.index) { + break; + } + inc += itemRange.count; + } + setAnchorItem(m_anchorItem + inc); + } + // Update the selections if (!m_selectedItems.isEmpty()) { const QSet<int> previous = m_selectedItems; @@ -231,6 +245,22 @@ void KItemListSelectionManager::itemsRemoved(const KItemRangeList& itemRanges) setCurrentItem(currentItem); } + // Update the anchor item + if (m_anchorItem >= 0) { + int anchorItem = m_anchorItem; + foreach (const KItemRange& itemRange, itemRanges) { + if (anchorItem < itemRange.index) { + break; + } + if (anchorItem >= itemRange.index + itemRange.count) { + anchorItem -= itemRange.count; + } else if (anchorItem >= m_model->count()) { + anchorItem = m_model->count() - 1; + } + } + setAnchorItem(anchorItem); + } + // Update the selections if (!m_selectedItems.isEmpty()) { const QSet<int> previous = m_selectedItems; diff --git a/src/tests/kitemlistselectionmanagertest.cpp b/src/tests/kitemlistselectionmanagertest.cpp index 3d0c318ff..6b0059a5c 100644 --- a/src/tests/kitemlistselectionmanagertest.cpp +++ b/src/tests/kitemlistselectionmanagertest.cpp @@ -121,6 +121,42 @@ void KItemListSelectionManagerTest::testCurrentItemAnchorItem() QCOMPARE(qvariant_cast<int>(spyAnchor.at(0).at(0)), 5); QCOMPARE(qvariant_cast<int>(spyAnchor.at(0).at(1)), 3); spyAnchor.takeFirst(); + + // Inserting items should update current item and anchor item. + m_selectionManager->itemsInserted(KItemRangeList() << + KItemRange(0, 1) << + KItemRange(2, 2) << + KItemRange(6, 3)); + + QCOMPARE(m_selectionManager->currentItem(), 5); + QCOMPARE(spyCurrent.count(), 1); + QCOMPARE(qvariant_cast<int>(spyCurrent.at(0).at(0)), 5); + QCOMPARE(qvariant_cast<int>(spyCurrent.at(0).at(1)), 2); + spyCurrent.takeFirst(); + + QCOMPARE(m_selectionManager->anchorItem(), 8); + QCOMPARE(spyAnchor.count(), 1); + QCOMPARE(qvariant_cast<int>(spyAnchor.at(0).at(0)), 8); + QCOMPARE(qvariant_cast<int>(spyAnchor.at(0).at(1)), 5); + spyAnchor.takeFirst(); + + // Removing items should update current item and anchor item. + m_selectionManager->itemsRemoved(KItemRangeList() << + KItemRange(0, 2) << + KItemRange(2, 1) << + KItemRange(9, 2)); + + QCOMPARE(m_selectionManager->currentItem(), 2); + QCOMPARE(spyCurrent.count(), 1); + QCOMPARE(qvariant_cast<int>(spyCurrent.at(0).at(0)), 2); + QCOMPARE(qvariant_cast<int>(spyCurrent.at(0).at(1)), 5); + spyCurrent.takeFirst(); + + QCOMPARE(m_selectionManager->anchorItem(), 5); + QCOMPARE(spyAnchor.count(), 1); + QCOMPARE(qvariant_cast<int>(spyAnchor.at(0).at(0)), 5); + QCOMPARE(qvariant_cast<int>(spyAnchor.at(0).at(1)), 8); + spyAnchor.takeFirst(); } void KItemListSelectionManagerTest::testSetSelected_data() |
