Blender V4.3
UI_abstract_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
20#pragma once
21
22#include <array>
23#include <memory>
24#include <optional>
25#include <string>
26
27#include "DNA_defs.h"
28#include "DNA_vec_types.h"
29
30#include "BLI_span.hh"
31#include "BLI_string_ref.hh"
32
33#include "UI_interface.hh"
34
35#include "WM_types.hh"
36
37struct bContext;
38struct uiBlock;
39struct uiButViewItem;
40struct uiLayout;
41struct ViewLink;
42struct wmNotifier;
43
44namespace blender::ui {
45
48
50 UP,
51 DOWN,
52};
53
55 friend class AbstractViewItem;
56 friend struct ::ViewLink;
57
58 bool is_reconstructed_ = false;
66 std::unique_ptr<std::array<char, MAX_NAME>> rename_buffer_;
67 /* Search/filter string from the previous redraw, stored to detect changes. */
68 std::string prev_filter_string_;
69
70 bool needs_filtering_ = true;
71
72 /* See #get_bounds(). */
73 std::optional<rcti> bounds_;
74
75 std::string context_menu_title;
77 bool popup_keep_open_ = false;
78
79 public:
80 virtual ~AbstractView() = default;
88 virtual std::unique_ptr<DropTargetInterface> create_drop_target();
89
91 virtual bool listen(const wmNotifier &) const;
92
98 virtual bool begin_filtering(const bContext &C) const;
99
100 virtual void draw_overlays(const ARegion &region, const uiBlock &block) const;
101
102 virtual void foreach_view_item(FunctionRef<void(AbstractViewItem &)> iter_fn) const = 0;
103
104 virtual bool supports_scrolling() const;
105 virtual void scroll(ViewScrollDirection direction);
106
112
114 bool is_renaming() const;
116 bool begin_renaming();
117 void end_renaming();
124 std::optional<rcti> get_bounds() const;
125
126 std::string get_context_menu_title() const;
127 void set_context_menu_title(const std::string &title);
128
129 bool get_popup_keep_open() const;
131 void set_popup_keep_open();
132
134
135 protected:
136 AbstractView() = default;
137
145 virtual void change_state_delayed();
146
147 virtual void update_children_from_old(const AbstractView &old_view) = 0;
148
155 void update_from_old(uiBlock &new_block);
160 bool is_reconstructed() const;
161
162 void filter(std::optional<StringRef> filter_str);
164};
165
167 friend class AbstractView;
168 friend class ViewItemAPIWrapper;
169
170 protected:
175 AbstractView *view_ = nullptr;
178 bool is_activatable_ = true;
179 bool is_interactive_ = true;
180 bool is_active_ = false;
181 bool is_renaming_ = false;
184
187
188 public:
189 virtual ~AbstractViewItem() = default;
190
191 virtual void build_context_menu(bContext &C, uiLayout &column) const;
192
199 virtual void on_activate(bContext &C);
205 virtual std::optional<bool> should_be_active() const;
206
211 virtual bool supports_renaming() const;
219 virtual bool rename(const bContext &C, StringRefNull new_name);
224 virtual StringRef get_rename_string() const;
225
230 virtual std::unique_ptr<AbstractViewItemDragController> create_drag_controller() const;
238 virtual std::unique_ptr<DropTargetInterface> create_item_drop_target();
239
245 virtual std::optional<std::string> debug_name() const;
246
247 bool is_filtered_visible() const;
248
250 AbstractView &get_view() const;
251
258
261 void disable_interaction();
262 bool is_interactive() const;
263
264 void disable_activatable();
274 void activate(bContext &C);
275 void deactivate();
280 bool is_active() const;
285 bool is_search_highlight() const;
286
287 bool is_renaming() const;
288 void begin_renaming();
289 void end_renaming();
290 void rename_apply(const bContext &C);
291
292 protected:
293 AbstractViewItem() = default;
294
302 virtual bool matches(const AbstractViewItem &other) const = 0;
303
311 virtual void update_from_old(const AbstractViewItem &old);
312
319 virtual bool set_state_active();
320
325 virtual void change_state_delayed();
326
331 virtual bool should_be_filtered_visible(StringRefNull filter_string) const;
332
338 void add_rename_button(uiBlock &block);
339};
340
341/* ---------------------------------------------------------------------- */
350 protected:
352
353 public:
356
357 virtual eWM_DragDataType get_drag_type() const = 0;
358 virtual void *create_drag_data() const = 0;
359 virtual void on_drag_start();
360
363 template<class ViewType> inline ViewType &get_view() const;
364};
365
366template<class ViewType> ViewType &AbstractViewItemDragController::get_view() const
367{
368 static_assert(std::is_base_of<AbstractView, ViewType>::value,
369 "Type must derive from and implement the ui::AbstractView interface");
370 return dynamic_cast<ViewType &>(view_);
371}
372
375} // namespace blender::ui
eWM_DragDataType
Definition WM_types.hh:1152
virtual void * create_drag_data() const =0
virtual eWM_DragDataType get_drag_type() const =0
virtual void update_from_old(const AbstractViewItem &old)
void add_rename_button(uiBlock &block)
virtual bool should_be_filtered_visible(StringRefNull filter_string) const
virtual void on_activate(bContext &C)
virtual std::unique_ptr< DropTargetInterface > create_item_drop_target()
virtual bool supports_renaming() const
virtual ~AbstractViewItem()=default
uiButViewItem * view_item_button() const
virtual std::optional< bool > should_be_active() const
virtual bool rename(const bContext &C, StringRefNull new_name)
virtual bool matches(const AbstractViewItem &other) const =0
virtual void build_context_menu(bContext &C, uiLayout &column) const
virtual StringRef get_rename_string() const
void rename_apply(const bContext &C)
virtual std::unique_ptr< AbstractViewItemDragController > create_drag_controller() const
virtual std::optional< std::string > debug_name() const
virtual bool supports_scrolling() const
virtual void draw_overlays(const ARegion &region, const uiBlock &block) const
const AbstractViewItem * search_highlight_item() const
virtual bool listen(const wmNotifier &) const
std::optional< rcti > get_bounds() const
void update_from_old(uiBlock &new_block)
virtual void change_state_delayed()
virtual std::unique_ptr< DropTargetInterface > create_drop_target()
virtual void foreach_view_item(FunctionRef< void(AbstractViewItem &)> iter_fn) const =0
virtual bool begin_filtering(const bContext &C) const
virtual void scroll(ViewScrollDirection direction)
virtual void update_children_from_old(const AbstractView &old_view)=0
void register_item(AbstractViewItem &item)
virtual ~AbstractView()=default
Span< char > get_rename_buffer() const
std::string get_context_menu_title() const
void filter(std::optional< StringRef > filter_str)
void set_context_menu_title(const std::string &title)