diff options
| author | Frank Reininghaus <[email protected]> | 2011-08-13 11:40:17 +0200 |
|---|---|---|
| committer | Frank Reininghaus <[email protected]> | 2011-08-13 11:51:38 +0200 |
| commit | 58ab93541c70de4fa7cbb90dc3423cfec556dc38 (patch) | |
| tree | b38990f7546ee750fc9ea141ad97436c1d18f49f | |
| parent | 9b83d15be44d698c26b55bf8cbc126321f5a4e9b (diff) | |
Implement selection of items using mouse clicks.
| -rw-r--r-- | src/kitemviews/kitemlistcontroller.cpp | 43 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistselectionmanager.cpp | 6 | ||||
| -rw-r--r-- | src/tests/kitemlistselectionmanagertest.cpp | 22 | ||||
| -rw-r--r-- | src/views/dolphinview.cpp | 1 |
4 files changed, 59 insertions, 13 deletions
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<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; } 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))); |
