diff options
author | Julian Eisel <julian@blender.org> | 2021-11-23 20:32:23 +0300 |
---|---|---|
committer | Julian Eisel <julian@blender.org> | 2021-11-23 20:34:51 +0300 |
commit | 792badcfefcb92aadc16346f0dc11299a8da0ced (patch) | |
tree | 14feae7d3b2706d9a912273d804c355b66f06829 /source/blender/editors/interface | |
parent | fb4851fbbc37eaea8b46fb8d237674555f9337a0 (diff) |
Fix broken handling of constraints reordering with library overrides
Alternative to D13291 (description partially copied from there).
New drag & drop reordering code would call constraints reordering
operator with the generic context, and not the one from the panel's
layout. missing the "constraint" member which is mandatory for poll
function to properly deal with override vs. local constraints.
For this to work in a decent way, there needs to be some panel-wide
context that we can restore when executing callbacks outside of the
normal draw context. So similar to uiLayoutSetContextPointer() to set
context on a layout level, this introduces
UI_panel_context_pointer_set() for panel level context (this calls the
former for the current panel root layout as well).
Differential Revision: https://developer.blender.org/D13308
Diffstat (limited to 'source/blender/editors/interface')
-rw-r--r-- | source/blender/editors/interface/interface_panel.c | 15 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_templates.c | 7 |
2 files changed, 21 insertions, 1 deletions
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index 072362492d8..3a8e06a3e49 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -486,8 +486,12 @@ static void reorder_instanced_panel_list(bContext *C, ARegion *region, Panel *dr /* Set the bit to tell the interface to instanced the list. */ drag_panel->flag |= PNL_INSTANCED_LIST_ORDER_CHANGED; + CTX_store_set(C, drag_panel->runtime.context); + /* Finally, move this panel's list item to the new index in its list. */ drag_panel->type->reorder(C, drag_panel, move_to_index); + + CTX_store_set(C, NULL); } /** @@ -2458,6 +2462,17 @@ static void ui_panel_custom_data_set_recursive(Panel *panel, PointerRNA *custom_ } } +/** + * Set a context for this entire panel and its current layout. This should be used whenever panel + * callbacks that are called outside of regular drawing might require context. Currently it affects + * the #PanelType.reorder callback only. + */ +void UI_panel_context_pointer_set(Panel *panel, const char *name, PointerRNA *ptr) +{ + uiLayoutSetContextPointer(panel->layout, name, ptr); + panel->runtime.context = uiLayoutGetContextStore(panel->layout); +} + void UI_panel_custom_data_set(Panel *panel, PointerRNA *custom_data) { BLI_assert(panel->type != NULL); diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 1d349aa0596..ac2f1bc090c 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -2727,7 +2727,12 @@ static void draw_constraint_header(uiLayout *layout, Object *ob, bConstraint *co PointerRNA ptr; RNA_pointer_create(&ob->id, &RNA_Constraint, con, &ptr); - uiLayoutSetContextPointer(layout, "constraint", &ptr); + if (block->panel) { + UI_panel_context_pointer_set(block->panel, "constraint", &ptr); + } + else { + uiLayoutSetContextPointer(layout, "constraint", &ptr); + } /* Constraint type icon. */ uiLayout *sub = uiLayoutRow(layout, false); |