┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews/kitemlistcontroller.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kitemviews/kitemlistcontroller.cpp')
-rw-r--r--src/kitemviews/kitemlistcontroller.cpp37
1 files changed, 33 insertions, 4 deletions
diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp
index a9885f285..8b135fbb5 100644
--- a/src/kitemviews/kitemlistcontroller.cpp
+++ b/src/kitemviews/kitemlistcontroller.cpp
@@ -38,6 +38,7 @@
KItemListController::KItemListController(QObject* parent) :
QObject(parent),
+ m_selectionTogglePressed(false),
m_selectionBehavior(NoSelection),
m_model(0),
m_view(0),
@@ -274,10 +275,17 @@ bool KItemListController::mousePressEvent(QGraphicsSceneMouseEvent* event, const
m_pressedIndex = m_view->itemAt(m_pressedMousePos);
if (m_view->isAboveExpansionToggle(m_pressedIndex, m_pressedMousePos)) {
+ m_selectionTogglePressed = true;
m_selectionManager->setCurrentItem(m_pressedIndex);
return true;
}
+ m_selectionTogglePressed = m_view->isAboveSelectionToggle(m_pressedIndex, m_pressedMousePos);
+ if (m_selectionTogglePressed) {
+ m_selectionManager->setSelected(m_pressedIndex, 1, KItemListSelectionManager::Toggle);
+ return true;
+ }
+
const bool shiftPressed = event->modifiers() & Qt::ShiftModifier;
const bool controlPressed = event->modifiers() & Qt::ControlModifier;
@@ -375,6 +383,12 @@ bool KItemListController::mouseMoveEvent(QGraphicsSceneMouseEvent* event, const
if (event->buttons() & Qt::LeftButton) {
const QPointF pos = transform.map(event->pos());
if ((pos - m_pressedMousePos).manhattanLength() >= QApplication::startDragDistance()) {
+ if (!m_selectionManager->isSelected(m_pressedIndex)) {
+ // Always assure that the dragged item gets selected. Usually this is already
+ // done on the mouse-press event, but when using the selection-toggle on a
+ // selected item the dragged item is not selected yet.
+ m_selectionManager->setSelected(m_pressedIndex, 1, KItemListSelectionManager::Toggle);
+ }
startDragging();
}
}
@@ -405,6 +419,18 @@ bool KItemListController::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, con
return false;
}
+ const bool isAboveSelectionToggle = m_view->isAboveSelectionToggle(m_pressedIndex, m_pressedMousePos);
+ if (isAboveSelectionToggle) {
+ m_selectionTogglePressed = false;
+ return true;
+ }
+
+ if (!isAboveSelectionToggle && m_selectionTogglePressed) {
+ m_selectionManager->setSelected(m_pressedIndex, 1, KItemListSelectionManager::Toggle);
+ m_selectionTogglePressed = false;
+ return true;
+ }
+
const bool shiftOrControlPressed = event->modifiers() & Qt::ShiftModifier ||
event->modifiers() & Qt::ControlModifier;
@@ -465,8 +491,8 @@ bool KItemListController::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event,
const int index = m_view->itemAt(pos);
bool emitItemActivated = !KGlobalSettings::singleClick() &&
- (event->button() & Qt::LeftButton) &&
- index >= 0 && index < m_model->count();
+ (event->button() & Qt::LeftButton) &&
+ index >= 0 && index < m_model->count();
if (emitItemActivated) {
emit itemActivated(index);
}
@@ -749,6 +775,10 @@ void KItemListController::startDragging()
}
const QSet<int> selectedItems = m_selectionManager->selectedItems();
+ if (selectedItems.isEmpty()) {
+ return;
+ }
+
QMimeData* data = m_model->createMimeData(selectedItems);
if (!data) {
return;
@@ -786,8 +816,7 @@ KItemListWidget* KItemListController::widgetForPos(const QPointF& pos) const
const QPointF mappedPos = widget->mapFromItem(m_view, pos);
const bool hovered = widget->contains(mappedPos) &&
- !widget->expansionToggleRect().contains(mappedPos) &&
- !widget->selectionToggleRect().contains(mappedPos);
+ !widget->expansionToggleRect().contains(mappedPos);
if (hovered) {
return widget;
}