From 35e3df7f131a51c218c7e71f385ad8bf6cfa597b Mon Sep 17 00:00:00 2001 From: Karol Kosek Date: Wed, 28 Dec 2022 00:36:34 +0100 Subject: [PATCH] LibGUI: Teach ColumnsView where indexes are placed (and scroll to them) This makes the view to scroll when pressing arrow keys! :^) --- Userland/Libraries/LibGUI/ColumnsView.cpp | 19 +++++++++++++++++++ Userland/Libraries/LibGUI/ColumnsView.h | 3 +++ 2 files changed, 22 insertions(+) diff --git a/Userland/Libraries/LibGUI/ColumnsView.cpp b/Userland/Libraries/LibGUI/ColumnsView.cpp index 380c2d4120..a4adb238f4 100644 --- a/Userland/Libraries/LibGUI/ColumnsView.cpp +++ b/Userland/Libraries/LibGUI/ColumnsView.cpp @@ -435,6 +435,25 @@ void ColumnsView::move_cursor(CursorMovement movement, SelectionUpdate selection set_cursor(new_index, selection_update); } +Gfx::IntRect ColumnsView::index_content_rect(ModelIndex const& index) +{ + int column_x = 0; + for (auto const& column : m_columns) { + if (column.parent_index == index.parent()) + return { column_x, index.row() * item_height(), column.width, item_height() }; + + column_x += column.width + column_separator_width(); + } + return {}; +} + +void ColumnsView::scroll_into_view(ModelIndex const& index, bool scroll_horizontally, bool scroll_vertically) +{ + if (!model()) + return; + AbstractScrollableWidget::scroll_into_view(index_content_rect(index), scroll_horizontally, scroll_vertically); +} + Gfx::IntRect ColumnsView::content_rect(ModelIndex const& index) const { if (!index.is_valid()) diff --git a/Userland/Libraries/LibGUI/ColumnsView.h b/Userland/Libraries/LibGUI/ColumnsView.h index 11710e5371..f9722d22e8 100644 --- a/Userland/Libraries/LibGUI/ColumnsView.h +++ b/Userland/Libraries/LibGUI/ColumnsView.h @@ -22,6 +22,8 @@ public: virtual Gfx::IntRect content_rect(ModelIndex const&) const override; virtual Gfx::IntRect paint_invalidation_rect(ModelIndex const&) const override; + virtual void scroll_into_view(ModelIndex const&, bool scroll_horizontally, bool scroll_vertically) override; + private: ColumnsView(); virtual ~ColumnsView() override = default; @@ -54,6 +56,7 @@ private: Optional column_at_event_position(Gfx::IntPoint) const; ModelIndex index_at_event_position_in_column(Gfx::IntPoint, Column const&) const; + Gfx::IntRect index_content_rect(ModelIndex const&); bool m_rubber_banding { false }; int m_rubber_band_origin { 0 };