Blender V5.0
wm_uilist_type.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10
11#include <cstdio>
12#include <cstring>
13
14#include "BLI_listbase.h"
15
16#include "DNA_space_types.h"
18
19#include "MEM_guardedalloc.h"
20
21#include "BLI_string_utf8.h"
22#include "BLI_utildefines.h"
23#include "BLI_vector_set.hh"
24
25#include "BKE_main.hh"
26#include "BKE_screen.hh"
27
28#include "UI_interface_types.hh"
29
30#include "WM_api.hh"
31#include "WM_types.hh"
32
34
35static auto &get_list_type_map()
36{
37 struct IDNameGetter {
38 StringRef operator()(const uiListType *value) const
39 {
40 return StringRef(value->idname);
41 }
42 };
44 return map;
45}
46
47uiListType *WM_uilisttype_find(const StringRef idname, bool quiet)
48{
49 if (!idname.is_empty()) {
50 if (uiListType *const *ult = get_list_type_map().lookup_key_ptr_as(idname)) {
51 return *ult;
52 }
53 }
54
55 if (!quiet) {
56 printf("search for unknown uilisttype %s\n", std::string(idname).c_str());
57 }
58
59 return nullptr;
60}
61
63{
64 get_list_type_map().add(ult);
65 return true;
66}
67
68static void wm_uilisttype_unlink_from_region(const uiListType *ult, ARegion *region)
69{
70 LISTBASE_FOREACH (uiList *, list, &region->ui_lists) {
71 if (list->type == ult) {
72 /* Don't delete the list, it's not just runtime data but stored in files. Freeing would make
73 * that data get lost. */
74 list->type = nullptr;
75 }
76 }
77}
78
80{
81 LISTBASE_FOREACH (SpaceLink *, space_link, &area->spacedata) {
82 ListBase *regionbase = (space_link == area->spacedata.first) ? &area->regionbase :
83 &space_link->regionbase;
84 LISTBASE_FOREACH (ARegion *, region, regionbase) {
86 }
87 }
88}
89
100static void wm_uilisttype_unlink(Main *bmain, const uiListType *ult)
101{
102 for (wmWindowManager *wm = static_cast<wmWindowManager *>(bmain->wm.first); wm != nullptr;
103 wm = static_cast<wmWindowManager *>(wm->id.next))
104 {
105 LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {
106 LISTBASE_FOREACH (ScrArea *, global_area, &win->global_areas.areabase) {
107 wm_uilisttype_unlink_from_area(ult, global_area);
108 }
109 }
110 }
111
112 for (bScreen *screen = static_cast<bScreen *>(bmain->screens.first); screen != nullptr;
113 screen = static_cast<bScreen *>(screen->id.next))
114 {
115 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
117 }
118
119 LISTBASE_FOREACH (ARegion *, region, &screen->regionbase) {
121 }
122 }
123}
124
126{
127 wm_uilisttype_unlink(bmain, ult);
128
129 bool ok = get_list_type_map().remove(ult);
130 MEM_freeN(ult);
131
132 BLI_assert(ok);
134}
135
137{
138 get_list_type_map().reserve(16);
139}
140
142{
143 for (uiListType *ult : get_list_type_map()) {
144 if (ult->rna_ext.free) {
145 ult->rna_ext.free(ult->rna_ext.data);
146 }
147 MEM_freeN(ult);
148 }
149
150 get_list_type_map().clear();
151}
152
154 const char *list_id,
155 char r_full_list_id[/*UI_MAX_NAME_STR*/])
156{
157 /* We tag the list id with the list type... */
158 BLI_snprintf_utf8(r_full_list_id, UI_MAX_NAME_STR, "%s_%s", ult->idname, list_id ? list_id : "");
159}
160
161const char *WM_uilisttype_list_id_get(const uiListType *ult, uiList *list)
162{
163 /* Some sanity check for the assumed behavior of #WM_uilisttype_to_full_list_id(). */
164 BLI_assert((list->list_id + strlen(ult->idname))[0] == '_');
165 /* +1 to skip the '_'. */
166 return list->list_id + strlen(ult->idname) + 1;
167}
#define BLI_assert(a)
Definition BLI_assert.h:46
#define LISTBASE_FOREACH(type, var, list)
size_t size_t size_t BLI_snprintf_utf8(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
#define UNUSED_VARS_NDEBUG(...)
Read Guarded memory(de)allocation.
#define UI_MAX_NAME_STR
SIMD_FORCE_INLINE btVector3 operator()(const btVector3 &x) const
Return the transform of the vector.
Definition btTransform.h:90
constexpr bool is_empty() const
#define printf(...)
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
VectorSet< T, InlineBufferCapacity, DefaultProbingStrategy, CustomIDHash< T, GetIDFn >, CustomIDEqual< T, GetIDFn > > CustomIDVectorSet
ListBase ui_lists
void * first
ListBase wm
Definition BKE_main.hh:307
ListBase screens
Definition BKE_main.hh:292
ListBase spacedata
ListBase regionbase
char idname[BKE_ST_MAXNAME]
char list_id[256]
static void wm_uilisttype_unlink_from_region(const uiListType *ult, ARegion *region)
bool WM_uilisttype_add(uiListType *ult)
static void wm_uilisttype_unlink(Main *bmain, const uiListType *ult)
uiListType * WM_uilisttype_find(const StringRef idname, bool quiet)
void WM_uilisttype_to_full_list_id(const uiListType *ult, const char *list_id, char r_full_list_id[])
static auto & get_list_type_map()
void WM_uilisttype_free()
const char * WM_uilisttype_list_id_get(const uiListType *ult, uiList *list)
static void wm_uilisttype_unlink_from_area(const uiListType *ult, ScrArea *area)
void WM_uilisttype_init()
void WM_uilisttype_remove_ptr(Main *bmain, uiListType *ult)