[Bf-blender-cvs] [388dc24] wiggly-widgets: Hook widget event to the lamp operator.

Antony Riakiotakis noreply at git.blender.org
Fri Oct 17 19:17:27 CEST 2014


Commit: 388dc243302ee522aedc7ee866cd45e61a91d890
Author: Antony Riakiotakis
Date:   Fri Oct 17 19:17:05 2014 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB388dc243302ee522aedc7ee866cd45e61a91d890

Hook widget event to the lamp operator.

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

M	source/blender/editors/interface/SConscript
M	source/blender/editors/object/object_lamp.c
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/windowmanager/SConscript
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_event_system.c
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/editors/interface/SConscript b/source/blender/editors/interface/SConscript
index beb2f09..303ab7f 100644
--- a/source/blender/editors/interface/SConscript
+++ b/source/blender/editors/interface/SConscript
@@ -28,7 +28,6 @@
 Import ('env')
 
 sources = env.Glob('*.c')
-sources += env.Glob('3d_widgets/*.c')
 
 incs = [
     '#/intern/guardedalloc',
@@ -45,7 +44,6 @@ incs = [
     # python button eval
     '../../python',
     '../../windowmanager',
-    '3d_widgets'
     ]
 
 defs = env['BF_GL_DEFINITIONS']
diff --git a/source/blender/editors/object/object_lamp.c b/source/blender/editors/object/object_lamp.c
index 7278b47..2f6ff57 100644
--- a/source/blender/editors/object/object_lamp.c
+++ b/source/blender/editors/object/object_lamp.c
@@ -60,6 +60,8 @@
 #include "UI_interface.h"
 #include "object_intern.h"
 
+#include "RNA_define.h"
+#include "RNA_access.h"
 
 typedef struct LampPositionData {
 	int pos[2];
@@ -145,6 +147,32 @@ static int lamp_position_modal(bContext *C, wmOperator *op, const wmEvent *event
 				MEM_freeN(op->customdata);
 				return OPERATOR_FINISHED;
 			}
+
+		case EVT_WIDGET_UPDATE:
+		{
+			ARegion *ar = CTX_wm_region(C);
+			Object *ob = CTX_data_active_object(C);
+			Lamp *la = ob->data;
+			float value[3], len;
+
+			RNA_float_get_array(op->ptr, "value", value);
+
+			sub_v3_v3(value, ob->obmat[3]);
+
+			len = len_v3(value);
+
+			la->spotsize = len * 0.1f;
+			DAG_id_tag_update(&ob->id, OB_RECALC_OB);
+
+			ED_region_tag_redraw(ar);
+			break;
+		}
+
+		case EVT_WIDGET_RELEASED:
+		{
+			MEM_freeN(op->customdata);
+			return OPERATOR_FINISHED;
+		}
 	}
 
 	return OPERATOR_RUNNING_MODAL;
@@ -172,6 +200,7 @@ void LAMP_OT_lamp_position(struct wmOperatorType *ot)
 	ot->flag = OPTYPE_BLOCKING | OPTYPE_UNDO;
 
 	/* properties */
+	RNA_def_float_vector_xyz(ot->srna, "value", 3, NULL, -FLT_MAX, FLT_MAX, "Vector", "", -FLT_MAX, FLT_MAX);
 }
 
 bool WIDGETGROUP_lamp_poll(struct wmWidgetGroup *UNUSED(wgroup), const struct bContext *C)
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 15391c7..ee20a43 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -738,7 +738,7 @@ static void view3d_widgets(void)
 	WIDGET_dial_set_color(manipulator->rotate_z, color_blue);
 	WM_widget_register(wgroup_manipulator, manipulator->rotate_z);
 
-	widget = WIDGET_arrow_new(0, NULL, "UI_OT_lamp_position", NULL, NULL);
+	widget = WIDGET_arrow_new(0, NULL, "UI_OT_lamp_position", "value", NULL);
 	WM_widget_register(wgroup_light,  widget);
 	WIDGET_arrow_set_color(widget, color_lamp);
 
diff --git a/source/blender/windowmanager/SConscript b/source/blender/windowmanager/SConscript
index b93192d..1e48a23 100644
--- a/source/blender/windowmanager/SConscript
+++ b/source/blender/windowmanager/SConscript
@@ -29,6 +29,7 @@ Import ('env')
 import os
 
 sources = env.Glob('intern/*.c')
