Cleanup: Move button context based operator poll into utility function

Using the button context for operators is useful for other cases as well (where
the operator isn't the button operator itself). For example we'll need this for
the asset view UI template, where there will be additional operators that
should be able to act on button context.
This commit is contained in:
Julian Eisel 2021-03-24 14:05:57 +01:00
parent 781f41f633
commit d37deb19be
2 changed files with 26 additions and 9 deletions

View File

@ -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(

View File

@ -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;