]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kitemlistcontroller.cpp
Merge branch 'release/22.04'
[dolphin.git] / src / kitemviews / kitemlistcontroller.cpp
index 80c28f25ca1d98647111da6ba8064390739670f5..ba4047dbe8c85661f50ec3a7e311b451f06872c2 100644 (file)
 #include "kitemlistview.h"
 #include "private/kitemlistkeyboardsearchmanager.h"
 #include "private/kitemlistrubberband.h"
-#include "private/ktwofingerswipe.h"
-#include "private/ktwofingertap.h"
 #include "views/draganddrophelper.h"
 
+#include <KTwoFingerSwipe>
+#include <KTwoFingerTap>
+
 #include <QAccessible>
 #include <QApplication>
 #include <QDrag>
@@ -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);