Преглед на файлове

LibGUI: Add GListView::index_at_event_position()

And port GListView::mousedown_event() to it.
Sergey Bugaev преди 5 години
родител
ревизия
2ccad40a16
променени са 2 файла, в които са добавени 20 реда и са изтрити 9 реда
  1. 18 8
      Libraries/LibGUI/GListView.cpp
  2. 2 1
      Libraries/LibGUI/GListView.h

+ 18 - 8
Libraries/LibGUI/GListView.cpp

@@ -84,7 +84,20 @@ Rect GListView::content_rect(const GModelIndex& index) const
     return content_rect(index.row());
 }
 
-Point GListView::adjusted_position(const Point& position)
+GModelIndex GListView::index_at_event_position(const Point& point) const
+{
+    ASSERT(model());
+
+    auto adjusted_position = this->adjusted_position(point);
+    for (int row = 0, row_count = model()->row_count(); row < row_count; ++row) {
+        if (!content_rect(row).contains(adjusted_position))
+            continue;
+        return model()->index(row, m_model_column);
+    }
+    return {};
+}
+
+Point GListView::adjusted_position(const Point& position) const
 {
     return position.translated(horizontal_scrollbar().value() - frame_thickness(), vertical_scrollbar().value() - frame_thickness());
 }
@@ -97,18 +110,15 @@ void GListView::mousedown_event(GMouseEvent& event)
     if (event.button() != GMouseButton::Left)
         return;
 
-    auto adjusted_position = this->adjusted_position(event.position());
-    for (int row = 0, row_count = model()->row_count(); row < row_count; ++row) {
-        if (!content_rect(row).contains(adjusted_position))
-            continue;
-        auto index = model()->index(row, m_model_column);
+    auto index = index_at_event_position(event.position());
+    if (index.is_valid()) {
         if (event.modifiers() & Mod_Ctrl)
             selection().toggle(index);
         else
             selection().set(index);
-        return;
+    } else {
+        selection().clear();
     }
-    selection().clear();
 }
 
 void GListView::paint_event(GPaintEvent& event)

+ 2 - 1
Libraries/LibGUI/GListView.h

@@ -49,8 +49,9 @@ public:
 
     void scroll_into_view(const GModelIndex&, Orientation);
 
-    Point adjusted_position(const Point&);
+    Point adjusted_position(const Point&) const;
 
+    GModelIndex index_at_event_position(const Point&) const;
     virtual Rect content_rect(const GModelIndex&) const override;
 
     int model_column() const { return m_model_column; }