diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index fbd7dcd61f2..279239fcc65 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -1816,6 +1816,29 @@ static void ui_but_validate(const uiBut *but) } #endif +/** + * Check if the operator \a ot poll is successfull with the context given by \a but (optionally). + * \param but: The button that might store context. Can be NULL for convenience (e.g. if there is + * no button to take context from, but we still want to poll the operator). + */ +bool ui_but_context_poll_operator(bContext *C, wmOperatorType *ot, const uiBut *but) +{ + bool result; + int opcontext = but ? but->opcontext : WM_OP_INVOKE_DEFAULT; + + if (but && but->context) { + CTX_store_set(C, but->context); + } + + result = WM_operator_poll_context(C, ot, opcontext); + + if (but && but->context) { + CTX_store_set(C, NULL); + } + + return result; +} + void UI_block_end_ex(const bContext *C, uiBlock *block, const int xy[2], int r_xy[2]) { wmWindow *window = CTX_wm_window(C); @@ -1841,17 +1864,9 @@ void UI_block_end_ex(const bContext *C, uiBlock *block, const int xy[2], int r_x if (but->optype) { wmOperatorType *ot = but->optype; - if (but->context) { - CTX_store_set((bContext *)C, but->context); - } - - if (ot == NULL || WM_operator_poll_context((bContext *)C, ot, but->opcontext) == 0) { + if (ot == NULL || !ui_but_context_poll_operator((bContext *)C, ot, but)) { but->flag |= UI_BUT_DISABLED; } - - if (but->context) { - CTX_store_set((bContext *)C, NULL); - } } const AnimationEvalContext anim_eval_context = BKE_animsys_eval_context_construct( diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 1d4a44e0c76..d9cfe97a3eb 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -647,6 +647,8 @@ extern bool ui_but_menu_draw_as_popover(const uiBut *but); void ui_but_range_set_hard(uiBut *but); void ui_but_range_set_soft(uiBut *but); +bool ui_but_context_poll_operator(struct bContext *C, struct wmOperatorType *ot, const uiBut *but); + extern void ui_but_update(uiBut *but); extern void ui_but_update_edited(uiBut *but); extern bool ui_but_is_float(const uiBut *but) ATTR_WARN_UNUSED_RESULT;