UI: split ui_button_execute_do into begin/end
authorCampbell Barton <ideasman42@gmail.com>
Fri, 7 Feb 2014 22:12:59 +0000 (09:12 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 7 Feb 2014 22:42:26 +0000 (09:42 +1100)
source/blender/editors/interface/interface.c
source/blender/editors/interface/interface_handlers.c
source/blender/editors/interface/interface_intern.h

index 40e3b15e191f69911e476b522fc9335e7837487f..8ad96b4f32579dd186b2a1c4f1946ff849418cdf 100644 (file)
@@ -723,7 +723,11 @@ bool uiButActiveOnly(const bContext *C, ARegion *ar, uiBlock *block, uiBut *but)
 /* simulate button click */
 void uiButExecute(const bContext *C, uiBut *but)
 {
-       ui_button_execute_do((bContext *)C, CTX_wm_region(C), but);
+       ARegion *ar = CTX_wm_region(C);
+       void *active_back;
+       ui_button_execute_begin((bContext *)C, ar, but, &active_back);
+       /* Value is applied in begin. No further action required. */
+       ui_button_execute_end((bContext *)C, ar, but, active_back);
 }
 
 /* use to check if we need to disable undo, but don't make any changes
index b5d7bbd022a4dbb92a06c9b16ae1e869049dd57e..625e38e3d00d4474a346969bc3b918866e1e184c 100644 (file)
@@ -6662,18 +6662,25 @@ void ui_button_activate_do(bContext *C, ARegion *ar, uiBut *but)
        ui_do_button(C, but->block, but, &event);
 }
 
-void ui_button_execute_do(struct bContext *C, struct ARegion *ar, uiBut *but)
+void ui_button_execute_begin(struct bContext *UNUSED(C), struct ARegion *ar, uiBut *but, void **active_back)
 {
        /* note: ideally we would not have to change 'but->active' howevwer
         * some functions we call don't use data (as they should be doing) */
-       void *active_back = but->active;
-       uiHandleButtonData *data = MEM_callocN(sizeof(uiHandleButtonData), "uiHandleButtonData_Fake");
+       uiHandleButtonData *data;
+       *active_back = but->active;
+       data = MEM_callocN(sizeof(uiHandleButtonData), "uiHandleButtonData_Fake");
        but->active = data;
        data->region = ar;
-       ui_apply_button(C, but->block, but, data, true);
-       /* use onfree event so undo is handled by caller and apply is already done above */
+}
+
+void ui_button_execute_end(struct bContext *C, struct ARegion *UNUSED(ar), uiBut *but, void *active_back)
+{
+       ui_apply_button(C, but->block, but, but->active, true);
+
        ui_apply_autokey(C, but);
-       button_activate_exit((bContext *)C, but, data, false, true);
+
+       /* use onfree event so undo is handled by caller and apply is already done above */
+       button_activate_exit((bContext *)C, but, but->active, false, true);
        but->active = active_back;
 }
 
index f3d720305bfb5b9feff7d2a6d42f4084ce4791f0..928ad8a4466e50aa6efde8149308ae85e86133f4 100644 (file)
@@ -521,7 +521,8 @@ void ui_draw_but_NODESOCKET(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol
 PointerRNA *ui_handle_afterfunc_add_operator(struct wmOperatorType *ot, int opcontext, bool create_props);
 extern void ui_pan_to_scroll(const struct wmEvent *event, int *type, int *val);
 extern void ui_button_activate_do(struct bContext *C, struct ARegion *ar, uiBut *but);
-extern void ui_button_execute_do(struct bContext *C, struct ARegion *ar, uiBut *but);
+extern void ui_button_execute_begin(struct bContext *C, struct ARegion *ar, uiBut *but, void **active_back);
+extern void ui_button_execute_end(struct bContext *C, struct ARegion *ar, uiBut *but, void *active_back);
 extern void ui_button_active_free(const struct bContext *C, uiBut *but);
 extern bool ui_button_is_active(struct ARegion *ar) ATTR_WARN_UNUSED_RESULT;
 extern int ui_button_open_menu_direction(uiBut *but);