[Bf-blender-cvs] [dd43f9c] wiggly-widgets: Cage widget now does something useful (tm). Basically, we can now transform the x direction of the backdrop in sequencer when a viewer node is active.

Antony Riakiotakis noreply at git.blender.org
Fri Nov 21 18:05:51 CET 2014


Commit: dd43f9c056c9cabbe62e2fc799a60d1a9b7b5baa
Author: Antony Riakiotakis
Date:   Fri Nov 21 18:05:39 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rBdd43f9c056c9cabbe62e2fc799a60d1a9b7b5baa

Cage widget now does something useful (tm). Basically, we can now
transform the x direction of the backdrop in sequencer when a viewer
node is active.

There are still some issues with property transform not being a proper
operator, but we can fix that easily.

To make full 2D transform work we need positions stored in one property.

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

M	source/blender/editors/space_node/space_node.c
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/intern/wm_generic_widgets.c

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

diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index b1764eb..3e2dc18 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -832,6 +832,10 @@ static int node_context(const bContext *C, const char *member, bContextDataResul
 static void WIDGETGROUP_node_transform_create(struct wmWidgetGroup *wgroup)
 {
 	wmWidget *widget = WIDGET_cage_new(0, NULL);
+	PointerRNA *nodeptr = MEM_callocN(sizeof(PointerRNA), "nodewidgetptr");
+
+	WM_widgetgroup_customdata_set(wgroup, nodeptr);
+	
 	WM_widget_register(wgroup, widget);
 }
 
@@ -863,6 +867,7 @@ static void WIDGETGROUP_node_transform_update(struct wmWidgetGroup *wgroup, cons
 		ARegion *ar = CTX_wm_region(C);
 		float origin[3];
 		float xsize, ysize;
+		PointerRNA *nodeptr = WM_widgetgroup_customdata(wgroup);
 
 		xsize = snode->zoom * ibuf->x;
 		ysize = snode->zoom * ibuf->y;
@@ -870,9 +875,12 @@ static void WIDGETGROUP_node_transform_update(struct wmWidgetGroup *wgroup, cons
 		origin[0] = (ar->winx - xsize) / 2 + snode->xof;
 		origin[1] = (ar->winy - ysize) / 2 + snode->yof;
 
+		RNA_pointer_create(snode->id, &RNA_SpaceNodeEditor, snode, nodeptr);
+		
 		WIDGET_cage_bounds_set(cage, xsize, ysize);
 		WM_widget_set_origin(cage, origin);
 		WM_widget_set_draw(cage, true);
+		WM_widget_property(cage, nodeptr, "backdrop_x");
 	}
 	else {
 		WM_widget_set_draw(cage, false);
@@ -880,9 +888,11 @@ static void WIDGETGROUP_node_transform_update(struct wmWidgetGroup *wgroup, cons
 	BKE_image_release_ibuf(ima, ibuf, lock);
 }
 
-static void WIDGETGROUP_node_transform_free(struct wmWidgetGroup *UNUSED(wgroup))
+static void WIDGETGROUP_node_transform_free(struct wmWidgetGroup *wgroup)
 {
+	PointerRNA *nodeptr = WM_widgetgroup_customdata(wgroup);
 
+	MEM_freeN(nodeptr);
 }
 
 static void node_widgets(void)
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index ab3a808..0bf0dea 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -738,13 +738,13 @@ static void WIDGETGROUP_camera_create(struct wmWidgetGroup *wgroup)
 	wmWidget *widget = NULL;
 	PointerRNA *cameraptr = MEM_callocN(sizeof(PointerRNA), "camerawidgetptr");
 
+	WM_widgetgroup_customdata_set(wgroup, cameraptr);
+	
 	widget = WIDGET_arrow_new(UI_ARROW_STYLE_CROSS, NULL);
 	WM_widget_set_draw_on_hover_only(widget, true);
 	WM_widget_set_3d_scale(widget, false);
 	WM_widget_register(wgroup, widget);
 	WIDGET_arrow_set_color(widget, color_camera);
-
-	WM_widgetgroup_customdata_set(wgroup, cameraptr);
 }
 
 
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 2cc66ff..e76421f 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -2021,7 +2021,7 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
 						}
 						else {
 							widget = wm_widget_find_highlighted(wmap, C, event);
-							wm_widgetmap_set_highlighted_widget(wmap, C, NULL);
+							wm_widgetmap_set_highlighted_widget(wmap, C, widget);
 						}
 						break;
 
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 2552457..05deb30 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -623,6 +623,7 @@ void WIDGET_dial_set_direction(struct wmWidget *widget, float direction[3])
 typedef struct CageWidget {
 	wmWidget widget;
 	float rotation;
+	float offset;
 	rctf bound;
 	int style;
 } CageWidget;
@@ -696,15 +697,78 @@ static int widget_cage_intersect(struct bContext *UNUSED(C), const struct wmEven
 	float mouse[2] = {event->mval[0], event->mval[1]};
 	float pointrot[2];
 	float matrot[2][2];
+	bool isect;
 
 	/* rotate mouse in relation to the center and relocate it */
 	sub_v2_v2v2(pointrot, mouse, widget->origin);
 
 	rotate_m2(matrot, -cage->rotation);
 
-	add_v2_v2(pointrot, widget->origin);
+	isect = BLI_rctf_isect_pt_v(&cage->bound, pointrot);
+	
+	return isect;
+}
+
+typedef struct CageInteraction {
+	float orig_offset;
+	float orig_mouse[2];
+	float orig_origin[2];
+} CageInteraction;
+
+static int widget_cage_activate(struct bContext *UNUSED(C), const struct wmEvent *event, struct wmWidget *widget, int state)
+{
+	if (state == WIDGET_ACTIVATE) {
+		CageWidget *cage = (CageWidget *) widget;
+		CageInteraction *data = MEM_callocN(sizeof (CageInteraction), "cage_interaction");
+
+		if (widget->prop) {
+			data->orig_offset = cage->offset;
+		}
+
+		data->orig_mouse[0] = event->mval[0];
+		data->orig_mouse[1] = event->mval[1];
+
+		data->orig_origin[0] = widget->origin[0];
+		data->orig_origin[1] = widget->origin[1];
+		
+		widget->interaction_data = data;
+	}
+	else if (state == WIDGET_DEACTIVATE) {
+		MEM_freeN(widget->interaction_data);
+		widget->interaction_data = NULL;
+	}
+	
+	return OPERATOR_FINISHED;
+}
+
+static int widget_cage_handler(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct wmOperator *op)
+{
+//	CageWidget *cage = (CageWidget *) widget;
+	CageInteraction *data = widget->interaction_data;
+	ARegion *ar = CTX_wm_region(C);
+	
+	if (widget->prop) {
+		float value;
+		
+		value = data->orig_offset + (event->mval[0] - data->orig_mouse[0]);
+		
+		RNA_property_float_set(widget->ptr, widget->prop, value);
+		RNA_property_update(C, widget->ptr, widget->prop);
+		
+		widget->origin[0] = data->orig_origin[0] + (event->mval[0] - data->orig_mouse[0]);
+	}
+	
+	
+	/* tag the region for redraw */
+	ED_region_tag_redraw(ar);
+	
+	return OPERATOR_PASS_THROUGH;
+}
 
-	return BLI_rctf_isect_pt_v(&cage->bound, pointrot);
+static void widget_cage_bind_to_prop(struct wmWidget *widget)
+{
+	CageWidget *cage = (CageWidget *) widget;
+	cage->offset = RNA_property_float_get(widget->ptr, widget->prop);
 }
 
 struct wmWidget *WIDGET_cage_new(int style, void *customdata)
@@ -713,6 +777,9 @@ struct wmWidget *WIDGET_cage_new(int style, void *customdata)
 
 	cage->widget.customdata = customdata;
 	cage->widget.draw = widget_cage_draw;
+	cage->widget.activate_state = widget_cage_activate;
+	cage->widget.bind_to_prop = widget_cage_bind_to_prop;
+	cage->widget.handler = widget_cage_handler;
 	cage->widget.intersect = widget_cage_intersect;
 	cage->widget.user_scale = 1.0f;
 	cage->style = style;




More information about the Bf-blender-cvs mailing list