diff options
author | Julian Eisel <julian@blender.org> | 2021-11-23 20:35:56 +0300 |
---|---|---|
committer | Julian Eisel <julian@blender.org> | 2021-11-23 20:35:56 +0300 |
commit | c09e8a35904d5c58882cbe93c5086e5f2450c80e (patch) | |
tree | be47fdedd56de6129052af7f8918f463ecbf031e /source/blender | |
parent | c0a2b2174415af228ecc27659d7cfb5148143a7f (diff) | |
parent | 792badcfefcb92aadc16346f0dc11299a8da0ced (diff) |
Merge branch 'blender-v3.0-release'
Diffstat (limited to 'source/blender')
8 files changed, 31 insertions, 8 deletions
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index c587425c47f..d5d45068828 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -1762,6 +1762,8 @@ void UI_panel_header_buttons_begin(struct Panel *panel); void UI_panel_header_buttons_end(struct Panel *panel); void UI_panel_end(struct Panel *panel, int width, int height); +void UI_panel_context_pointer_set(struct Panel *panel, const char *name, struct PointerRNA *ptr); + bool UI_panel_is_closed(const struct Panel *panel); bool UI_panel_is_active(const struct Panel *panel); void UI_panel_label_offset(const struct uiBlock *block, int *r_x, int *r_y); diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index 6acbaf03476..8d47b8a1011 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 b30a86c5fcf..cbd57176a31 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); diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencil_ui_common.c b/source/blender/gpencil_modifiers/intern/MOD_gpencil_ui_common.c index 2e241ea5848..ecadf744871 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencil_ui_common.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencil_ui_common.c @@ -232,7 +232,7 @@ PointerRNA *gpencil_modifier_panel_get_property_pointers(Panel *panel, PointerRN UI_block_lock_clear(block); UI_block_lock_set(block, ID_IS_LINKED((Object *)ptr->owner_id), ERROR_LIBDATA_MESSAGE); - uiLayoutSetContextPointer(panel->layout, "modifier", ptr); + UI_panel_context_pointer_set(panel, "modifier", ptr); return ptr; } @@ -312,7 +312,7 @@ static void gpencil_modifier_panel_header(const bContext *UNUSED(C), Panel *pane PointerRNA *ptr = UI_panel_custom_data_get(panel); GpencilModifierData *md = (GpencilModifierData *)ptr->data; - uiLayoutSetContextPointer(panel->layout, "modifier", ptr); + UI_panel_context_pointer_set(panel, "modifier", ptr); const GpencilModifierTypeInfo *mti = BKE_gpencil_modifier_get_info(md->type); bool narrow_panel = (panel->sizex < UI_UNIT_X * 9 && panel->sizex != 0); diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencildash.c b/source/blender/gpencil_modifiers/intern/MOD_gpencildash.c index 7d2eb4b2c75..6a4d0de5c80 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencildash.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencildash.c @@ -313,8 +313,6 @@ static void panel_draw(const bContext *C, Panel *panel) UI_TEMPLATE_LIST_FLAG_NONE); uiLayout *col = uiLayoutColumn(row, false); - uiLayoutSetContextPointer(col, "modifier", ptr); - uiLayout *sub = uiLayoutColumn(col, true); uiItemO(sub, "", ICON_ADD, "GPENCIL_OT_segment_add"); uiItemO(sub, "", ICON_REMOVE, "GPENCIL_OT_segment_remove"); diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h index f15767ff692..a4c254d6e5a 100644 --- a/source/blender/makesdna/DNA_screen_types.h +++ b/source/blender/makesdna/DNA_screen_types.h @@ -154,6 +154,9 @@ typedef struct Panel_Runtime { /* Pointer to the panel's block. Useful when changes to panel #uiBlocks * need some context from traversal of the panel "tree". */ struct uiBlock *block; + + /* Non-owning pointer. The context is stored in the block. */ + struct bContextStore *context; } Panel_Runtime; /** The part from uiBlock that needs saved in file. */ diff --git a/source/blender/modifiers/intern/MOD_ui_common.c b/source/blender/modifiers/intern/MOD_ui_common.c index 9937a2342c3..cbeb429a94c 100644 --- a/source/blender/modifiers/intern/MOD_ui_common.c +++ b/source/blender/modifiers/intern/MOD_ui_common.c @@ -132,7 +132,7 @@ PointerRNA *modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ uiBlock *block = uiLayoutGetBlock(panel->layout); UI_block_lock_set(block, ID_IS_LINKED((Object *)ptr->owner_id), ERROR_LIBDATA_MESSAGE); - uiLayoutSetContextPointer(panel->layout, "modifier", ptr); + UI_panel_context_pointer_set(panel, "modifier", ptr); return ptr; } @@ -304,7 +304,7 @@ static void modifier_panel_header(const bContext *C, Panel *panel) ModifierData *md = (ModifierData *)ptr->data; Object *ob = (Object *)ptr->owner_id; - uiLayoutSetContextPointer(panel->layout, "modifier", ptr); + UI_panel_context_pointer_set(panel, "modifier", ptr); const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type); Scene *scene = CTX_data_scene(C); diff --git a/source/blender/shader_fx/intern/FX_ui_common.c b/source/blender/shader_fx/intern/FX_ui_common.c index de5bef5d8d5..b3d8b46f961 100644 --- a/source/blender/shader_fx/intern/FX_ui_common.c +++ b/source/blender/shader_fx/intern/FX_ui_common.c @@ -117,7 +117,7 @@ PointerRNA *shaderfx_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ RNA_pointer_create(ptr->owner_id, &RNA_Object, ptr->owner_id, r_ob_ptr); } - uiLayoutSetContextPointer(panel->layout, "shaderfx", ptr); + UI_panel_context_pointer_set(panel, "shaderfx", ptr); return ptr; } |