Blender  V3.3
UI_tree_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 <functional>
13 #include <memory>
14 #include <string>
15 
16 #include "DNA_defs.h"
17 
18 #include "BLI_function_ref.hh"
19 #include "BLI_vector.hh"
20 
21 #include "UI_abstract_view.hh"
22 #include "UI_resources.h"
23 
24 struct bContext;
25 struct uiBlock;
26 struct uiBut;
27 struct uiButViewItem;
28 struct uiLayout;
29 
30 namespace blender::ui {
31 
32 class AbstractTreeView;
33 class AbstractTreeViewItem;
34 
35 /* ---------------------------------------------------------------------- */
50  friend class AbstractTreeView;
51  friend class AbstractTreeViewItem;
52 
53  /* Private constructor, so only the friends above can create this! */
54  TreeViewItemContainer() = default;
55 
56  protected:
62 
63  public:
64  enum class IterOptions {
65  None = 0,
66  SkipCollapsed = 1 << 0,
67 
68  /* Keep ENUM_OPERATORS() below updated! */
69  };
71 
85  template<class ItemT, typename... Args> inline ItemT &add_tree_item(Args &&...args);
90  AbstractTreeViewItem &add_tree_item(std::unique_ptr<AbstractTreeViewItem> item);
91 
92  protected:
94 };
95 
98 
103 
106 /* ---------------------------------------------------------------------- */
111  friend class AbstractTreeViewItem;
112  friend class TreeViewBuilder;
113 
114  public:
115  virtual ~AbstractTreeView() = default;
116 
118 
119  protected:
120  virtual void build_tree() = 0;
121 
122  private:
123  void update_children_from_old(const AbstractView &old_view) override;
124  static void update_children_from_old_recursive(const TreeViewOrItem &new_items,
125  const TreeViewOrItem &old_items);
126  static AbstractTreeViewItem *find_matching_child(const AbstractTreeViewItem &lookup_item,
127  const TreeViewOrItem &items);
128 
134  void change_state_delayed();
135 };
136 
139 /* ---------------------------------------------------------------------- */
151  friend class AbstractTreeView;
152  friend class TreeViewLayoutBuilder;
153  /* Higher-level API. */
155 
156  private:
157  bool is_open_ = false;
158 
159  protected:
161  std::string label_{};
164 
165  public:
166  virtual ~AbstractTreeViewItem() = default;
167 
168  virtual void build_row(uiLayout &row) = 0;
169 
171 
173  void toggle_collapsed();
174  void set_collapsed(bool collapsed);
179  bool is_collapsed() const;
180 
181  protected:
185  virtual void on_activate();
190  virtual std::optional<bool> should_be_active() const;
191 
193  virtual StringRef get_rename_string() const override;
195  virtual bool rename(StringRefNull new_name) override;
196 
200  virtual bool supports_collapsing() const;
201 
203  virtual bool matches(const AbstractViewItem &other) const override;
204 
206  virtual void update_from_old(const AbstractViewItem &old) override;
207 
218  virtual bool matches_single(const AbstractTreeViewItem &other) const;
219 
226  void activate();
227  void deactivate();
228 
234  bool is_hovered() const;
235  bool is_collapsible() const;
236 
238 
240 
241  private:
242  static void tree_row_click_fn(struct bContext *, void *, void *);
243  static void collapse_chevron_click_fn(bContext *, void *but_arg1, void *);
244  static bool is_collapse_chevron_but(const uiBut *but);
245 
247  void change_state_delayed();
248 
249  void add_treerow_button(uiBlock &block);
250  void add_indent(uiLayout &row) const;
251  void add_collapse_chevron(uiBlock &block) const;
252  void add_rename_button(uiLayout &row);
253 
254  bool has_active_child() const;
255  int count_parents() const;
256 };
257 
260 /* ---------------------------------------------------------------------- */
270  public:
271  using IsActiveFn = std::function<bool()>;
272  using ActivateFn = std::function<void(BasicTreeViewItem &new_active)>;
274 
275  explicit BasicTreeViewItem(StringRef label, BIFIconID icon = ICON_NONE);
276 
277  void build_row(uiLayout &row) override;
278  void add_label(uiLayout &layout, StringRefNull label_override = "");
283  void set_is_active_fn(IsActiveFn fn);
284 
285  protected:
292 
294 
295  private:
296  static void tree_row_click_fn(struct bContext *C, void *arg1, void *arg2);
297 
298  std::optional<bool> should_be_active() const override;
299  void on_activate() override;
300 };
301 
304 /* ---------------------------------------------------------------------- */
309  uiBlock &block_;
310 
311  public:
312  TreeViewBuilder(uiBlock &block);
313 
314  void build_tree_view(AbstractTreeView &tree_view);
315 };
316 
319 /* ---------------------------------------------------------------------- */
320 
321 template<class ItemT, typename... Args>
322 inline ItemT &TreeViewItemContainer::add_tree_item(Args &&...args)
323 {
324  static_assert(std::is_base_of<AbstractTreeViewItem, ItemT>::value,
325  "Type must derive from and implement the AbstractTreeViewItem interface");
326 
327  return dynamic_cast<ItemT &>(
328  add_tree_item(std::make_unique<ItemT>(std::forward<Args>(args)...)));
329 }
330 
331 } // namespace blender::ui
BIFIconID
Definition: UI_resources.h:18
Abstract base class for defining a customizable tree-view item.
virtual void update_from_old(const AbstractViewItem &old) override
Definition: tree_view.cc:263
uiButViewItem * view_item_button()
Definition: tree_view.cc:383
AbstractTreeView & get_tree_view() const
Definition: tree_view.cc:276
virtual StringRef get_rename_string() const override
Definition: tree_view.cc:250
virtual void build_row(uiLayout &row)=0
virtual bool matches(const AbstractViewItem &other) const override
Definition: tree_view.cc:361
virtual ~AbstractTreeViewItem()=default
virtual bool matches_single(const AbstractTreeViewItem &other) const
Definition: tree_view.cc:271
virtual std::optional< bool > should_be_active() const
Definition: tree_view.cc:240
virtual bool supports_collapsing() const
Definition: tree_view.cc:245
virtual bool rename(StringRefNull new_name) override
Definition: tree_view.cc:255
void set_collapsed(bool collapsed)
Definition: tree_view.cc:341
virtual ~AbstractTreeView()=default
void foreach_item(ItemIterFn iter_fn, IterOptions options=IterOptions::None) const
Definition: tree_view.cc:68
void set_is_active_fn(IsActiveFn fn)
Definition: tree_view.cc:542
BasicTreeViewItem(StringRef label, BIFIconID icon=ICON_NONE)
Definition: tree_view.cc:509
void build_row(uiLayout &row) override
Definition: tree_view.cc:514
std::function< bool()> IsActiveFn
std::function< void(BasicTreeViewItem &new_active)> ActivateFn
void add_label(uiLayout &layout, StringRefNull label_override="")
Definition: tree_view.cc:519
void set_on_activate_fn(ActivateFn fn)
Definition: tree_view.cc:537
TreeViewBuilder(uiBlock &block)
Definition: tree_view.cc:493
void build_tree_view(AbstractTreeView &tree_view)
Definition: tree_view.cc:497
ItemT & add_tree_item(Args &&...args)
AbstractTreeViewItem * parent_
Definition: UI_tree_view.hh:61
TreeViewItemContainer * root_
Definition: UI_tree_view.hh:59
void foreach_item_recursive(ItemIterFn iter_fn, IterOptions options=IterOptions::None) const
Definition: tree_view.cc:54
Vector< std::unique_ptr< AbstractTreeViewItem > > children_
Definition: UI_tree_view.hh:57
CCL_NAMESPACE_BEGIN struct Options options
const char * label
SyclQueue void void size_t num_bytes void
ENUM_OPERATORS(TreeViewItemContainer::IterOptions, TreeViewItemContainer::IterOptions::SkipCollapsed)