]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Improve details mode ctrl-press rubberband creation
authorFelix Ernst <fe.a.ernst@gmail.com>
Mon, 4 Apr 2022 12:39:37 +0000 (12:39 +0000)
committerFelix Ernst <fe.a.ernst@gmail.com>
Mon, 4 Apr 2022 12:39:37 +0000 (12:39 +0000)
Since d3839617193e92463806580699caa595c892b8a6 dragging the
highlighted row of already selected items in the details view mode
will begin a drag operation of all selected items.

As a unintended side-effect of this change, dragging the row of a
previously unselected item while holding the control key would also
begin a drag operation.

After this commit, dragging the row of a previously unselected item
while holding the control key in details view mode will instead
create a rubberband. Ctrl-dragging the item's icon or text directly will drag the item as expected.

With this change, using multiple rubberbands to select scattered
items among a list of items should be as convenient as it was
previously.

BUG: 452181

src/kitemviews/kitemlistcontroller.cpp

index 9f54fad2cff68bee0a5c475cc3829a48e06d47c3..7ef37481d49d65c8994ba67691bbabfb40a3fe0c 100644 (file)
@@ -1600,9 +1600,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);