From: Frank Reininghaus Date: Sat, 13 Aug 2011 09:40:17 +0000 (+0200) Subject: Implement selection of items using mouse clicks. X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/58ab93541c70de4fa7cbb90dc3423cfec556dc38?ds=inline Implement selection of items using mouse clicks. --- diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 79e42e413..afa70e60c 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -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; diff --git a/src/kitemviews/kitemlistselectionmanager.cpp b/src/kitemviews/kitemlistselectionmanager.cpp index e0ec4060c..a03e8172c 100644 --- a/src/kitemviews/kitemlistselectionmanager.cpp +++ b/src/kitemviews/kitemlistselectionmanager.cpp @@ -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) diff --git a/src/tests/kitemlistselectionmanagertest.cpp b/src/tests/kitemlistselectionmanagertest.cpp index 3174a8b4d..7f79332a3 100644 --- a/src/tests/kitemlistselectionmanagertest.cpp +++ b/src/tests/kitemlistselectionmanagertest.cpp @@ -311,15 +311,16 @@ void KItemListSelectionManagerTest::testAnchoredSelection() } namespace { - enum ModelChangeType { + enum ChangeType { NoChange, InsertItems, - RemoveItems + RemoveItems, + EndAnchoredSelection }; } Q_DECLARE_METATYPE(QSet); -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("anchor"); QTest::addColumn("current"); QTest::addColumn >("expectedSelection"); - QTest::addColumn("changeType"); + QTest::addColumn("changeType"); QTest::addColumn("changedItems"); QTest::addColumn >("finalSelection"); @@ -352,6 +353,13 @@ void KItemListSelectionManagerTest::testChangeSelection_data() << (QSet() << 2 << 3 << 5 << 6) << RemoveItems << (KItemRangeList() << KItemRange(1, 1) << KItemRange(3, 1) << KItemRange(10, 5)) << (QSet() << 1 << 2 << 3 << 4); + + QTest::newRow("Empty Anchored Selection") + << QSet() + << 2 << 2 + << QSet() + << EndAnchoredSelection << KItemRangeList() + << QSet(); } void KItemListSelectionManagerTest::testChangeSelection() @@ -360,7 +368,7 @@ void KItemListSelectionManagerTest::testChangeSelection() QFETCH(int, anchor); QFETCH(int, current); QFETCH(QSet , expectedSelection); - QFETCH(ModelChangeType, changeType); + QFETCH(ChangeType, changeType); QFETCH(KItemRangeList, changedItems); QFETCH(QSet , 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; } diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index 7076094b9..f429529de 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -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)));