[Bf-blender-cvs] [a99f5a7] wiggly-widgets: Add stub operator for widget operation so it is blocking and events do not get lost when region changes.
Antony Riakiotakis
noreply at git.blender.org
Fri Nov 28 16:35:45 CET 2014
Commit: a99f5a7463f8b3579d66d44a0af6af1895b4ec3e
Author: Antony Riakiotakis
Date: Thu Nov 27 11:35:50 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rBa99f5a7463f8b3579d66d44a0af6af1895b4ec3e
Add stub operator for widget operation so it is blocking and events do not get
lost when region changes.
===================================================================
M source/blender/windowmanager/intern/wm_event_system.c
M source/blender/windowmanager/intern/wm_generic_widgets.c
M source/blender/windowmanager/intern/wm_operators.c
M source/blender/windowmanager/intern/wm_widgets.c
M source/blender/windowmanager/wm.h
===================================================================
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index e76421f..e371519 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1590,7 +1590,6 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
break;
case LEFTMOUSE:
- {
if (event->val == KM_RELEASE) {
ARegion *ar = CTX_wm_region(C);
if (widget->prop)
@@ -1600,7 +1599,7 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
handler->op_widget = NULL;
}
break;
- }
+
default:
if (!widget->prop) {
retval = ot->modal(C, op, event);
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 05deb30..99676ee 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -340,10 +340,7 @@ static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event,
}
/* set the property for the operator and call its modal function */
- if (op && widget->propname) {
-
- }
- else if (widget->prop) {
+ if (widget->prop) {
float value;
value = data->orig_offset + facdir * len_v3(offset);
@@ -367,6 +364,9 @@ static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event,
else
arrow->offset = RNA_property_float_get(widget->ptr, widget->prop);
}
+ else if (op && widget->propname) {
+
+ }
else {
arrow->offset = facdir * len_v3(offset);
}
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index f993f82..89f5e6b 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -4498,6 +4498,36 @@ static void WM_OT_radial_control(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "secondary_tex", false, "Secondary Texture", "Tweak brush secondary/mask texture");
}
+/* ************************** widget property tweak *************** */
+
+static int widget_tweak_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
+{
+ WM_event_add_modal_handler(C, op);
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static int widget_tweak_modal(bContext *UNUSED(C), wmOperator *UNUSED(op), const wmEvent *event)
+{
+ if (event->type == EVT_WIDGET_RELEASED)
+ return OPERATOR_FINISHED;
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static void WM_OT_widget_tweak(wmOperatorType *ot)
+{
+ ot->name = "Radial Control";
+ ot->idname = "WM_OT_widget_tweak";
+ ot->description = "Tweak property attached to a widget";
+
+ ot->invoke = widget_tweak_invoke;
+ ot->modal = widget_tweak_modal;
+
+ ot->flag = OPTYPE_REGISTER | OPTYPE_BLOCKING | OPTYPE_UNDO;
+}
+
+
+
/* ************************** timer for testing ***************** */
/* uses no type defines, fully local testing function anyway... ;) */
@@ -4737,6 +4767,7 @@ void wm_operatortype_init(void)
WM_operatortype_append(WM_OT_call_menu);
WM_operatortype_append(WM_OT_call_menu_pie);
WM_operatortype_append(WM_OT_radial_control);
+ WM_operatortype_append(WM_OT_widget_tweak);
#if defined(WIN32)
WM_operatortype_append(WM_OT_console_toggle);
#endif
diff --git a/source/blender/windowmanager/intern/wm_widgets.c b/source/blender/windowmanager/intern/wm_widgets.c
index f602f1e..6c4eb8b 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -620,9 +620,12 @@ void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C
/* widget does nothing, pass */
wmap->active_widget = NULL;
}
- else if (widget->opname) {
- wmOperatorType *ot = WM_operatortype_find(widget->opname, 0);
-
+ else if (widget->opname || widget->ptr) {
+ wmOperatorType *ot;
+ const char *opname = (widget->opname) ? widget->opname : "WM_OT_widget_tweak";
+
+ ot = WM_operatortype_find(opname, 0);
+
if (ot) {
widget->flag |= WM_WIDGET_ACTIVE;
/* first activate the widget itself */
@@ -630,15 +633,15 @@ void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C
widget->activate_state(C, event, widget, WIDGET_ACTIVATE);
}
- WM_operator_properties_alloc(&widget->ptr, &widget->properties, widget->opname);
+ WM_operator_properties_alloc(&widget->opptr, &widget->properties, opname);
/* time to initialize those properties now */
if (widget->initialize_op) {
- widget->initialize_op(C, event, widget, widget->ptr);
+ widget->initialize_op(C, event, widget, widget->opptr);
}
CTX_wm_widget_set(C, widget);
- WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, widget->ptr);
+ WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, widget->opptr);
wmap->active_widget = widget;
return;
}
@@ -648,16 +651,6 @@ void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C
return;
}
}
- /* no operator, but we have a pointer */
- else if (widget->ptr) {
- /* first activate the widget itself */
- if (widget->activate_state) {
- widget->activate_state(C, event, widget, WIDGET_ACTIVATE);
- }
-
- CTX_wm_widget_set(C, widget);
- wmap->active_widget = widget;
- }
else {
/* widget does nothing, pass */
wmap->active_widget = NULL;
@@ -675,16 +668,11 @@ void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C
widget->activate_state(C, event, widget, WIDGET_DEACTIVATE);
}
- if (widget->opname && widget->ptr) {
- WM_operator_properties_free(widget->ptr);
- MEM_freeN(widget->ptr);
+ if (widget->opptr) {
+ WM_operator_properties_free(widget->opptr);
+ MEM_freeN(widget->opptr);
widget->properties = NULL;
- widget->ptr = NULL;
- }
- else if (widget->prop) {
- char undo_str[256];
- BLI_snprintf(undo_str, 256, "widget_undo: %s", RNA_property_ui_name(widget->prop));
- ED_undo_push(C, undo_str);
+ widget->opptr = NULL;
}
}
diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h
index ac6ff16..5460a42 100644
--- a/source/blender/windowmanager/wm.h
+++ b/source/blender/windowmanager/wm.h
@@ -101,6 +101,7 @@ typedef struct wmWidget {
/* operator properties if widget spawns and controls an operator, or owner pointer if widget spawns and controls a property */
struct PointerRNA *ptr;
+ struct PointerRNA *opptr;
struct IDProperty *properties; /* operator properties, assigned to ptr->data and can be written to a file */
struct PropertyRNA *prop;
} wmWidget;
More information about the Bf-blender-cvs
mailing list