X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/c68f1f6f8d6c24123c9c5df4d2e91a9d2462ceb6..86df5ae994e96483559020befd96b838aee4d3ee:/src/kitemviews/kitemlistcontroller.cpp diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 80c28f25c..ba4047dbe 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -13,10 +13,11 @@ #include "kitemlistview.h" #include "private/kitemlistkeyboardsearchmanager.h" #include "private/kitemlistrubberband.h" -#include "private/ktwofingerswipe.h" -#include "private/ktwofingertap.h" #include "views/draganddrophelper.h" +#include +#include + #include #include #include @@ -871,7 +872,8 @@ bool KItemListController::hoverMoveEvent(QGraphicsSceneHoverEvent* event, const newHoveredWidget->setExpansionAreaHovered(true); } else { // make sure we unhover the old one first if old!=new - if (auto oldHoveredWidget = hoveredWidget(); oldHoveredWidget && oldHoveredWidget != newHoveredWidget) { + auto oldHoveredWidget = hoveredWidget(); + if (oldHoveredWidget && oldHoveredWidget != newHoveredWidget) { oldHoveredWidget->setHovered(false); Q_EMIT itemUnhovered(oldHoveredWidget->index()); } @@ -888,9 +890,11 @@ bool KItemListController::hoverMoveEvent(QGraphicsSceneHoverEvent* event, const // (no-op in this branch for masked hover) } else { - newHoveredWidget->setHovered(true); newHoveredWidget->setHoverPosition(mappedPos); - Q_EMIT itemHovered(newHoveredWidget->index()); + if (oldHoveredWidget != newHoveredWidget) { + newHoveredWidget->setHovered(true); + Q_EMIT itemHovered(newHoveredWidget->index()); + } } } } else { @@ -1521,6 +1525,12 @@ bool KItemListController::onPress(const QPoint& screenPos, const QPointF& pos, c // and short-circuit for single-click activation (it will then propagate to onRelease and activate the item) // or we just keep going for double-click activation if (m_view->style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick) || m_singleClickActivationEnforced) { + if (!pressedItemAlreadySelected) { + // An unselected item was clicked directly while deselecting multiple other items so we select it. + m_selectionManager->setSelected(m_pressedIndex.value(), 1, KItemListSelectionManager::Toggle); + m_selectionManager->setCurrentItem(m_pressedIndex.value()); + m_selectionManager->beginAnchoredSelection(m_pressedIndex.value()); + } return true; // event handled, don't create rubber band } } else { @@ -1591,9 +1601,20 @@ bool KItemListController::onPress(const QPoint& screenPos, const QPointF& pos, c case MultiSelection: if (controlPressed && !shiftPressed) { - m_selectionManager->setSelected(m_pressedIndex.value(), 1, KItemListSelectionManager::Toggle); - m_selectionManager->beginAnchoredSelection(m_pressedIndex.value()); - createRubberBand = false; // multi selection, don't propagate any further + // A mouse button press is happening on an item while control is pressed. This either means a user wants to: + // - toggle the selection of item(s) or + // - they want to begin a drag on the item(s) to copy them. + // We rule out the latter, if the item is not clicked directly and was unselected previously. + const auto row = m_view->m_visibleItems.value(m_pressedIndex.value()); + const auto mappedPos = row->mapFromItem(m_view, pos); + if (!row->iconRect().contains(mappedPos) && !row->textRect().contains(mappedPos) && !pressedItemAlreadySelected) { + createRubberBand = true; + } else { + m_selectionManager->setSelected(m_pressedIndex.value(), 1, KItemListSelectionManager::Toggle); + m_selectionManager->beginAnchoredSelection(m_pressedIndex.value()); + createRubberBand = false; // multi selection, don't propagate any further + // This will be the start of an item drag-to-copy operation if the user now moves the mouse before releasing the mouse button. + } } else if (!shiftPressed || !m_selectionManager->isAnchoredSelectionActive()) { // Select the pressed item and start a new anchored selection m_selectionManager->setSelected(m_pressedIndex.value(), 1, KItemListSelectionManager::Select);