[Bf-blender-cvs] [f678714] wiggly-widgets: Use general exit callback called after widget tweaking

Julian Eisel noreply at git.blender.org
Sun Feb 7 22:42:35 CET 2016


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




More information about the Bf-blender-cvs mailing list