[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