Blender V5.0
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"
35
36#include "WM_types.hh"
37
38struct bContext;
39struct uiBlock;
40struct uiButViewItem;
41struct uiLayout;
42struct ViewLink;
43struct wmNotifier;
44
45namespace blender::ui {
46
49
53};
54
56 friend class AbstractViewItem;
57 friend struct ::ViewLink;
58
59 bool is_reconstructed_ = false;
67 std::unique_ptr<std::array<char, MAX_NAME>> rename_buffer_;
68 /* Search/filter string from the previous redraw, stored to detect changes. */
69 std::string prev_filter_string_;
70
71 bool needs_filtering_ = true;
72
73 /* See #get_bounds(). */
74 std::optional<rcti> bounds_;
75
76 std::string context_menu_title;
78 bool popup_keep_open_ = false;
79 bool is_multiselect_supported_ = false;
80
81 public:
82 virtual ~AbstractView() = default;
90 virtual std::unique_ptr<DropTargetInterface> create_drop_target();
91
93 virtual bool listen(const wmNotifier &) const;
94
100 virtual bool begin_filtering(const bContext &C) const;
101
102 virtual void draw_overlays(const ARegion &region, const uiBlock &block) const;
103
104 virtual void foreach_view_item(FunctionRef<void(AbstractViewItem &)> iter_fn) const = 0;
105
106 virtual bool supports_scrolling() const;
107
111 virtual bool is_fully_visible() const;
112
113 virtual void scroll(ViewScrollDirection direction);
114
122 virtual std::optional<uiViewState> persistent_state() const;
127 virtual void persistent_state_apply(const uiViewState &state);
128
134
136 bool is_renaming() const;
138 bool begin_renaming();
139 void end_renaming();
146 std::optional<rcti> get_bounds() const;
147
148 std::string get_context_menu_title() const;
149 void set_context_menu_title(const std::string &title);
150
151 bool get_popup_keep_open() const;
153 void set_popup_keep_open();
154
157 bool is_multiselect_supported() const;
158
159 protected:
160 AbstractView() = default;
161
169 virtual void change_state_delayed();
170
171 virtual void update_children_from_old(const AbstractView &old_view) = 0;
172
179 void update_from_old(uiBlock &new_block);
184 bool is_reconstructed() const;
185
186 void filter(std::optional<StringRef> filter_str);
188};
189
191 friend class AbstractView;
192 friend class ViewItemAPIWrapper;
193
194 protected:
199 AbstractView *view_ = nullptr;
202 bool is_activatable_ = true;
203 bool is_interactive_ = true;
204 bool is_active_ = false;
206 bool is_selected_ = false;
207 bool is_renaming_ = false;
210
213
221 bool select_on_click_ = false;
226
227 public:
228 virtual ~AbstractViewItem() = default;
229
230 virtual void build_context_menu(bContext &C, uiLayout &column) const;
231
243 virtual bool set_state_active();
250 virtual void on_activate(bContext &C);
256 virtual std::optional<bool> should_be_active() const;
257
258 virtual std::optional<bool> should_be_selected() const;
259 virtual void set_selected(const bool select);
264 virtual bool supports_renaming() const;
272 virtual bool rename(const bContext &C, StringRefNull new_name);
277 virtual StringRef get_rename_string() const;
278
283 virtual std::unique_ptr<AbstractViewItemDragController> create_drag_controller() const;
291 virtual std::unique_ptr<DropTargetInterface> create_item_drop_target();
292
298 virtual std::optional<std::string> debug_name() const;
299
300 bool is_filtered_visible() const;
301
303 AbstractView &get_view() const;
304
311
314 void disable_interaction();
315 bool is_interactive() const;
316
317 void disable_activatable();
323 void select_on_click_set();
324 bool is_select_on_click() const;
341 void activate(bContext &C);
349 void deactivate();
354 bool is_active() const;
355 bool is_selected() const;
360 bool is_search_highlight() const;
361
362 bool is_renaming() const;
363 void begin_renaming();
364 void end_renaming();
365 void rename_apply(const bContext &C);
366
367 virtual void delete_item(bContext *C);
368 virtual void on_filter_change();
369
370 protected:
371 AbstractViewItem() = default;
372
380 virtual bool matches(const AbstractViewItem &other) const = 0;
381
389 virtual void update_from_old(const AbstractViewItem &old);
390
395 virtual void change_state_delayed();
396
401 virtual bool should_be_filtered_visible(StringRefNull filter_string) const;
402
408 void add_rename_button(uiBlock &block);
409};
410
411/* ---------------------------------------------------------------------- */
414
420 protected:
422
423 public:
426
427 virtual std::optional<eWM_DragDataType> get_drag_type() const = 0;
428 virtual void *create_drag_data() const = 0;
433 virtual void on_drag_start(bContext &C);
434
437 template<class ViewType> inline ViewType &get_view() const;
438};
439
440template<class ViewType> ViewType &AbstractViewItemDragController::get_view() const
441{
442 static_assert(std::is_base_of_v<AbstractView, ViewType>,
443 "Type must derive from and implement the ui::AbstractView interface");
444 return dynamic_cast<ViewType &>(view_);
445}
446
448
449} // namespace blender::ui
static AppView * view
#define C
Definition RandGen.cpp:29
virtual std::optional< eWM_DragDataType > get_drag_type() const =0
virtual void * create_drag_data() const =0
virtual void delete_item(bContext *C)
virtual void set_selected(const bool select)
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 std::optional< bool > should_be_selected() const
virtual StringRef get_rename_string() const
void rename_apply(const bContext &C)
void activate_for_context_menu(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)
bool is_multiselect_supported() 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
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
#define select(A, B, C)
@ DOWN
static ulong state[N]