Browse Source

LibGUI: Properly handle range selections in ColumnsView

Previously we would always select the left most column when selecting a
range of rows.

This patch fixes this issue by always applying a selection to the column
in which the selection ends.
networkException 3 năm trước cách đây
mục cha
commit
2d681279d4

+ 14 - 0
Userland/Libraries/LibGUI/ColumnsView.cpp

@@ -234,6 +234,20 @@ ModelIndex ColumnsView::index_at_event_position(Gfx::IntPoint const& a_position)
     return {};
     return {};
 }
 }
 
 
+void ColumnsView::select_range(ModelIndex const& index)
+{
+    auto min_row = min(selection_start_index().row(), index.row());
+    auto max_row = max(selection_start_index().row(), index.row());
+    auto parent = index.parent();
+
+    clear_selection();
+    for (auto row = min_row; row <= max_row; ++row) {
+        auto new_index = model()->index(row, m_model_column, parent);
+        if (new_index.is_valid())
+            toggle_selection(new_index);
+    }
+}
+
 void ColumnsView::mousedown_event(MouseEvent& event)
 void ColumnsView::mousedown_event(MouseEvent& event)
 {
 {
     AbstractView::mousedown_event(event);
     AbstractView::mousedown_event(event);

+ 2 - 0
Userland/Libraries/LibGUI/ColumnsView.h

@@ -37,6 +37,8 @@ private:
     virtual void paint_event(PaintEvent&) override;
     virtual void paint_event(PaintEvent&) override;
     virtual void mousedown_event(MouseEvent& event) override;
     virtual void mousedown_event(MouseEvent& event) override;
 
 
+    virtual void select_range(ModelIndex const&) override;
+
     void move_cursor(CursorMovement, SelectionUpdate) override;
     void move_cursor(CursorMovement, SelectionUpdate) override;
 
 
     virtual void select_all() override;
     virtual void select_all() override;