[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