Serenity Operating System
at master 70 lines 2.3 kB view raw
1/* 2 * Copyright (c) 2020, Sergey Bugaev <bugaevc@serenityos.org> 3 * Copyright (c) 2022, the SerenityOS developers. 4 * 5 * SPDX-License-Identifier: BSD-2-Clause 6 */ 7 8#pragma once 9 10#include <AK/Vector.h> 11#include <LibGUI/AbstractView.h> 12 13namespace GUI { 14 15class ColumnsView : public AbstractView { 16 C_OBJECT(ColumnsView) 17public: 18 int model_column() const { return m_model_column; } 19 void set_model_column(int column) { m_model_column = column; } 20 21 virtual ModelIndex index_at_event_position(Gfx::IntPoint) const override; 22 virtual Gfx::IntRect content_rect(ModelIndex const&) const override; 23 virtual Gfx::IntRect paint_invalidation_rect(ModelIndex const&) const override; 24 25 virtual void scroll_into_view(ModelIndex const&, bool scroll_horizontally, bool scroll_vertically) override; 26 27private: 28 ColumnsView(); 29 virtual ~ColumnsView() override = default; 30 void push_column(ModelIndex const& parent_index); 31 void update_column_sizes(); 32 33 int item_height() const { return 18; } 34 int icon_size() const { return 16; } 35 int icon_spacing() const { return 2; } 36 int text_padding() const { return 2; } 37 int column_separator_width() const { return 1; } 38 39 virtual void model_did_update(unsigned flags) override; 40 virtual void second_paint_event(PaintEvent&) override; 41 virtual void paint_event(PaintEvent&) override; 42 virtual void mousedown_event(MouseEvent& event) override; 43 virtual void mousemove_event(MouseEvent&) override; 44 virtual void mouseup_event(MouseEvent&) override; 45 46 virtual void select_range(ModelIndex const&) override; 47 48 void move_cursor(CursorMovement, SelectionUpdate) override; 49 50 virtual void select_all() override; 51 struct Column { 52 ModelIndex parent_index; 53 int width; 54 // TODO: per-column vertical scroll? 55 }; 56 57 Optional<Column> column_at_event_position(Gfx::IntPoint) const; 58 ModelIndex index_at_event_position_in_column(Gfx::IntPoint, Column const&) const; 59 Gfx::IntRect index_content_rect(ModelIndex const&); 60 61 bool m_rubber_banding { false }; 62 int m_rubber_band_origin { 0 }; 63 Column m_rubber_band_origin_column; 64 int m_rubber_band_current { 0 }; 65 66 Vector<Column> m_columns; 67 int m_model_column { 0 }; 68}; 69 70}