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

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to