Blender V4.3
wm_menu_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
13#include "BLI_sys_types.h"
14
16
17#include "MEM_guardedalloc.h"
18
19#include "BLI_ghash.h"
20#include "BLI_utildefines.h"
21
22#include "BKE_context.hh"
23#include "BKE_screen.hh"
24#include "BKE_workspace.hh"
25
26#include "WM_api.hh"
27#include "WM_types.hh"
28
29static GHash *menutypes_hash = nullptr;
30
31MenuType *WM_menutype_find(const char *idname, bool quiet)
32{
33 if (idname[0]) {
34 MenuType *mt = static_cast<MenuType *>(BLI_ghash_lookup(menutypes_hash, idname));
35 if (mt) {
36 return mt;
37 }
38 }
39
40 if (!quiet) {
41 printf("search for unknown menutype %s\n", idname);
42 }
43
44 return nullptr;
45}
46
51
53{
54 BLI_assert((mt->description == nullptr) || (mt->description[0]));
56 return true;
57}
58
60{
61 bool ok = BLI_ghash_remove(menutypes_hash, mt->idname, nullptr, MEM_freeN);
62
63 BLI_assert(ok);
65}
66
68{
69 /* Reserve size is set based on blender default setup. */
70 menutypes_hash = BLI_ghash_str_new_ex("menutypes_hash gh", 512);
71}
72
74{
75 GHashIterator gh_iter;
76
77 GHASH_ITER (gh_iter, menutypes_hash) {
78 MenuType *mt = static_cast<MenuType *>(BLI_ghashIterator_getValue(&gh_iter));
79 if (mt->rna_ext.free) {
80 mt->rna_ext.free(mt->rna_ext.data);
81 }
82 }
83
85 menutypes_hash = nullptr;
86}
87
89{
90 /* If we're tagged, only use compatible. */
91 if (mt->owner_id[0] != '\0') {
92 const WorkSpace *workspace = CTX_wm_workspace(C);
93 if (BKE_workspace_owner_id_check(workspace, mt->owner_id) == false) {
94 return false;
95 }
96 }
97
98 if (mt->poll != nullptr) {
99 return mt->poll(C, mt);
100 }
101 return true;
102}
103
105 const bContext * /*C*/,
106 PointerRNA * /*ptr*/,
107 PropertyRNA * /*prop*/,
108 const char * /*edit_text*/,
110{
111 GHashIterator gh_iter;
112 GHASH_ITER (gh_iter, menutypes_hash) {
113 MenuType *mt = static_cast<MenuType *>(BLI_ghashIterator_getValue(&gh_iter));
114
115 StringPropertySearchVisitParams visit_params{};
116 visit_params.text = mt->idname;
117 visit_params.info = mt->label;
118 visit_fn(visit_params);
119 }
120}
WorkSpace * CTX_wm_workspace(const bContext *C)
bool BKE_workspace_owner_id_check(const WorkSpace *workspace, const char *owner_id) ATTR_NONNULL()
Definition workspace.cc:536
#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
void BLI_ghashIterator_init(GHashIterator *ghi, GHash *gh)
Definition BLI_ghash.c:895
#define UNUSED_VARS_NDEBUG(...)
Read Guarded memory(de)allocation.
#define printf
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
StructFreeFunc free
Definition RNA_types.hh:782
const char * description
char label[BKE_ST_MAXNAME]
bool(* poll)(const bContext *C, MenuType *mt)
ExtensionRNA rna_ext
char idname[BKE_ST_MAXNAME]
char owner_id[128]
void WM_menutype_iter(GHashIterator *ghi)
void WM_menutype_free()
void WM_menutype_idname_visit_for_search(const bContext *, PointerRNA *, PropertyRNA *, const char *, blender::FunctionRef< void(StringPropertySearchVisitParams)> visit_fn)
bool WM_menutype_add(MenuType *mt)
MenuType * WM_menutype_find(const char *idname, bool quiet)
bool WM_menutype_poll(bContext *C, MenuType *mt)
void WM_menutype_init()
void WM_menutype_freelink(MenuType *mt)
static GHash * menutypes_hash