diff --git a/source/blender/editors/interface/interface_context_menu.cc b/source/blender/editors/interface/interface_context_menu.cc index 3e22629ee9d..018dcae387a 100644 --- a/source/blender/editors/interface/interface_context_menu.cc +++ b/source/blender/editors/interface/interface_context_menu.cc @@ -471,6 +471,15 @@ static void ui_but_menu_add_path_operators(uiLayout *layout, PointerRNA *ptr, Pr RNA_string_set(&props_ptr, "filepath", dir); } +static void set_layout_context_from_button(bContext *C, uiLayout *layout, uiBut *but) +{ + if (!but->context) { + return; + } + uiLayoutContextCopy(layout, but->context); + CTX_store_set(C, uiLayoutGetContextStore(layout)); +} + bool ui_popup_context_menu_for_button(bContext *C, uiBut *but, const wmEvent *event) { /* ui_but_is_interactive() may let some buttons through that should not get a context menu - it @@ -494,10 +503,7 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but, const wmEvent *ev MEM_freeN(label.strinfo); } - if (but->context) { - uiLayoutContextCopy(layout, but->context); - CTX_store_set(C, uiLayoutGetContextStore(layout)); - } + set_layout_context_from_button(C, layout, but); uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT); } @@ -940,7 +946,16 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but, const wmEvent *ev event->xy); if (view_item_but) { BLI_assert(view_item_but->type == UI_BTYPE_VIEW_ITEM); - UI_view_item_context_menu_build(C, view_item_but->view_item, uiLayoutColumn(layout, false)); + + bContextStore *prev_ctx = CTX_store_get(C); + /* Sub-layout for context override. */ + uiLayout *sub = uiLayoutColumn(layout, false); + set_layout_context_from_button(C, sub, view_item_but); + UI_view_item_context_menu_build(C, view_item_but->view_item, sub); + + /* Reset context. */ + CTX_store_set(C, prev_ctx); + uiItemS(layout); } }