diff options
Diffstat (limited to 'src/kitemviews')
| -rw-r--r-- | src/kitemviews/kitemlistcontroller.cpp | 43 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistselectionmanager.cpp | 6 |
2 files changed, 41 insertions, 8 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) |
