Blender  V3.3
UI_grid_view.hh
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
10 #pragma once
11 
12 #include "BLI_function_ref.hh"
13 #include "BLI_map.hh"
14 #include "BLI_vector.hh"
15 
16 #include "UI_abstract_view.hh"
17 #include "UI_resources.h"
18 
19 struct bContext;
20 struct PreviewImage;
21 struct uiBlock;
22 struct uiButViewItem;
23 struct uiLayout;
24 struct View2D;
25 struct wmNotifier;
26 
27 namespace blender::ui {
28 
29 class AbstractGridView;
30 
31 /* ---------------------------------------------------------------------- */
36  friend class AbstractGridView;
37  friend class GridViewLayoutBuilder;
38 
39  protected:
44 
45  public:
46  virtual ~AbstractGridViewItem() = default;
47 
48  virtual void build_grid_tile(uiLayout &layout) const = 0;
49 
50  const AbstractGridView &get_view() const;
51 
52  protected:
53  AbstractGridViewItem(StringRef identifier);
54 
56  virtual bool matches(const AbstractViewItem &other) const override;
57 
59  virtual void on_activate();
64  virtual std::optional<bool> should_be_active() const;
65 
72  void activate();
73  void deactivate();
74 
75  private:
77  void change_state_delayed();
78  static void grid_tile_click_fn(bContext *, void *but_arg1, void *);
79  void add_grid_tile_button(uiBlock &block);
80 };
81 
84 /* ---------------------------------------------------------------------- */
88 struct GridViewStyle {
89  GridViewStyle(int width, int height);
90  int tile_width = 0;
91  int tile_height = 0;
92 };
93 
95  friend class AbstractGridViewItem;
96  friend class GridViewBuilder;
97  friend class GridViewLayoutBuilder;
98 
99  protected:
105 
106  public:
108  virtual ~AbstractGridView() = default;
109 
111  void foreach_item(ItemIterFn iter_fn) const;
112 
126  template<class ItemT, typename... Args> inline ItemT &add_item(Args &&...args);
127  const GridViewStyle &get_style() const;
128  int get_item_count() const;
129 
130  protected:
131  virtual void build_items() = 0;
132 
133  private:
134  void update_children_from_old(const AbstractView &old_view) override;
135  AbstractGridViewItem *find_matching_item(const AbstractGridViewItem &item_to_match,
136  const AbstractGridView &view_to_search_in) const;
142  void change_state_delayed();
143 
148  AbstractGridViewItem &add_item(std::unique_ptr<AbstractGridViewItem> item);
149 };
150 
153 /* ---------------------------------------------------------------------- */
160  uiBlock &block_;
161 
162  public:
163  GridViewBuilder(uiBlock &block);
164 
167  void build_grid_view(AbstractGridView &grid_view, const View2D &v2d);
168 };
169 
172 /* ---------------------------------------------------------------------- */
183  public:
184  using IsActiveFn = std::function<bool()>;
185  using ActivateFn = std::function<void(PreviewGridItem &new_active)>;
186 
187  protected:
192 
193  public:
194  std::string label{};
195  int preview_icon_id = ICON_NONE;
196 
198 
199  void build_grid_tile(uiLayout &layout) const override;
200 
210  void set_is_active_fn(IsActiveFn fn);
211 
212  private:
213  std::optional<bool> should_be_active() const override;
214  void on_activate() override;
215 };
216 
219 /* ---------------------------------------------------------------------- */
220 
221 template<class ItemT, typename... Args> inline ItemT &AbstractGridView::add_item(Args &&...args)
222 {
223  static_assert(std::is_base_of<AbstractGridViewItem, ItemT>::value,
224  "Type must derive from and implement the AbstractGridViewItem interface");
225 
226  return dynamic_cast<ItemT &>(add_item(std::make_unique<ItemT>(std::forward<Args>(args)...)));
227 }
228 
229 } // namespace blender::ui
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei width
virtual ~AbstractGridViewItem()=default
virtual std::optional< bool > should_be_active() const
Definition: grid_view.cc:141
AbstractGridViewItem(StringRef identifier)
Definition: grid_view.cc:93
virtual void build_grid_tile(uiLayout &layout) const =0
const AbstractGridView & get_view() const
Definition: grid_view.cc:176
virtual bool matches(const AbstractViewItem &other) const override
Definition: grid_view.cc:97
Map< StringRef, AbstractGridViewItem * > item_map_
ItemT & add_item(Args &&...args)
virtual ~AbstractGridView()=default
void foreach_item(ItemIterFn iter_fn) const
Definition: grid_view.cc:38
const GridViewStyle & get_style() const
Definition: grid_view.cc:77
virtual void build_items()=0
Vector< std::unique_ptr< AbstractGridViewItem > > items_
GridViewBuilder(uiBlock &block)
Definition: grid_view.cc:392
void build_grid_view(AbstractGridView &grid_view, const View2D &v2d)
Definition: grid_view.cc:396
std::function< void(PreviewGridItem &new_active)> ActivateFn
PreviewGridItem(StringRef identifier, StringRef label, int preview_icon_id)
Definition: grid_view.cc:408
void build_grid_tile(uiLayout &layout) const override
Definition: grid_view.cc:413
void set_is_active_fn(IsActiveFn fn)
Definition: grid_view.cc:443
void set_on_activate_fn(ActivateFn fn)
Definition: grid_view.cc:438
std::function< bool()> IsActiveFn
SyclQueue void void size_t num_bytes void
GridViewStyle(int width, int height)
Definition: grid_view.cc:87