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;
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)
}
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()
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");
<< (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()
QFETCH(int, anchor);
QFETCH(int, current);
QFETCH(QSet<int> , expectedSelection);
- QFETCH(ModelChangeType, changeType);
+ QFETCH(ChangeType, changeType);
QFETCH(KItemRangeList, changedItems);
QFETCH(QSet<int> , finalSelection);
case RemoveItems:
m_selectionManager->itemsRemoved(changedItems);
break;
+ case EndAnchoredSelection:
+ m_selectionManager->endAnchoredSelection();
+ QVERIFY(!m_selectionManager->isAnchoredSelectionActive());
+ break;
case NoChange:
break;
}
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)));