[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