┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/kitemviews/kitemlistselectionmanager.cpp30
-rw-r--r--src/tests/kitemlistselectionmanagertest.cpp36
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()