┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews
diff options
context:
space:
mode:
authorFrank Reininghaus <[email protected]>2011-08-13 11:40:17 +0200
committerFrank Reininghaus <[email protected]>2011-08-13 11:51:38 +0200
commit58ab93541c70de4fa7cbb90dc3423cfec556dc38 (patch)
treeb38990f7546ee750fc9ea141ad97436c1d18f49f /src/kitemviews
parent9b83d15be44d698c26b55bf8cbc126321f5a4e9b (diff)
Implement selection of items using mouse clicks.
Diffstat (limited to 'src/kitemviews')
-rw-r--r--src/kitemviews/kitemlistcontroller.cpp43
-rw-r--r--src/kitemviews/kitemlistselectionmanager.cpp6
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)