Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Eisel <julian@blender.org>2021-03-24 16:05:57 +0300
committerJulian Eisel <julian@blender.org>2021-03-24 16:28:25 +0300
commitd37deb19bebffcd2abae6c409a2c135adf08f0cd (patch)
tree112e9b7a67960040363c9d6a2fb8cd8f787f5880 /source/blender/editors/interface/interface.c
parent781f41f633fc61033423ebae657c0495ab9d131b (diff)
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.
Diffstat (limited to 'source/blender/editors/interface/interface.c')
-rw-r--r--source/blender/editors/interface/interface.c33
1 files changed, 24 insertions, 9 deletions
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(