┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFrank Reininghaus <[email protected]>2011-08-10 10:38:24 +0200
committerFrank Reininghaus <[email protected]>2011-08-10 10:38:24 +0200
commitbb80d1877a8474ed60d4d0d41c587347fb521c95 (patch)
tree9c58cc5ecef671f424402510fb74eabb6c61b5f0 /src
parent84aa4e75b492c74ce29fcadd572bee338f009b0b (diff)
Update the anchor item when items are added or removed
If items are added or removed in the model, not only the current item, but also the anchor item, which is the starting point for any selections via Shift+Click or Shift+Key, needs to be updated. BUG: 262638 FIXED-IN: 4.8.0
Diffstat (limited to 'src')
-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()