Blender V4.3
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
11#include <cstdio>
12#include <cstring>
13
14#include "BLI_listbase.h"
15#include "BLI_sys_types.h"
16
17#include "DNA_space_types.h"
19
20#include "MEM_guardedalloc.h"
21
22#include "UI_interface.hh"
23
24#include "BLI_ghash.h"
25#include "BLI_string.h"
26#include "BLI_utildefines.h"
27
28#include "BKE_main.hh"
29#include "BKE_screen.hh"
30
31#include "WM_api.hh"
32#include "WM_types.hh"
33
34static GHash *uilisttypes_hash = nullptr;
35
36uiListType *WM_uilisttype_find(const char *idname, bool quiet)
37{
38 if (idname[0]) {
39 uiListType *ult = static_cast<uiListType *>(BLI_ghash_lookup(uilisttypes_hash, idname));
40 if (ult) {
41 return ult;
42 }
43 }
44
45 if (!quiet) {
46 printf("search for unknown uilisttype %s\n", idname);
47 }
48
49 return nullptr;
50}
51
53{
55 return true;
56}
57
58static void wm_uilisttype_unlink_from_region(const uiListType *ult, ARegion *region)
59{
60 LISTBASE_FOREACH (uiList *, list, &region->ui_lists) {
61 if (list->type == ult) {
62 /* Don't delete the list, it's not just runtime data but stored in files. Freeing would make
63 * that data get lost. */
64 list->type = nullptr;
65 }
66 }
67}
68
70{
71 LISTBASE_FOREACH (SpaceLink *, space_link, &area->spacedata) {
72 ListBase *regionbase = (space_link == area->spacedata.first) ? &area->regionbase :
73 &space_link->regionbase;
74 LISTBASE_FOREACH (ARegion *, region, regionbase) {
76 }
77 }
78}
79
90static void wm_uilisttype_unlink(Main *bmain, const uiListType *ult)
91{
92 for (wmWindowManager *wm = static_cast<wmWindowManager *>(bmain->wm.first); wm != nullptr;
93 wm = static_cast<wmWindowManager *>(wm->id.next))
94 {
95 LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {
96 LISTBASE_FOREACH (ScrArea *, global_area, &win->global_areas.areabase) {
97 wm_uilisttype_unlink_from_area(ult, global_area);
98 }
99 }
100 }
101
102 for (bScreen *screen = static_cast<bScreen *>(bmain->screens.first); screen != nullptr;
103 screen = static_cast<bScreen *>(screen->id.next))
104 {
105 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
107 }
108
109 LISTBASE_FOREACH (ARegion *, region, &screen->regionbase) {
111 }
112 }
113}
114
116{
117 wm_uilisttype_unlink(bmain, ult);
118
119 bool ok = BLI_ghash_remove(uilisttypes_hash, ult->idname, nullptr, MEM_freeN);
120
121 BLI_assert(ok);
123}
124
126{
127 uilisttypes_hash = BLI_ghash_str_new_ex("uilisttypes_hash gh", 16);
128}
129
131{
132 GHashIterator gh_iter;
133 GHASH_ITER (gh_iter, uilisttypes_hash) {
134 uiListType *ult = static_cast<uiListType *>(BLI_ghashIterator_getValue(&gh_iter));
135 if (ult->rna_ext.free) {
136 ult->rna_ext.free(ult->rna_ext.data);
137 }
138 }
139
141 uilisttypes_hash = nullptr;
142}
143
145 const char *list_id,
146 char r_full_list_id[/*UI_MAX_NAME_STR*/])
147{
148 /* We tag the list id with the list type... */
149 BLI_snprintf(r_full_list_id, UI_MAX_NAME_STR, "%s_%s", ult->idname, list_id ? list_id : "");
150}
151
152const char *WM_uilisttype_list_id_get(const uiListType *ult, uiList *list)
153{
154 /* Some sanity check for the assumed behavior of #WM_uilisttype_to_full_list_id(). */
155 BLI_assert((list->list_id + strlen(ult->idname))[0] == '_');
156 /* +1 to skip the '_'. */
157 return list->list_id + strlen(ult->idname) + 1;
158}
#define BLI_assert(a)
Definition BLI_assert.h:50
BLI_INLINE void * BLI_ghashIterator_getValue(GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
Definition BLI_ghash.h:303
#define GHASH_ITER(gh_iter_, ghash_)
Definition BLI_ghash.h:322
GHash * BLI_ghash_str_new_ex(const char *info, unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
bool BLI_ghash_remove(GHash *gh, const void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
Definition BLI_ghash.c:787
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
Definition BLI_ghash.c:731
void BLI_ghash_insert(GHash *gh, void *key, void *val)
Definition BLI_ghash.c:707
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
Definition BLI_ghash.c:860
#define LISTBASE_FOREACH(type, var, list)
size_t BLI_snprintf(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
#define printf
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
StructFreeFunc free
Definition RNA_types.hh:782
void * first
ListBase wm
Definition BKE_main.hh:239
ListBase screens
Definition BKE_main.hh:225
char idname[BKE_ST_MAXNAME]
ExtensionRNA rna_ext
uiListType * WM_uilisttype_find(const char *idname, bool quiet)
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)
void WM_uilisttype_to_full_list_id(const uiListType *ult, const char *list_id, char r_full_list_id[])
void WM_uilisttype_free()
static GHash * uilisttypes_hash
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)