From 5fe1624b0eba8267325f166de8e75c4d2dd6989b Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Tue, 26 Apr 2022 22:23:52 +0200 Subject: UI: Support setting context for buttons without layout It was possible to set context pointers for buttons via the layout, but not for buttons in places where the layout system wasn't used (where buttons are placed manually). This is needed for buttons in the Outliner, see D14653. --- source/blender/blenkernel/BKE_context.h | 5 +++++ source/blender/blenkernel/intern/context.c | 23 +++++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h index 584568b4a5e..f441203d9d6 100644 --- a/source/blender/blenkernel/BKE_context.h +++ b/source/blender/blenkernel/BKE_context.h @@ -10,6 +10,8 @@ /* XXX temporary, until AssetHandle is designed properly and queries can return a pointer to it. */ #include "DNA_asset_types.h" +#include "BLI_utildefines.h" + #include "DNA_listBase.h" #include "DNA_object_enums.h" #include "RNA_types.h" @@ -136,6 +138,9 @@ bContextStore *CTX_store_add(ListBase *contexts, const char *name, const Pointer bContextStore *CTX_store_add_all(ListBase *contexts, bContextStore *context); bContextStore *CTX_store_get(bContext *C); void CTX_store_set(bContext *C, bContextStore *store); +const PointerRNA *CTX_store_ptr_lookup(const bContextStore *store, + const char *name, + const StructRNA *type CPP_ARG_DEFAULT(nullptr)); bContextStore *CTX_store_copy(bContextStore *store); void CTX_store_free(bContextStore *store); void CTX_store_free_list(ListBase *contexts); diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c index 63efbb99368..1f1a49ca030 100644 --- a/source/blender/blenkernel/intern/context.c +++ b/source/blender/blenkernel/intern/context.c @@ -190,6 +190,22 @@ void CTX_store_set(bContext *C, bContextStore *store) C->wm.store = store; } +const PointerRNA *CTX_store_ptr_lookup(const bContextStore *store, + const char *name, + const StructRNA *type) +{ + bContextStoreEntry *entry = BLI_rfindstring( + &store->entries, name, offsetof(bContextStoreEntry, name)); + if (!entry) { + return NULL; + } + + if (type && !RNA_struct_is_a(entry->ptr.type, type)) { + return NULL; + } + return &entry->ptr; +} + bContextStore *CTX_store_copy(bContextStore *store) { bContextStore *ctx = MEM_dupallocN(store); @@ -324,11 +340,10 @@ static eContextResult ctx_data_get(bContext *C, const char *member, bContextData if (done != 1 && recursion < 1 && C->wm.store) { C->data.recursion = 1; - bContextStoreEntry *entry = BLI_rfindstring( - &C->wm.store->entries, member, offsetof(bContextStoreEntry, name)); + const PointerRNA *ptr = CTX_store_ptr_lookup(C->wm.store, member, NULL); - if (entry) { - result->ptr = entry->ptr; + if (ptr) { + result->ptr = *ptr; done = 1; } } -- cgit v1.2.3