Browse Source

LibGUI: clicking and dragging one item will drag other items in selection

Previously if more than one item was selected clicking on one of
them and dragging would de-select everything that is not the one that
was clicked on. Now, if more than one items are selected and there
is a mousedown it goes into a "mightdrag" state.
The user can then perform a drag, if they don't everything that is not
the item being clicked gets unselected in the mouseup event, mimicking
the previous behavior.
Dov Alperin 5 years ago
parent
commit
518f469970
2 changed files with 10 additions and 0 deletions
  1. 8 0
      Libraries/LibGUI/GItemView.cpp
  2. 2 0
      Libraries/LibGUI/GItemView.h

+ 8 - 0
Libraries/LibGUI/GItemView.cpp

@@ -130,6 +130,8 @@ void GItemView::mousedown_event(GMouseEvent& event)
             auto index = model()->index(item_index, m_model_column);
             if (event.modifiers() & Mod_Ctrl)
                 selection().toggle(index);
+            else if (selection().size() > 1)
+                m_might_drag = true;
             else
                 selection().set(index);
         }
@@ -146,6 +148,12 @@ void GItemView::mouseup_event(GMouseEvent& event)
         update();
         return;
     }
+    int item_index = item_at_event_position(event.position());
+    auto index = model()->index(item_index, m_model_column);
+    if((selection().size() > 1) & m_might_drag) {
+        selection().set(index);
+        m_might_drag = false;
+    }
     GAbstractView::mouseup_event(event);
 }
 

+ 2 - 0
Libraries/LibGUI/GItemView.h

@@ -48,6 +48,8 @@ private:
     int m_visual_column_count { 0 };
     int m_visual_row_count { 0 };
 
+    bool m_might_drag { false };
+
     Point m_left_mousedown_position;
 
     Size m_effective_item_size { 80, 80 };