Serenity Operating System
at master 85 lines 2.9 kB view raw
1/* 2 * Copyright (c) 2018-2020, Andreas Kling <kling@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/HashMap.h> 11#include <LibGUI/AbstractTableView.h> 12 13namespace GUI { 14 15class TreeView : public AbstractTableView { 16 C_OBJECT(TreeView) 17public: 18 virtual ~TreeView() override = default; 19 20 virtual void scroll_into_view(ModelIndex const&, bool scroll_horizontally, bool scroll_vertically) override; 21 22 virtual int item_count() const override; 23 virtual void toggle_index(ModelIndex const&) override; 24 bool is_toggled(ModelIndex const& index); 25 26 void expand_tree(ModelIndex const& root = {}); 27 void collapse_tree(ModelIndex const& root = {}); 28 29 void expand_all_parents_of(ModelIndex const&); 30 31 Function<void(ModelIndex const&, bool const)> on_toggle; 32 33 void set_should_fill_selected_rows(bool fill) { m_should_fill_selected_rows = fill; } 34 bool should_fill_selected_rows() const { return m_should_fill_selected_rows; } 35 36 virtual int vertical_padding() const override { return m_vertical_padding; } 37 38 virtual Gfx::IntRect content_rect(ModelIndex const&) const override; 39 virtual Gfx::IntRect paint_invalidation_rect(ModelIndex const& index) const override { return content_rect(index); } 40 41 virtual int minimum_column_width(int column) override; 42 43protected: 44 TreeView(); 45 46 virtual void mousedown_event(MouseEvent&) override; 47 virtual void paint_event(PaintEvent&) override; 48 virtual void doubleclick_event(MouseEvent&) override; 49 virtual void keydown_event(KeyEvent&) override; 50 51 virtual void did_update_selection() override; 52 virtual void model_did_update(unsigned flags) override; 53 virtual void move_cursor(CursorMovement, SelectionUpdate) override; 54 55private: 56 virtual ModelIndex index_at_event_position(Gfx::IntPoint, bool& is_toggle) const override; 57 58 int max_item_width() const { return frame_inner_rect().width(); } 59 int indent_width_in_pixels() const { return 16; } 60 int icon_size() const { return 16; } 61 int icon_spacing() const { return 2; } 62 int toggle_size() const { return 9; } 63 int text_padding() const { return 2; } 64 int tree_column_x_offset() const; 65 virtual void update_column_sizes() override; 66 virtual void auto_resize_column(int column) override; 67 68 template<typename Callback> 69 void traverse_in_paint_order(Callback) const; 70 71 struct MetadataForIndex; 72 73 MetadataForIndex& ensure_metadata_for_index(ModelIndex const&) const; 74 void set_open_state_of_all_in_subtree(ModelIndex const& root, bool open); 75 76 mutable HashMap<ModelIndex, NonnullOwnPtr<MetadataForIndex>> m_view_metadata; 77 78 RefPtr<Gfx::Bitmap> m_expand_bitmap; 79 RefPtr<Gfx::Bitmap> m_collapse_bitmap; 80 81 bool m_should_fill_selected_rows { false }; 82 int m_vertical_padding { 6 }; 83}; 84 85}