]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Do not change the selection when re-sorting the view
authorFrank Reininghaus <frank78ac@googlemail.com>
Sat, 26 Apr 2014 10:29:36 +0000 (12:29 +0200)
committerFrank Reininghaus <frank78ac@googlemail.com>
Sat, 26 Apr 2014 10:37:39 +0000 (12:37 +0200)
If a range of items has been selected by Shift-clicking or by pressing
Shift+Arrow, then each of them is added individually to the selection
before the items are re-sorted.

Before this commit, the first and the last item in the range were
moved, and all items between them were selected, even though these were
not necessarily the items which had been selected before the
re-sorting.

BUG: 333457
REVIEW: 117603
FIXED-IN: 4.13.1

src/kitemviews/kitemlistselectionmanager.cpp
src/tests/kitemlistselectionmanagertest.cpp

index ebff1a30ed4604db4759bd40e6d06cacabd450ba..1f0a89d063d4ad30e14c89eb936e951ada11c5d2 100644 (file)
@@ -331,6 +331,11 @@ void KItemListSelectionManager::itemsMoved(const KItemRange& itemRange, const QL
     // 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;
@@ -342,10 +347,8 @@ void KItemListSelectionManager::itemsMoved(const KItemRange& itemRange, const QL
         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()) {
index af2610d8c2248e172546c82bddfe1d2a931070f1..492d0234ff7d50a26a5cc91b65211cf6728d12ae 100644 (file)
@@ -78,6 +78,7 @@ private slots:
     void testChangeSelection();
     void testDeleteCurrentItem_data();
     void testDeleteCurrentItem();
+    void testAnchoredSelectionAfterMovingItems();
 
 private:
     void verifySelectionChange(QSignalSpy& spy, const KItemSet& currentSelection, const KItemSet& previousSelection) const;
@@ -413,6 +414,15 @@ void KItemListSelectionManagerTest::testChangeSelection_data()
                               << 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)
@@ -519,6 +529,22 @@ void KItemListSelectionManagerTest::testDeleteCurrentItem()
     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