┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
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
parent9b83d15be44d698c26b55bf8cbc126321f5a4e9b (diff)
Implement selection of items using mouse clicks.
Diffstat (limited to 'src')
-rw-r--r--src/kitemviews/kitemlistcontroller.cpp43
-rw-r--r--src/kitemviews/kitemlistselectionmanager.cpp6
-rw-r--r--src/tests/kitemlistselectionmanagertest.cpp22
-rw-r--r--src/views/dolphinview.cpp1
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)));