mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-20 00:41:23 +00:00
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
This commit is contained in:
parent
84aa4e75b4
commit
bb80d1877a
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in a new issue