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