mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-12 12:54:29 +00:00
Do not change the selection when re-sorting the view
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
This commit is contained in:
parent
272cbbd16b
commit
b5ca0e2de9
|
@ -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()) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue