[Bf-blender-cvs] [dd43f9c] wiggly-widgets: 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.
Antony Riakiotakis
noreply at git.blender.org
Fri Nov 21 18:05:51 CET 2014
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;
More information about the Bf-blender-cvs
mailing list