Blender V4.5
UI_grid_view.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
11
12#pragma once
13
14#include <optional>
15
16#include "BLI_function_ref.hh"
17#include "BLI_map.hh"
18#include "BLI_vector.hh"
19
20#include "UI_abstract_view.hh"
21#include "UI_resources.hh"
22
23struct bContext;
24struct uiBlock;
25struct uiLayout;
26struct View2D;
27
28namespace blender::ui {
29
32
33/* ---------------------------------------------------------------------- */
36
38 friend class AbstractGridView;
40
41 protected:
47 std::string identifier_{};
48
49 public:
50 /* virtual */ ~AbstractGridViewItem() override = default;
51
52 virtual void build_grid_tile(const bContext &C, uiLayout &layout) const = 0;
53
54 /* virtual */ std::optional<std::string> debug_name() const override;
55
57
58 protected:
60
62 /* virtual */ bool matches(const AbstractViewItem &other) const override;
63
64 /* virtual */ std::unique_ptr<DropTargetInterface> create_item_drop_target() final;
66
67 private:
68 static void grid_tile_click_fn(bContext *, void *but_arg1, void *);
69 void add_grid_tile_button(uiBlock &block);
70};
71
73
74/* ---------------------------------------------------------------------- */
77
79 GridViewStyle(int width, int height);
80 int tile_width = 0;
81 int tile_height = 0;
82};
83
86 friend class GridViewBuilder;
88
89 protected:
92 mutable std::optional<int> item_count_filtered_;
97
98 public:
100 /* virtual */ ~AbstractGridView() override = default;
101
103 void foreach_item(ItemIterFn iter_fn) const;
104 void foreach_filtered_item(ItemIterFn iter_fn) const;
105
119 template<class ItemT, typename... Args> inline ItemT &add_item(Args &&...args);
120 const GridViewStyle &get_style() const;
121 int get_item_count() const;
122 int get_item_count_filtered() const;
123
124 void set_tile_size(int tile_width, int tile_height);
125
126 protected:
127 virtual void build_items() = 0;
128
129 private:
130 void foreach_view_item(FunctionRef<void(AbstractViewItem &)> iter_fn) const final;
131 void update_children_from_old(const AbstractView &old_view) override;
132 AbstractGridViewItem *find_matching_item(const AbstractGridViewItem &item_to_match,
133 const AbstractGridView &view_to_search_in) const;
134
139 AbstractGridViewItem &add_item(std::unique_ptr<AbstractGridViewItem> item);
140};
141
143
144/* ---------------------------------------------------------------------- */
147
154 protected:
156
157 public:
159
162 template<class ViewType> inline ViewType &get_view() const;
163};
164
166
167/* ---------------------------------------------------------------------- */
172
174 public:
175 GridViewBuilder(uiBlock &block);
176
177 void build_grid_view(const bContext &C,
178 AbstractGridView &grid_view,
179 uiLayout &layout,
180 std::optional<StringRef> search_string = {});
181};
182
184
185/* ---------------------------------------------------------------------- */
190
196 public:
197 using IsActiveFn = std::function<bool()>;
198 using ActivateFn = std::function<void(bContext &C, PreviewGridItem &new_active)>;
199
200 protected:
205 bool hide_label_ = false;
206
207 public:
208 std::string label;
209 int preview_icon_id = ICON_NONE;
210
212
213 void build_grid_tile(const bContext &C, uiLayout &layout) const override;
214
215 void build_grid_tile_button(uiLayout &layout,
216 BIFIconID override_preview_icon_id = ICON_NONE) const;
217
228
229 void hide_label();
230
231 private:
232 std::optional<bool> should_be_active() const override;
233 void on_activate(bContext &C) override;
234};
235
237
238/* ---------------------------------------------------------------------- */
239
240template<class ItemT, typename... Args> inline ItemT &AbstractGridView::add_item(Args &&...args)
241{
242 static_assert(std::is_base_of_v<AbstractGridViewItem, ItemT>,
243 "Type must derive from and implement the AbstractGridViewItem interface");
244
245 return dynamic_cast<ItemT &>(add_item(std::make_unique<ItemT>(std::forward<Args>(args)...)));
246}
247
248template<class ViewType> ViewType &GridViewItemDropTarget::get_view() const
249{
250 static_assert(std::is_base_of_v<AbstractGridView, ViewType>,
251 "Type must derive from and implement the ui::AbstractGridView interface");
252 return dynamic_cast<ViewType &>(view_);
253}
254
255} // namespace blender::ui
#define final(a, b, c)
Definition BLI_hash.h:19
int BIFIconID
Definition ED_asset.hh:29
static AppView * view
#define C
Definition RandGen.cpp:29
virtual void build_grid_tile(const bContext &C, uiLayout &layout) const =0
std::optional< std::string > debug_name() const override
Definition grid_view.cc:169
AbstractGridView & get_view() const
Definition grid_view.cc:174
virtual std::unique_ptr< GridViewItemDropTarget > create_drop_target()
Definition grid_view.cc:190
AbstractGridViewItem(StringRef identifier)
Definition grid_view.cc:132
std::unique_ptr< DropTargetInterface > create_item_drop_target() final
Definition grid_view.cc:185
~AbstractGridViewItem() override=default
bool matches(const AbstractViewItem &other) const override
Definition grid_view.cc:134
Map< StringRef, AbstractGridViewItem * > item_map_
ItemT & add_item(Args &&...args)
void set_tile_size(int tile_width, int tile_height)
Definition grid_view.cc:122
void foreach_filtered_item(ItemIterFn iter_fn) const
Definition grid_view.cc:65
FunctionRef< void(AbstractGridViewItem &)> ItemIterFn
void foreach_item(ItemIterFn iter_fn) const
Definition grid_view.cc:58
~AbstractGridView() override=default
std::optional< int > item_count_filtered_
const GridViewStyle & get_style() const
Definition grid_view.cc:98
virtual void build_items()=0
Vector< std::unique_ptr< AbstractGridViewItem > > items_
void build_grid_view(const bContext &C, AbstractGridView &grid_view, uiLayout &layout, std::optional< StringRef > search_string={})
Definition grid_view.cc:454
GridViewBuilder(uiBlock &block)
Definition grid_view.cc:452
GridViewItemDropTarget(AbstractGridView &view)
Definition grid_view.cc:195
PreviewGridItem(StringRef identifier, StringRef label, int preview_icon_id)
Definition grid_view.cc:478
void set_is_active_fn(IsActiveFn fn)
Definition grid_view.cc:524
void build_grid_tile_button(uiLayout &layout, BIFIconID override_preview_icon_id=ICON_NONE) const
Definition grid_view.cc:483
std::function< void(bContext &C, PreviewGridItem &new_active)> ActivateFn
void set_on_activate_fn(ActivateFn fn)
Definition grid_view.cc:519
std::function< bool()> IsActiveFn
void build_grid_tile(const bContext &C, uiLayout &layout) const override
Definition grid_view.cc:514
GridViewStyle(int width, int height)
Definition grid_view.cc:128