[Bf-blender-cvs] [3632366] wiggly-widgets: Fix widget tweaking undo after latest changes

Julian Eisel noreply at git.blender.org
Wed May 18 20:07:40 CEST 2016


Commit: 36323666dc980aaa692d9fce058fbedccc8467e5
Author: Julian Eisel
Date:   Wed May 18 20:03:02 2016 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB36323666dc980aaa692d9fce058fbedccc8467e5

Fix widget tweaking undo after latest changes

Property pointers are invalid after undo, so we need to set them again on widget-map refresh. Would be nicer if widget code could handle this behind the scenes, so the property only had to be set on _init, but for now this is sufficient.

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

M	source/blender/editors/space_node/space_node.c
M	source/blender/editors/space_sequencer/sequencer_view.c
M	source/blender/editors/space_view3d/view3d_widgets.c
M	source/blender/windowmanager/widgets/intern/wm_widgetgroup.c

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

diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index 88b15ef..b0e1c36 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -871,21 +871,15 @@ static int WIDGETGROUP_node_transform_poll(const struct bContext *C, struct wmWi
 	return false;
 }
 
-static void WIDGETGROUP_node_transform_init(const struct bContext *C, struct wmWidgetGroup *wgroup)
+static void WIDGETGROUP_node_transform_init(const struct bContext *UNUSED(C), struct wmWidgetGroup *wgroup)
 {
 	wmWidgetWrapper *wwrapper = MEM_mallocN(sizeof(wmWidgetWrapper), __func__);
-	SpaceNode *snode = CTX_wm_space_node(C);
-	PointerRNA nodeptr;
 
 	wwrapper->widget = WIDGET_rect_transform_new(
 	                       wgroup, "backdrop_cage",
 	                       WIDGET_RECT_TRANSFORM_STYLE_TRANSLATE | WIDGET_RECT_TRANSFORM_STYLE_SCALE_UNIFORM);
 	wgroup->customdata = wwrapper;
 
-	RNA_pointer_create(snode->id, &RNA_SpaceNodeEditor, snode, &nodeptr);
-
-	WM_widget_set_property(wwrapper->widget, RECT_TRANSFORM_SLOT_OFFSET, &nodeptr, "backdrop_offset");
-	WM_widget_set_property(wwrapper->widget, RECT_TRANSFORM_SLOT_SCALE, &nodeptr, "backdrop_zoom");
 }
 
 static void WIDGETGROUP_node_transform_refresh(const struct bContext *C, struct wmWidgetGroup *wgroup)
