]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Implement selection of items using mouse clicks.
authorFrank Reininghaus <frank78ac@googlemail.com>
Sat, 13 Aug 2011 09:40:17 +0000 (11:40 +0200)
committerFrank Reininghaus <frank78ac@googlemail.com>
Sat, 13 Aug 2011 09:51:38 +0000 (11:51 +0200)
src/kitemviews/kitemlistcontroller.cpp
src/kitemviews/kitemlistselectionmanager.cpp
src/tests/kitemlistselectionmanagertest.cpp
src/views/dolphinview.cpp

index 79e42e413f96f0fbb33420a93e9c87f8b212770b..afa70e60c6cf4008f63437b668897822e8285534 100644 (file)
@@ -141,18 +141,51 @@ bool KItemListController::mousePressEvent(QGraphicsSceneMouseEvent* event, const
     const QPointF pos = transform.map(event->pos());
     m_pressedIndex = m_view->itemAt(pos);
 
-    const bool shiftOrControlPressed = event->modifiers() & Qt::ShiftModifier ||
-                                       event->modifiers() & Qt::ControlModifier;
-    if (!shiftOrControlPressed) {
+    if (m_view->isAboveExpansionToggle(m_pressedIndex, pos)) {
+        return true;
+    }
+
+    const bool shiftPressed = event->modifiers() & Qt::ShiftModifier;
+    const bool controlPressed = event->modifiers() & Qt::ControlModifier;
+    const bool shiftOrControlPressed = shiftPressed || controlPressed;
+
+    if (!shiftOrControlPressed || m_selectionBehavior == SingleSelection) {
         m_selectionManager->clearSelection();
-        m_selectionManager->setAnchorItem(m_pressedIndex);
+    }
+
+    if (!shiftPressed) {
+        // Finish the anchored selection before the current index is changed
+        m_selectionManager->endAnchoredSelection();
     }
 
     if (m_pressedIndex >= 0) {
         m_selectionManager->setCurrentItem(m_pressedIndex);
-        if (!m_view->isAboveExpansionToggle(m_pressedIndex, pos)) {
+
+        switch (m_selectionBehavior) {
+        case NoSelection:
+            return true;
+        case SingleSelection:
             m_selectionManager->setSelected(m_pressedIndex);
+            return true;
+        case MultiSelection:
+            if (controlPressed) {
+                m_selectionManager->setSelected(m_pressedIndex, 1, KItemListSelectionManager::Toggle);
+                m_selectionManager->beginAnchoredSelection(m_pressedIndex);
+            }
+            else {
+                if (shiftPressed && m_selectionManager->isAnchoredSelectionActive()) {
+                    // The anchored selection is continued automatically by calling
+                    // m_selectionManager->setCurrentItem(m_pressedIndex), see above -> nothing more to do here
+                    return true;
+                }
+
+                // Select the pressed item and start a new anchored selection
+                m_selectionManager->setSelected(m_pressedIndex, 1, KItemListSelectionManager::Select);
+                m_selectionManager->beginAnchoredSelection(m_pressedIndex);
+            }
         }
+
+        return true;
     }
 
     return false;
index e0ec4060cda4802aa8871aef813358318ec261e9..a03e8172c0832d4600f15c02028e5d8888114976 100644 (file)
@@ -161,16 +161,16 @@ void KItemListSelectionManager::beginAnchoredSelection(int anchor)
 
 void KItemListSelectionManager::endAnchoredSelection()
 {
-    if (m_isAnchoredSelectionActive) {
+    if (m_isAnchoredSelectionActive && (m_anchorItem != m_currentItem)) {
         const int from = qMin(m_anchorItem, m_currentItem);
         const int to = qMax(m_anchorItem, m_currentItem);
 
         for (int index = from; index <= to; index++) {
             m_selectedItems.insert(index);
         }
-
-        m_isAnchoredSelectionActive = false;
     }
+
+    m_isAnchoredSelectionActive = false;
 }
 
 void KItemListSelectionManager::setAnchorItem(int anchor)
index 3174a8b4d7b85483d3d29ea5cd4ca70b26ce68b6..7f79332a396692ef1065c67f18e1aaf408aa956f 100644 (file)
@@ -311,15 +311,16 @@ void KItemListSelectionManagerTest::testAnchoredSelection()
 }
 
 namespace {
-    enum ModelChangeType {
+    enum ChangeType {
         NoChange,
         InsertItems,
-        RemoveItems
+        RemoveItems,
+        EndAnchoredSelection
     };
 }
 
 Q_DECLARE_METATYPE(QSet<int>);
-Q_DECLARE_METATYPE(ModelChangeType);
+Q_DECLARE_METATYPE(ChangeType);
 Q_DECLARE_METATYPE(KItemRangeList);
 
 void KItemListSelectionManagerTest::testChangeSelection_data()
@@ -328,7 +329,7 @@ void KItemListSelectionManagerTest::testChangeSelection_data()
     QTest::addColumn<int>("anchor");
     QTest::addColumn<int>("current");
     QTest::addColumn<QSet<int> >("expectedSelection");
-    QTest::addColumn<ModelChangeType>("changeType");
+    QTest::addColumn<ChangeType>("changeType");
     QTest::addColumn<KItemRangeList>("changedItems");
     QTest::addColumn<QSet<int> >("finalSelection");
 
@@ -352,6 +353,13 @@ void KItemListSelectionManagerTest::testChangeSelection_data()
         << (QSet<int>() << 2 << 3 << 5 << 6)
         << RemoveItems << (KItemRangeList() << KItemRange(1, 1) << KItemRange(3, 1) << KItemRange(10, 5))
         << (QSet<int>() << 1 << 2 << 3 << 4);
+
+    QTest::newRow("Empty Anchored Selection")
+        << QSet<int>()
+        << 2 << 2
+        << QSet<int>()
+        << EndAnchoredSelection << KItemRangeList()
+        << QSet<int>();
 }
 
 void KItemListSelectionManagerTest::testChangeSelection()
@@ -360,7 +368,7 @@ void KItemListSelectionManagerTest::testChangeSelection()
     QFETCH(int, anchor);
     QFETCH(int, current);
     QFETCH(QSet<int> , expectedSelection);
-    QFETCH(ModelChangeType, changeType);
+    QFETCH(ChangeType, changeType);
     QFETCH(KItemRangeList, changedItems);
     QFETCH(QSet<int> , finalSelection);
 
@@ -411,6 +419,10 @@ void KItemListSelectionManagerTest::testChangeSelection()
     case RemoveItems:
         m_selectionManager->itemsRemoved(changedItems);
         break;
+    case EndAnchoredSelection:
+        m_selectionManager->endAnchoredSelection();
+        QVERIFY(!m_selectionManager->isAnchoredSelectionActive());
+        break;
     case NoChange:
         break;
     }
index 7076094b9e54cb5fededecc9f003be3f10cfd869..f429529de131406b0f01197f95a58db3ab8c8378 100644 (file)
@@ -163,6 +163,7 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) :
     m_container->setVisibleRoles(visibleRoles);
 
     KItemListController* controller = m_container->controller();
+    controller->setSelectionBehavior(KItemListController::MultiSelection);
     connect(controller, SIGNAL(itemClicked(int,Qt::MouseButton)),
             this, SLOT(slotItemClicked(int,Qt::MouseButton)));
     connect(controller, SIGNAL(itemExpansionToggleClicked(int)), this, SLOT(slotItemExpansionToggleClicked(int)));