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;

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to