Blender V4.5
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
19
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
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
109 virtual bool is_fully_visible() const;
110
111 virtual void scroll(ViewScrollDirection direction);
112
120 virtual std::optional<uiViewState> persistent_state() const;
125 virtual void persistent_state_apply(const uiViewState &state);
126
132
134 bool is_renaming() const;
136 bool begin_renaming();
137 void end_renaming();
144 std::optional<rcti> get_bounds() const;
145
146 std::string get_context_menu_title() const;
147 void set_context_menu_title(const std::string &title);
148
149 bool get_popup_keep_open() const;
151 void set_popup_keep_open();
152
154
155 protected:
156 AbstractView() = default;
157
165 virtual void change_state_delayed();
166
167 virtual void update_children_from_old(const AbstractView &old_view) = 0;
168
175 void update_from_old(uiBlock &new_block);
180 bool is_reconstructed() const;
181
182 void filter(std::optional<StringRef> filter_str);
184};
185
187 friend class AbstractView;
188 friend class ViewItemAPIWrapper;
189
190 protected:
195 AbstractView *view_ = nullptr;
198 bool is_activatable_ = true;
199 bool is_interactive_ = true;
200 bool is_active_ = false;
201 bool is_renaming_ = false;
204
207
214
215 public:
216 virtual ~AbstractViewItem() = default;
217
218 virtual void build_context_menu(bContext &C, uiLayout &column) const;
219
226 virtual void on_activate(bContext &C);
232 virtual std::optional<bool> should_be_active() const;
233
238 virtual bool supports_renaming() const;
246 virtual bool rename(const bContext &C, StringRefNull new_name);
251 virtual StringRef get_rename_string() const;
252
257 virtual std::unique_ptr<AbstractViewItemDragController> create_drag_controller() const;
265 virtual std::unique_ptr<DropTargetInterface> create_item_drop_target();
266
272 virtual std::optional<std::string> debug_name() const;
273
274 bool is_filtered_visible() const;
275
277 AbstractView &get_view() const;
278
285
288 void disable_interaction();
289 bool is_interactive() const;
290
291 void disable_activatable();
301 void activate(bContext &C);
302 void deactivate();
307 bool is_active() const;
312 bool is_search_highlight() const;
313
314 bool is_renaming() const;
315 void begin_renaming();
316 void end_renaming();
317 void rename_apply(const bContext &C);
318
319 protected:
320 AbstractViewItem() = default;
321
329 virtual bool matches(const AbstractViewItem &other) const = 0;
330
338 virtual void update_from_old(const AbstractViewItem &old);
339
346 virtual bool set_state_active();
347
352 virtual void change_state_delayed();
353
358 virtual bool should_be_filtered_visible(StringRefNull filter_string) const;
359
365 void add_rename_button(uiBlock &block);
366};
367
368/* ---------------------------------------------------------------------- */
371
377 protected:
379
380 public:
383
384 virtual eWM_DragDataType get_drag_type() const = 0;
385 virtual void *create_drag_data() const = 0;
386 virtual void on_drag_start();
387
390 template<class ViewType> inline ViewType &get_view() const;
391};
392
393template<class ViewType> ViewType &AbstractViewItemDragController::get_view() const
394{
395 static_assert(std::is_base_of_v<AbstractView, ViewType>,
396 "Type must derive from and implement the ui::AbstractView interface");
397 return dynamic_cast<ViewType &>(view_);
398}
399
401
402} // namespace blender::ui
static AppView * view
#define C
Definition RandGen.cpp:29
eWM_DragDataType
Definition WM_types.hh:1197
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
virtual bool is_fully_visible() const
const AbstractViewItem * search_highlight_item() const
virtual void persistent_state_apply(const uiViewState &state)
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
virtual std::optional< uiViewState > persistent_state() const
std::string get_context_menu_title() const
void set_context_menu_title(const std::string &title)
#define filter
@ DOWN
static ulong state[N]