// Store the current selection (needed in the selectionChanged() signal)
const KItemSet previousSelection = selectedItems();
+ // endAnchoredSelection() adds all items between m_currentItem and
+ // m_anchorItem to m_selectedItems. They can then be moved
+ // individually later in this function.
+ endAnchoredSelection();
+
// Update the current item
if (m_currentItem >= itemRange.index && m_currentItem < itemRange.index + itemRange.count) {
const int previousCurrentItem = m_currentItem;
emit currentChanged(newCurrentItem, previousCurrentItem);
}
- // Update the anchor item
- if (m_anchorItem >= itemRange.index && m_anchorItem < itemRange.index + itemRange.count) {
- m_anchorItem = movedToIndexes.at(m_anchorItem - itemRange.index);
- }
+ // Start a new anchored selection.
+ beginAnchoredSelection(m_currentItem);
// Update the selections
if (!m_selectedItems.isEmpty()) {
void testChangeSelection();
void testDeleteCurrentItem_data();
void testDeleteCurrentItem();
+ void testAnchoredSelectionAfterMovingItems();
private:
void verifySelectionChange(QSignalSpy& spy, const KItemSet& currentSelection, const KItemSet& previousSelection) const;
<< QVariant::fromValue(QList<int>() << 4 << 5 << 2 << 3))
<< (KItemSet() << 0 << 1 << 4 << 5);
+ QTest::newRow("Move items with active anchored selection")
+ << KItemSet()
+ << 0 << 3
+ << (KItemSet() << 0 << 1 << 2 << 3)
+ << MoveItems
+ << (QList<QVariant>() << QVariant::fromValue(KItemRange(2, 4))
+ << QVariant::fromValue(QList<int>() << 4 << 5 << 2 << 3))
+ << (KItemSet() << 0 << 1 << 4 << 5);
+
// Revert sort order
QTest::newRow("Revert sort order")
<< (KItemSet() << 0 << 1)
QCOMPARE(m_selectionManager->currentItem(), newCurrentItemIndex);
}
+void KItemListSelectionManagerTest::testAnchoredSelectionAfterMovingItems()
+{
+ m_selectionManager->setCurrentItem(4);
+ m_selectionManager->beginAnchoredSelection(4);
+
+ // Reverse the items between 0 and 5.
+ m_selectionManager->itemsMoved(KItemRange(0, 6), QList<int>() << 5 << 4 << 3 << 2 << 1 << 0);
+
+ QCOMPARE(m_selectionManager->currentItem(), 1);
+ QCOMPARE(m_selectionManager->m_anchorItem, 1);
+
+ // Make 2 the current item -> 1 and 2 should be selected.
+ m_selectionManager->setCurrentItem(2);
+ QCOMPARE(m_selectionManager->selectedItems(), KItemSet() << 1 << 2);
+}
+
void KItemListSelectionManagerTest::verifySelectionChange(QSignalSpy& spy,
const KItemSet& currentSelection,
const KItemSet& previousSelection) const