┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEmmanuel Pescosta <[email protected]>2013-01-14 20:01:03 +0100
committerEmmanuel Pescosta <[email protected]>2013-01-14 20:01:03 +0100
commit256792355d01485eb148f8fb50f92e1c276cb769 (patch)
tree314ccae77ef59e9990359cccce5c69e1ec7da552 /src
parentdde672ac944af64d09cbd90dffc3d513ffe0c2b7 (diff)
Select right item as current item (first item after the deletion) after deleting files
BUG: 290736 REVIEW: 108356 FIXED-IN: 4.10
Diffstat (limited to 'src')
-rw-r--r--src/kitemviews/kitemlistselectionmanager.cpp42
-rw-r--r--src/kitemviews/kitemlistselectionmanager.h7
-rw-r--r--src/tests/kitemlistselectionmanagertest.cpp2
3 files changed, 30 insertions, 21 deletions
diff --git a/src/kitemviews/kitemlistselectionmanager.cpp b/src/kitemviews/kitemlistselectionmanager.cpp
index 383914df0..833f7aad0 100644
--- a/src/kitemviews/kitemlistselectionmanager.cpp
+++ b/src/kitemviews/kitemlistselectionmanager.cpp
@@ -284,27 +284,23 @@ void KItemListSelectionManager::itemsRemoved(const KItemRangeList& itemRanges)
{
// Store the current selection (needed in the selectionChanged() signal)
const QSet<int> previousSelection = selectedItems();
+ const int previousCurrent = m_currentItem;
// Update the current item
- if (m_currentItem >= 0) {
- const int previousCurrent = m_currentItem;
- // Calling setCurrentItem() would trigger the selectionChanged signal, but we want to
- // emit it only once in this function -> change the current item manually and emit currentChanged
- m_currentItem = indexAfterRangesRemoving(m_currentItem, itemRanges);
- if (m_currentItem != previousCurrent) {
- emit currentChanged(m_currentItem, previousCurrent);
- }
-
+ m_currentItem = indexAfterRangesRemoving(m_currentItem, itemRanges, DiscardRemovedIndex);
+ if (m_currentItem != previousCurrent) {
+ emit currentChanged(m_currentItem, previousCurrent);
if (m_currentItem < 0) {
- // The current item has been removed.
- m_currentItem = qMin(previousCurrent, m_model->count() - 1);
+ // Calling setCurrentItem() would trigger the selectionChanged signal, but we want to
+ // emit it only once in this function -> change the current item manually and emit currentChanged
+ m_currentItem = indexAfterRangesRemoving(previousCurrent, itemRanges, AdjustRemovedIndex);
emit currentChanged(m_currentItem, -1);
}
}
// Update the anchor item
if (m_anchorItem >= 0) {
- m_anchorItem = indexAfterRangesRemoving(m_anchorItem, itemRanges);
+ m_anchorItem = indexAfterRangesRemoving(m_anchorItem, itemRanges, DiscardRemovedIndex);
if (m_anchorItem < 0) {
m_isAnchoredSelectionActive = false;
}
@@ -317,7 +313,7 @@ void KItemListSelectionManager::itemsRemoved(const KItemRangeList& itemRanges)
m_selectedItems.reserve(previous.count());
QSetIterator<int> it(previous);
while (it.hasNext()) {
- const int index = indexAfterRangesRemoving(it.next(), itemRanges);
+ const int index = indexAfterRangesRemoving(it.next(), itemRanges, DiscardRemovedIndex);
if (index >= 0) {
m_selectedItems.insert(index);
}
@@ -377,7 +373,8 @@ void KItemListSelectionManager::itemsMoved(const KItemRange& itemRange, const QL
}
}
-int KItemListSelectionManager::indexAfterRangesRemoving(int index, const KItemRangeList& itemRanges) const
+int KItemListSelectionManager::indexAfterRangesRemoving(int index, const KItemRangeList& itemRanges,
+ const RangesRemovingBehaviour behaviour) const
{
int dec = 0;
foreach (const KItemRange& itemRange, itemRanges) {
@@ -385,13 +382,20 @@ int KItemListSelectionManager::indexAfterRangesRemoving(int index, const KItemRa
break;
}
- if (index < itemRange.index + itemRange.count) {
+ dec += itemRange.count;
+
+ const int firstIndexAfterRange = itemRange.index + itemRange.count;
+ if (index < firstIndexAfterRange) {
// The index is part of the removed range
- return -1;
+ if (behaviour == DiscardRemovedIndex) {
+ return -1;
+ } else {
+ // Use the first item after the range as new index
+ index = firstIndexAfterRange;
+ break;
+ }
}
-
- dec += itemRange.count;
}
- return index - dec;
+ return qBound(-1, index - dec, m_model->count() - 1);
}
#include "kitemlistselectionmanager.moc"
diff --git a/src/kitemviews/kitemlistselectionmanager.h b/src/kitemviews/kitemlistselectionmanager.h
index 43d0dcb80..c89b8a4b8 100644
--- a/src/kitemviews/kitemlistselectionmanager.h
+++ b/src/kitemviews/kitemlistselectionmanager.h
@@ -39,6 +39,11 @@ class LIBDOLPHINPRIVATE_EXPORT KItemListSelectionManager : public QObject
{
Q_OBJECT
+ enum RangesRemovingBehaviour {
+ DiscardRemovedIndex,
+ AdjustRemovedIndex
+ };
+
public:
enum SelectionMode {
Select,
@@ -81,7 +86,7 @@ private:
* Helper method for itemsRemoved. Returns the changed index after removing
* the given range. If the index is part of the range, -1 will be returned.
*/
- int indexAfterRangesRemoving(int index, const KItemRangeList& itemRanges) const;
+ int indexAfterRangesRemoving(int index, const KItemRangeList& itemRanges, const RangesRemovingBehaviour behaviour) const;
private:
int m_currentItem;
diff --git a/src/tests/kitemlistselectionmanagertest.cpp b/src/tests/kitemlistselectionmanagertest.cpp
index 3a8400930..302985a5f 100644
--- a/src/tests/kitemlistselectionmanagertest.cpp
+++ b/src/tests/kitemlistselectionmanagertest.cpp
@@ -499,7 +499,7 @@ void KItemListSelectionManagerTest::testDeleteCurrentItem_data()
QTest::newRow("Remove before") << 50 << 0 << 10 << 40;
QTest::newRow("Remove after") << 50 << 51 << 10 << 50;
QTest::newRow("Remove exactly current item") << 50 << 50 << 1 << 50;
- QTest::newRow("Remove around current item") << 50 << 45 << 10 << 50;
+ QTest::newRow("Remove around current item") << 50 << 45 << 10 << 45;
QTest::newRow("Remove all except one item") << 50 << 1 << 99 << 0;
}