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.
This commit is contained in:
parent
8016d8a4bd
commit
5fe1624b0e
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1360,6 +1360,13 @@ uiBut *uiDefIconTextButO_ptr(uiBlock *block,
|
|||
/* for passing inputs to ButO buttons */
|
||||
struct PointerRNA *UI_but_operator_ptr_get(uiBut *but);
|
||||
|
||||
void UI_but_context_ptr_set(uiBlock *block,
|
||||
uiBut *but,
|
||||
const char *name,
|
||||
const struct PointerRNA *ptr);
|
||||
const struct PointerRNA *UI_but_context_ptr_get(const uiBut *but,
|
||||
const char *name,
|
||||
const StructRNA *type CPP_ARG_DEFAULT(nullptr));
|
||||
struct bContextStore *UI_but_context_get(const uiBut *but);
|
||||
|
||||
void UI_but_unit_type_set(uiBut *but, int unit_type);
|
||||
|
|
|
@ -5951,6 +5951,17 @@ PointerRNA *UI_but_operator_ptr_get(uiBut *but)
|
|||
return but->opptr;
|
||||
}
|
||||
|
||||
void UI_but_context_ptr_set(uiBlock *block, uiBut *but, const char *name, const PointerRNA *ptr)
|
||||
{
|
||||
but->context = CTX_store_add(&block->contexts, name, ptr);
|
||||
but->context->used = true;
|
||||
}
|
||||
|
||||
const PointerRNA *UI_but_context_ptr_get(const uiBut *but, const char *name, const StructRNA *type)
|
||||
{
|
||||
return CTX_store_ptr_lookup(but->context, name, type);
|
||||
}
|
||||
|
||||
bContextStore *UI_but_context_get(const uiBut *but)
|
||||
{
|
||||
return but->context;
|
||||
|
|
Loading…
Reference in New Issue