Blender V5.0
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 void add_grid_tile_button(uiBlock &block);
69};
70
72
73/* ---------------------------------------------------------------------- */
76
78 GridViewStyle(int width, int height);
79 int tile_width = 0;
80 int tile_height = 0;
81};
82
85 friend class GridViewBuilder;
87
88 protected:
91 mutable std::optional<int> item_count_filtered_;
96
97 public:
99 /* virtual */ ~AbstractGridView() override = default;
100
102 void foreach_item(ItemIterFn iter_fn) const;
103 void foreach_filtered_item(ItemIterFn iter_fn) const;
104
118 template<class ItemT, typename... Args> inline ItemT &add_item(Args &&...args);
119 const GridViewStyle &get_style() const;
120 int get_item_count() const;
121 int get_item_count_filtered() const;
122
123 void set_tile_size(int tile_width, int tile_height);
124
125 protected:
126 virtual void build_items() = 0;
127
128 private:
129 void foreach_view_item(FunctionRef<void(AbstractViewItem &)> iter_fn) const final;
130 void update_children_from_old(const AbstractView &old_view) override;
131 AbstractGridViewItem *find_matching_item(const AbstractGridViewItem &item_to_match,
132 const AbstractGridView &view_to_search_in) const;
133
138 AbstractGridViewItem &add_item(std::unique_ptr<AbstractGridViewItem> item);
139};
140
142
143/* ---------------------------------------------------------------------- */
146
153 protected:
155
156 public:
158
161 template<class ViewType> inline ViewType &get_view() const;
162};
163
165
166/* ---------------------------------------------------------------------- */
171
173 public:
174 GridViewBuilder(uiBlock &block);
175
176 void build_grid_view(const bContext &C,
177 AbstractGridView &grid_view,
178 uiLayout &layout,
179 std::optional<StringRef> search_string = {});
180};
181
183
184/* ---------------------------------------------------------------------- */
189
195 public:
196 using IsActiveFn = std::function<bool()>;
197 using ActivateFn = std::function<void(bContext &C, PreviewGridItem &new_active)>;
198
199 protected:
204 bool hide_label_ = false;
205
206 public:
207 std::string label;
208 int preview_icon_id = ICON_NONE;
209
211
212 void build_grid_tile(const bContext &C, uiLayout &layout) const override;
213
214 void build_grid_tile_button(uiLayout &layout,
215 BIFIconID override_preview_icon_id = ICON_NONE) const;
216
227
228 void hide_label();
229
230 private:
231 std::optional<bool> should_be_active() const override;
232 void on_activate(bContext &C) override;
233};
234
236
237/* ---------------------------------------------------------------------- */
238
239template<class ItemT, typename... Args> inline ItemT &AbstractGridView::add_item(Args &&...args)
240{
241 static_assert(std::is_base_of_v<AbstractGridViewItem, ItemT>,
242 "Type must derive from and implement the AbstractGridViewItem interface");
243
244 return dynamic_cast<ItemT &>(add_item(std::make_unique<ItemT>(std::forward<Args>(args)...)));
245}
246
247template<class ViewType> ViewType &GridViewItemDropTarget::get_view() const
248{
249 static_assert(std::is_base_of_v<AbstractGridView, ViewType>,
250 "Type must derive from and implement the ui::AbstractGridView interface");
251 return dynamic_cast<ViewType &>(view_);
252}
253
254} // namespace blender::ui
#define final(a, b, c)
Definition BLI_hash.h:19
int BIFIconID
Definition ED_asset.hh:28
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:159
AbstractGridView & get_view() const
Definition grid_view.cc:164
virtual std::unique_ptr< GridViewItemDropTarget > create_drop_target()
Definition grid_view.cc:180
AbstractGridViewItem(StringRef identifier)
Definition grid_view.cc:132
std::unique_ptr< DropTargetInterface > create_item_drop_target() final
Definition grid_view.cc:175
~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:442
GridViewBuilder(uiBlock &block)
Definition grid_view.cc:440
GridViewItemDropTarget(AbstractGridView &view)
Definition grid_view.cc:185
PreviewGridItem(StringRef identifier, StringRef label, int preview_icon_id)
Definition grid_view.cc:466
void set_is_active_fn(IsActiveFn fn)
Definition grid_view.cc:512
void build_grid_tile_button(uiLayout &layout, BIFIconID override_preview_icon_id=ICON_NONE) const
Definition grid_view.cc:471
std::function< void(bContext &C, PreviewGridItem &new_active)> ActivateFn
void set_on_activate_fn(ActivateFn fn)
Definition grid_view.cc:507
std::function< bool()> IsActiveFn
void build_grid_tile(const bContext &C, uiLayout &layout) const override
Definition grid_view.cc:502
GridViewStyle(int width, int height)
Definition grid_view.cc:128