Commit: f6787143a4f616ac1355e4e19165f5e403bac4d3
Author: Julian Eisel
Date:   Sun Feb 7 22:40:57 2016 +0100
Branches: wiggly-widgets
https://developer.blender.org/rBf6787143a4f616ac1355e4e19165f5e403bac4d3

Use general exit callback called after widget tweaking

Will be used to free data and reset property to initial value.

===================================================================

M       source/blender/windowmanager/intern/wm_generic_widgets.c
M       source/blender/windowmanager/intern/wm_widgets.c
M       source/blender/windowmanager/wm.h

===================================================================

diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c 
b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 81c1915..45a5596 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -602,12 +602,15 @@ static void widget_arrow_bind_to_prop(wmWidget *widget, 
const int UNUSED(slot))
                arrow->offset = 0.0f;
 }
 
-static void widget_arrow_cancel(bContext *C, wmWidget *widget)
+static void widget_arrow_exit(bContext *C, wmWidget *widget, const bool cancel)
 {
        PointerRNA ptr = widget->ptr[ARROW_SLOT_OFFSET_WORLD_SPACE];
        PropertyRNA *prop = widget->props[ARROW_SLOT_OFFSET_WORLD_SPACE];
        ArrowInteraction *data = widget->interaction_data;
 
+       if (!cancel)
+               return;
+
        /* reset property */
        RNA_property_float_set(&ptr, prop, data->orig_value);
        RNA_property_update(C, &ptr, prop);
@@ -656,7 +659,7 @@ wmWidget *WIDGET_arrow_new(wmWidgetGroup *wgroup, const 
char *name, const int st
        arrow->widget.invoke = widget_arrow_invoke;
        arrow->widget.render_3d_intersection = widget_arrow_render_3d_intersect;
        arrow->widget.bind_to_prop = widget_arrow_bind_to_prop;
-       arrow->widget.cancel = widget_arrow_cancel;
+       arrow->widget.exit = widget_arrow_exit;
        arrow->widget.flag |= (WM_WIDGET_SCALE_3D | WM_WIDGET_DRAW_ACTIVE);
 
        arrow->style = real_style;
@@ -1494,11 +1497,14 @@ static void widget_rect_transform_bind_to_prop(wmWidget 
*widget, const int slot)
                widget_rect_transform_get_property(widget, 
RECT_TRANSFORM_SLOT_SCALE, cage->scale);
 }
 
-static void widget_rect_transform_cancel(bContext *C, wmWidget *widget)
+static void widget_rect_transform_exit(bContext *C, wmWidget *widget, const 
bool cancel)
 {
        RectTransformWidget *cage = (RectTransformWidget *)widget;
        RectTransformInteraction *data = widget->interaction_data;
 
+       if (!cancel)
+               return;
+
        /* reset properties */
        if (widget->props[RECT_TRANSFORM_SLOT_OFFSET]) {
                PointerRNA ptr = widget->ptr[RECT_TRANSFORM_SLOT_OFFSET];
@@ -1536,7 +1542,7 @@ wmWidget *WIDGET_rect_transform_new(
        cage->widget.bind_to_prop = widget_rect_transform_bind_to_prop;
        cage->widget.handler = widget_rect_transform_handler;
        cage->widget.intersect = widget_rect_transform_intersect;
-       cage->widget.cancel = widget_rect_transform_cancel;
+       cage->widget.exit = widget_rect_transform_exit;
        cage->widget.get_cursor = widget_rect_transform_get_cursor;
        cage->widget.max_prop = 2;
        cage->widget.flag |= WM_WIDGET_DRAW_ACTIVE;
diff --git a/source/blender/windowmanager/intern/wm_widgets.c 
b/source/blender/windowmanager/intern/wm_widgets.c
index 8d4750e..c5a823e 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -913,22 +913,16 @@ enum {
        TWEAK_MODAL_PRECISION_OFF,
 };
 
-static void widget_tweak_finish(bContext *C, wmOperator *op)
+static void widget_tweak_finish(bContext *C, wmOperator *op, const bool cancel)
 {
        WidgetTweakData *wtweak = op->customdata;
+       if (wtweak->active->exit) {
+               wtweak->active->exit(C, wtweak->active, cancel);
+       }
        wm_widgetmap_set_active_widget(wtweak->wmap, C, NULL, NULL);
        MEM_freeN(wtweak);
 }
 
-static void widget_tweak_cancel(bContext *C, wmOperator *op)
-{
-       WidgetTweakData *wtweak = op->customdata;
-       if (wtweak->active->cancel) {
-               wtweak->active->cancel(C, wtweak->active);
-       }
-       widget_tweak_finish(C, op);
-}
-
 static int widget_tweak_modal(bContext *C, wmOperator *op, const wmEvent 
*event)
 {
        WidgetTweakData *wtweak = op->customdata;
@@ -940,7 +934,7 @@ static int widget_tweak_modal(bContext *C, wmOperator *op, 
const wmEvent *event)
        }
 
        if (event->type == wtweak->init_event && event->val == KM_RELEASE) {
-               widget_tweak_finish(C, op);
+               widget_tweak_finish(C, op, false);
                return OPERATOR_FINISHED;
        }
 
@@ -948,10 +942,10 @@ static int widget_tweak_modal(bContext *C, wmOperator 
*op, const wmEvent *event)
        if (event->type == EVT_MODAL_MAP) {
                switch (event->val) {
                        case TWEAK_MODAL_CANCEL:
-                               widget_tweak_cancel(C, op);
+                               widget_tweak_finish(C, op, true);
                                return OPERATOR_CANCELLED;
                        case TWEAK_MODAL_CONFIRM:
-                               widget_tweak_finish(C, op);
+                               widget_tweak_finish(C, op, false);
                                return OPERATOR_FINISHED;
                        case TWEAK_MODAL_PRECISION_ON:
                                wtweak->flag |= WM_WIDGET_TWEAK_PRECISE;
@@ -1029,7 +1023,6 @@ void WIDGETGROUP_OT_widget_tweak(wmOperatorType *ot)
        /* api callbacks */
        ot->invoke = widget_tweak_invoke;
        ot->modal = widget_tweak_modal;
-       ot->cancel = widget_tweak_cancel;
 }
 
 /** \} */ // Widget operators
diff --git a/source/blender/windowmanager/wm.h 
b/source/blender/windowmanager/wm.h
index 5d26afb..d48426a 100644
--- a/source/blender/windowmanager/wm.h
+++ b/source/blender/windowmanager/wm.h
@@ -79,8 +79,8 @@ typedef struct wmWidget {
        /* activate a widget state when the user clicks on it */
        int (*invoke)(struct bContext *C, const struct wmEvent *event, struct 
wmWidget *widget);
 
-       /* called after canceling widget handling - used to reset property */
-       void (*cancel)(struct bContext *C, struct wmWidget *widget);
+       /* called when widget tweaking is done - used to free data and reset 
property when cancelling */
+       void (*exit)(bContext *C, wmWidget *widget, const bool cancel);
 
        int (*get_cursor)(struct wmWidget *widget);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to