+sources += env.Glob('3d_widgets/*.c')
 
 incs = [
     '.',
@@ -51,6 +52,7 @@ incs = [
     '../nodes',
     '../python',
     '../render/extern/include',
+    '3d_widgets',
     env['BF_ZLIB_INC'],
     ]
 incs = ' '.join(incs)
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 758d2e5..3c5bc39 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -474,7 +474,7 @@ struct wmWidget *WM_widget_new(void (*draw)(struct wmWidget *, const struct bCon
 							   void (*render_3d_intersection)(const struct bContext *, struct wmWidget *, float, int),
 							   int  (*intersect)(struct bContext *C, const struct wmEvent *event, struct wmWidget *customdata),
                                int  (*initialize_op)(struct bContext *, const struct wmEvent *, struct wmWidget *, struct PointerRNA *),
-                               int  (*handler)(struct bContext *, const struct wmEvent *, struct wmWidget *),
+                               int  (*handler)(struct bContext *, const struct wmEvent *, struct wmWidget *, struct wmOperator *op),
                                void *customdata, bool free_data, char *opname, char *prop);
 
 void WM_widgets_draw(const struct bContext *C, struct ARegion *ar);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 2334275..bdcc302 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1581,7 +1581,7 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
 
 				switch (event->type) {
 					case MOUSEMOVE:
-						if (widget->handler(C, event, widget) == OPERATOR_PASS_THROUGH) {
+						if (widget->handler(C, event, widget, op) == OPERATOR_PASS_THROUGH) {
 							event->type = EVT_WIDGET_UPDATE;
 							retval = ot->modal(C, op, event);
 						}
@@ -2004,7 +2004,7 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
 				switch (event->type) {
 					case MOUSEMOVE:
 						if (widget) {
-							widget->handler(C, event, widget);
+							widget->handler(C, event, widget, NULL);
 							action |= WM_HANDLER_BREAK;
 						}
 						else if (wm_widgetmap_is_3d(wmap)) {
@@ -2024,7 +2024,6 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
 								action |= WM_HANDLER_BREAK;
 							}
 							else {
-								widget->handler(C, event, widget);
 								action |= WM_HANDLER_BREAK;
 							}
 						}
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 12da73e..a5fabbd 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -187,7 +187,7 @@ typedef struct ArrowInteraction {
 	float proj_direction[2];
 } ArrowInteraction;
 
-static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget)
+static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct wmOperator *op)
 {
 	ArrowWidget *arrow = (ArrowWidget *)widget;
 	ArrowInteraction *data = widget->interaction_data;
@@ -230,14 +230,14 @@ static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event,
 	add_v3_v3v3(widget->origin, orig_origin, data->orig_origin);
 
 	/* set the property for the operator and call its modal function */
-	if (widget->prop) {
-		RNA_float_set_array(&widget->opptr, widget->prop, widget->origin);
+	if (op && widget->prop) {
+		RNA_float_set_array(op->ptr, widget->prop, widget->origin);
 	}
 
 	/* tag the region for redraw */
 	ED_region_tag_redraw(ar);
 
-	return OPERATOR_FINISHED;
+	return OPERATOR_PASS_THROUGH;
 }
 
 
diff --git a/source/blender/windowmanager/intern/wm_widgets.c b/source/blender/windowmanager/intern/wm_widgets.c
index a9f8ef2..b94e262 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -139,7 +139,7 @@ wmWidget *WM_widget_new(void (*draw)(struct wmWidget *customdata, const struct b
                         void (*render_3d_intersection)(const struct bContext *C, struct wmWidget *customdata, float scale, int selectionbase),
 						int  (*intersect)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget),
                         int  (*initialize_op)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct PointerRNA *),
-                        int  (*handler)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget),
+                        int  (*handler)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct wmOperator *op),
                         void *customdata, bool free_data, char *opname, char *prop)
 {
 	wmWidget *widget;
@@ -534,15 +534,15 @@ void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C
 					widget->activate_state(C, event, widget, WIDGET_ACTIVATE);
 				}
 
-				WM_operator_properties_create_ptr(&widget->opptr, ot);
+				WM_operator_properties_create_ptr(&widget->propptr, ot);
 
 				/* time to initialize those properties now */
 				if (widget->initialize_op) {
-					widget->initialize_op(C, event, widget, &widget->opptr);
+					widget->initialize_op(C, event, widget, &widget->propptr);
 				}
 
 				CTX_wm_widget_set(C, widget);
-				WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &widget->opptr);
+				WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &widget->propptr);
 				wmap->active_widget = widget;
 				return;
 			}
@@ -569,7 +569,7 @@ void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C
 				widget->activate_state(C, event, widget, WIDGET_DEACTIVATE);
 			}
 
-			WM_operator_properties_free(&widget->opptr);
+			WM_operator_properties_free(&widget->propptr);
 		}
 
 		CTX_wm_widget_set(C, NULL);
diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h
index 08781bb..d7c235d 100644
--- a/source/blender/windowmanager/wm.h
+++ b/source/blender/windowmanager/wm.h
@@ -37,6 +37,7 @@ struct wmEvent;
 struct wmWidgetMap;
 struct wmOperatorType;
 struct PointerRNA;
+struct wmOperator;
 
 typedef struct wmPaintCursor {
 	struct wmPaintCursor *next, *prev;
@@ -62,10 +63,10 @@ typedef struct wmWidget {
 	void (*render_3d_intersection)(const struct bContext *C, struct wmWidget *widget, float scale, int selectionbase);
 
 	/* initialize the operator properties when the user clicks the widget */
-	int (*initialize_op)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct PointerRNA *opptr);
+	int (*initialize_op)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct PointerRNA *propptr);
 
 	/* handler used by the widget. Usually handles interaction tied to a widget type */
-	int  (*handler)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget);
+	int  (*handler)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct wmOperator *op);
 
 	int  flag; /* flags

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list