Blender V4.3
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
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
30class AbstractGridView;
31class GridViewItemDropTarget;
32
33/* ---------------------------------------------------------------------- */
38 friend class AbstractGridView;
40
41 protected:
44
45 public:
46 /* virtual */ ~AbstractGridViewItem() override = default;
47
48 virtual void build_grid_tile(const bContext &C, uiLayout &layout) const = 0;
49
50 /* virtual */ std::optional<std::string> debug_name() const override;
51
53
54 protected:
56
58 /* virtual */ bool matches(const AbstractViewItem &other) const override;
59
60 /* virtual */ std::unique_ptr<DropTargetInterface> create_item_drop_target() final;
61 virtual std::unique_ptr<GridViewItemDropTarget> create_drop_target();
62
63 private:
64 static void grid_tile_click_fn(bContext *, void *but_arg1, void *);
65 void add_grid_tile_button(uiBlock &block);
66};
67
70/* ---------------------------------------------------------------------- */
75 GridViewStyle(int width, int height);
76 int tile_width = 0;
77 int tile_height = 0;
78};
79
82 friend class GridViewBuilder;
84
85 protected:
88 mutable std::optional<int> item_count_filtered_;
93
94 public:
96 /* virtual */ ~AbstractGridView() override = default;
97
99 void foreach_item(ItemIterFn iter_fn) const;
100 void foreach_filtered_item(ItemIterFn iter_fn) const;
101
115 template<class ItemT, typename... Args> inline ItemT &add_item(Args &&...args);
116 const GridViewStyle &get_style() const;
117 int get_item_count() const;
118 int get_item_count_filtered() const;
119
120 void set_tile_size(int tile_width, int tile_height);
121
122 protected:
123 virtual void build_items() = 0;
124
125 private:
126 void foreach_view_item(FunctionRef<void(AbstractViewItem &)> iter_fn) const final;
127 void update_children_from_old(const AbstractView &old_view) override;
128 AbstractGridViewItem *find_matching_item(const AbstractGridViewItem &item_to_match,
129 const AbstractGridView &view_to_search_in) const;
130
135 AbstractGridViewItem &add_item(std::unique_ptr<AbstractGridViewItem> item);
136};
137
140/* ---------------------------------------------------------------------- */
150 protected:
152
153 public:
155
158 template<class ViewType> inline ViewType &get_view() const;
159};
160
163/* ---------------------------------------------------------------------- */
170 public:
171 GridViewBuilder(uiBlock &block);
172
173 void build_grid_view(const bContext &C,
174 AbstractGridView &grid_view,
175 const View2D &v2d,
176 uiLayout &layout,
177 std::optional<StringRef> search_string = {});
178};
179
182/* ---------------------------------------------------------------------- */
193 public:
194 using IsActiveFn = std::function<bool()>;
195 using ActivateFn = std::function<void(bContext &C, PreviewGridItem &new_active)>;
196
197 protected:
202 bool hide_label_ = false;
203
204 public:
205 std::string label;
206 int preview_icon_id = ICON_NONE;
207
208 PreviewGridItem(StringRef identifier, StringRef label, int preview_icon_id);
209
210 void build_grid_tile(const bContext &C, uiLayout &layout) const override;
211
212 void build_grid_tile_button(uiLayout &layout,
213 BIFIconID override_preview_icon_id = ICON_NONE) const;
214
220 void set_on_activate_fn(ActivateFn fn);
224 void set_is_active_fn(IsActiveFn fn);
225
226 void hide_label();
227
228 private:
229 std::optional<bool> should_be_active() const override;
230 void on_activate(bContext &C) override;
231};
232
235/* ---------------------------------------------------------------------- */
236
237template<class ItemT, typename... Args> inline ItemT &AbstractGridView::add_item(Args &&...args)
238{
239 static_assert(std::is_base_of<AbstractGridViewItem, ItemT>::value,
240 "Type must derive from and implement the AbstractGridViewItem interface");
241
242 return dynamic_cast<ItemT &>(add_item(std::make_unique<ItemT>(std::forward<Args>(args)...)));
243}
244
245template<class ViewType> ViewType &GridViewItemDropTarget::get_view() const
246{
247 static_assert(std::is_base_of<AbstractGridView, ViewType>::value,
248 "Type must derive from and implement the ui::AbstractGridView interface");
249 return dynamic_cast<ViewType &>(view_);
250}
251
252} // namespace blender::ui
int BIFIconID
virtual void build_grid_tile(const bContext &C, uiLayout &layout) const =0
std::optional< std::string > debug_name() const override
Definition grid_view.cc:168
AbstractGridView & get_view() const
Definition grid_view.cc:173
virtual std::unique_ptr< GridViewItemDropTarget > create_drop_target()
Definition grid_view.cc:189
AbstractGridViewItem(StringRef identifier)
Definition grid_view.cc:131
std::unique_ptr< DropTargetInterface > create_item_drop_target() final
Definition grid_view.cc:184
~AbstractGridViewItem() override=default
bool matches(const AbstractViewItem &other) const override
Definition grid_view.cc:133
Map< StringRef, AbstractGridViewItem * > item_map_
ItemT & add_item(Args &&...args)
~AbstractGridView() override=default
std::optional< int > item_count_filtered_
virtual void build_items()=0
Vector< std::unique_ptr< AbstractGridViewItem > > items_
std::function< void(bContext &C, PreviewGridItem &new_active)> ActivateFn
std::function< bool()> IsActiveFn
const char * label