@@ -906,6 +900,13 @@ static void WIDGETGROUP_node_transform_refresh(const struct bContext *C, struct
 		WIDGET_rect_transform_set_dimensions(cage, w, h);
 		WM_widget_set_origin(cage, origin);
 		WM_widget_set_flag(cage, WM_WIDGET_HIDDEN, false);
+
+		/* need to set property here for undo. TODO would prefer to do this in _init */
+		SpaceNode *snode = CTX_wm_space_node(C);
+		PointerRNA nodeptr;
+		RNA_pointer_create(snode->id, &RNA_SpaceNodeEditor, snode, &nodeptr);
+		WM_widget_set_property(cage, RECT_TRANSFORM_SLOT_OFFSET, &nodeptr, "backdrop_offset");
+		WM_widget_set_property(cage, RECT_TRANSFORM_SLOT_SCALE, &nodeptr, "backdrop_zoom");
 	}
 	else {
 		WM_widget_set_flag(cage, WM_WIDGET_HIDDEN, true);
diff --git a/source/blender/editors/space_sequencer/sequencer_view.c b/source/blender/editors/space_sequencer/sequencer_view.c
index 6fc5e77..727fa49 100644
--- a/source/blender/editors/space_sequencer/sequencer_view.c
+++ b/source/blender/editors/space_sequencer/sequencer_view.c
@@ -462,6 +462,7 @@ static void widgetgroup_image_transform_refresh(const bContext *C, wmWidgetGroup
 	sequencer_display_size(CTX_data_scene(C), CTX_wm_space_seq(C), viewrect);
 	UI_view2d_scale_get(v2d, &scale[0], &scale[1]);
 
+	/* XXX hmmm, can't we do this in _init somehow? Issue is op->ptr is freed after OP is done. */
 	wmOperator *op = wgroup->type->op;
 	WM_widget_set_property(cage, RECT_TRANSFORM_SLOT_SCALE, op->ptr, "scale");
 
diff --git a/source/blender/editors/space_view3d/view3d_widgets.c b/source/blender/editors/space_view3d/view3d_widgets.c
index b57ec12..7e2a38f 100644
--- a/source/blender/editors/space_view3d/view3d_widgets.c
+++ b/source/blender/editors/space_view3d/view3d_widgets.c
@@ -70,11 +70,8 @@ int WIDGETGROUP_lamp_poll(const bContext *C, wmWidgetGroupType *UNUSED(wgrouptyp
 	return false;
 }
 
-void WIDGETGROUP_lamp_init(const bContext *C, wmWidgetGroup *wgroup)
+void WIDGETGROUP_lamp_init(const bContext *UNUSED(C), wmWidgetGroup *wgroup)
 {
-	Object *ob = CTX_data_active_object(C);
-	Lamp *la = ob->data;
-	PointerRNA ptr;
 	const char *propname = "spot_size";
 
 	const float color[4] = {0.5f, 0.5f, 1.0f, 1.0f};
@@ -85,22 +82,27 @@ void WIDGETGROUP_lamp_init(const bContext *C, wmWidgetGroup *wgroup)
 	wwrapper->widget = WIDGET_arrow_new(wgroup, propname, WIDGET_ARROW_STYLE_INVERTED);
 	wgroup->customdata = wwrapper;
 
-	RNA_pointer_create(&la->id, &RNA_Lamp, la, &ptr);
 	WIDGET_arrow_set_range_fac(wwrapper->widget, 4.0f);
 	WM_widget_set_colors(wwrapper->widget, color, color_hi);
-	WM_widget_set_property(wwrapper->widget, ARROW_SLOT_OFFSET_WORLD_SPACE, &ptr, propname);
 }
 
 void WIDGETGROUP_lamp_refresh(const bContext *C, wmWidgetGroup *wgroup)
 {
 	wmWidgetWrapper *wwrapper = wgroup->customdata;
 	Object *ob = CTX_data_active_object(C);
+	Lamp *la = ob->data;
 	float dir[3];
 
 	negate_v3_v3(dir, ob->obmat[2]);
 
 	WIDGET_arrow_set_direction(wwrapper->widget, dir);
 	WM_widget_set_origin(wwrapper->widget, ob->obmat[3]);
+
+	/* need to set property here for undo. TODO would prefer to do this in _init */
+	PointerRNA ptr;
+	const char *propname = "spot_size";
+	RNA_pointer_create(&la->id, &RNA_Lamp, la, &ptr);
+	WM_widget_set_property(wwrapper->widget, ARROW_SLOT_OFFSET_WORLD_SPACE, &ptr, propname);
 }
 
 int WIDGETGROUP_camera_poll(const bContext *C, wmWidgetGroupType *UNUSED(wgrouptype))
@@ -137,26 +139,22 @@ void WIDGETGROUP_camera_init(const bContext *C, wmWidgetGroup *wgroup)
 {
 	Object *ob = CTX_data_active_object(C);
 	Camera *ca = ob->data;
-	PointerRNA cameraptr;
 	float dir[3];
 
 	CameraWidgetGroup *camgroup = MEM_callocN(sizeof(CameraWidgetGroup), __func__);
 	wgroup->customdata = camgroup;
 
-	RNA_pointer_create(&ca->id, &RNA_Camera, ca, &cameraptr);
 	negate_v3_v3(dir, ob->obmat[2]);
 
 	/* dof distance */
 	{
 		const float color[4] = {1.0f, 0.3f, 0.0f, 1.0f};
 		const float color_hi[4] = {1.0f, 0.3f, 0.0f, 1.0f};
-		const char *propname = "dof_distance";
 
-		camgroup->dop_dist = WIDGET_arrow_new(wgroup, propname, WIDGET_ARROW_STYLE_CROSS);
+		camgroup->dop_dist = WIDGET_arrow_new(wgroup, "dof_distance", WIDGET_ARROW_STYLE_CROSS);
 		WM_widget_set_flag(camgroup->dop_dist, WM_WIDGET_DRAW_HOVER, true);
 		WM_widget_set_flag(camgroup->dop_dist, WM_WIDGET_SCALE_3D, false);
 		WM_widget_set_colors(camgroup->dop_dist, color, color_hi);
-		WM_widget_set_property(camgroup->dop_dist, ARROW_SLOT_OFFSET_WORLD_SPACE, &cameraptr, propname);
 	}
 
 	/* focal length
@@ -171,7 +169,6 @@ void WIDGETGROUP_camera_init(const bContext *C, wmWidgetGroup *wgroup)
 		WM_widget_set_flag(camgroup->focallen, WM_WIDGET_SCALE_3D, false);
 		WM_widget_set_colors(camgroup->focallen, color, color_hi);
 		cameragroup_property_setup(camgroup->focallen, ob, ca, false);
-		WM_widget_set_property(camgroup->focallen, ARROW_SLOT_OFFSET_WORLD_SPACE, &cameraptr, "lens");
 
 		camgroup->ortho_scale = WIDGET_arrow_new(
 		                            wgroup, "ortho_scale",
@@ -179,7 +176,6 @@ void WIDGETGROUP_camera_init(const bContext *C, wmWidgetGroup *wgroup)
 		WM_widget_set_flag(camgroup->ortho_scale, WM_WIDGET_SCALE_3D, false);
 		WM_widget_set_colors(camgroup->ortho_scale, color, color_hi);
 		cameragroup_property_setup(camgroup->ortho_scale, ob, ca, true);
-		WM_widget_set_property(camgroup->ortho_scale, ARROW_SLOT_OFFSET_WORLD_SPACE, &cameraptr, "ortho_scale");
 	}
 }
 
@@ -191,8 +187,11 @@ void WIDGETGROUP_camera_refresh(const bContext *C, wmWidgetGroup *wgroup)
 	CameraWidgetGroup *camgroup = wgroup->customdata;
 	Object *ob = CTX_data_active_object(C);
 	Camera *ca = ob->data;
+	PointerRNA cameraptr;
 	float dir[3];
 
+	RNA_pointer_create(&ca->id, &RNA_Camera, ca, &cameraptr);
+
 	negate_v3_v3(dir, ob->obmat[2]);
 
 	if (ca->flag & CAM_SHOWLIMITS) {
@@ -201,6 +200,9 @@ void WIDGETGROUP_camera_refresh(const bContext *C, wmWidgetGroup *wgroup)
 		WM_widget_set_origin(camgroup->dop_dist, ob->obmat[3]);
 		WM_widget_set_scale(camgroup->dop_dist, ca->drawsize);
 		WM_widget_set_flag(camgroup->dop_dist, WM_WIDGET_HIDDEN, false);
+
+		/* need to set property here for undo. TODO would prefer to do this in _init */
+		WM_widget_set_property(camgroup->dop_dist, ARROW_SLOT_OFFSET_WORLD_SPACE, &cameraptr, "dof_distance");
 	}
 	else {
 		WM_widget_set_flag(camgroup->dop_dist, WM_WIDGET_HIDDEN, true);
@@ -240,6 +242,10 @@ void WIDGETGROUP_camera_refresh(const bContext *C, wmWidgetGroup *wgroup)
 		WM_widget_set_origin(widget, ob->obmat[3]);
 		WM_widget_set_offset(widget, offset);
 		WM_widget_set_scale(widget, drawsize);
+
+		/* need to set property here for undo. TODO would prefer to do this in _init */
+		WM_widget_set_property(camgroup->focallen, ARROW_SLOT_OFFSET_WORLD_SPACE, &cameraptr, "lens");
+		WM_widget_set_property(camgroup->ortho_scale, ARROW_SLOT_OFFSET_WORLD_SPACE, &cameraptr, "ortho_scale");
 	}
 }
 
diff --git a/source/blender/windowmanager/widgets/intern/wm_widgetgroup.c b/source/blender/windowmanager/widgets/intern/wm_widgetgroup.c
index 0315fe4..db7f778 100644
--- a/source/blender/windowmanager/widgets/intern/wm_widgetgroup.c
+++ b/source/blender/windowmanager/widgets/intern/wm_widgetgroup.c
@@ -311,6 +311,8 @@ void WIDGETGROUP_OT_widget_tweak(wmOperatorType *ot)
 	/* api callbacks */
 	ot->invoke = widget_tweak_invoke;
 	ot->modal = widget_tweak_modal;
+
+	ot->flag = OPTYPE_UNDO;
 }
 
 /** \} */ // Widget operators




More information about the Bf-blender-cvs mailing list