[Bf-blender-cvs] [b2b3c99] wiggly-widgets: Widgify the Graph Editor backdrop

Julian Eisel noreply at git.blender.org
Tue Apr 7 01:40:49 CEST 2015


Commit: b2b3c996283f624de6a9b35c70497df255656a38
Author: Julian Eisel
Date:   Tue Apr 7 01:39:37 2015 +0200
Branches: wiggly-widgets
https://developer.blender.org/rBb2b3c996283f624de6a9b35c70497df255656a38

Widgify the Graph Editor backdrop

Adds the basic cage widget to the Graph Editor backdrop. The backdrop
drawing while scaling needs to be corrected still, but besides from that
(almost) everything works now.

===================================================================

M	source/blender/blenloader/intern/versioning_270.c
M	source/blender/editors/space_graph/graph_edit.c
M	source/blender/editors/space_graph/graph_intern.h
M	source/blender/editors/space_graph/graph_ops.c
M	source/blender/editors/space_graph/space_graph.c
M	source/blender/makesdna/DNA_space_types.h

===================================================================

diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c
index 4533de0..7133a19 100644
--- a/source/blender/blenloader/intern/versioning_270.c
+++ b/source/blender/blenloader/intern/versioning_270.c
@@ -830,5 +830,21 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main)
 				}
 			}
 		}
+
+		if (!DNA_struct_elem_find(fd->filesdna, "SpaceIpo", "float", "backdrop_zoom")) {
+			bScreen *sc;
+			for (sc = main->screen.first; sc; sc = sc->id.next) {
+				ScrArea *sa;
+				for (sa = sc->areabase.first; sa; sa = sa->next) {
+					SpaceLink *sl;
+					for (sl = sa->spacedata.first; sl; sl = sl->next) {
+						if (sl->spacetype == SPACE_IPO) {
+							SpaceIpo *sipo = (SpaceIpo *)sl;
+							sipo->backdrop_zoom = 1.0f;
+						}
+					}
+				}
+			}
+		}
 	}
 }
diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c
index a26bfdd..dee8d00 100644
--- a/source/blender/editors/space_graph/graph_edit.c
+++ b/source/blender/editors/space_graph/graph_edit.c
@@ -59,6 +59,7 @@
 #include "BKE_nla.h"
 #include "BKE_context.h"
 #include "BKE_report.h"
+#include "BKE_screen.h"
 
 #include "UI_view2d.h"
 
@@ -2464,3 +2465,153 @@ void GRAPH_OT_fmodifier_paste(wmOperatorType *ot)
 }
 
 /* ************************************************************************** */
+
+typedef struct BackDropTransformData {
+	float init_offset[2];
+	float init_zoom;
+	short event_type;
+	wmWidgetGroupType *cagetype;
+} BackDropTransformData;
+
+static int graph_widget_backdrop_transform_poll(bContext *C)
+{
+	SpaceIpo *sipo = CTX_wm_space_graph(C);
+	ARegion *ar = CTX_wm_region(C);
+
+	return ((ar->type->regionid == RGN_TYPE_WINDOW) &&
+	        (sipo->flag & SIPO_DRAW_BACKDROP) &&
+	        (sipo->backdrop_camera));
+}
+
+static void widgetgroup_backdrop_draw(const struct bContext *C, struct wmWidgetGroup *wgroup)
+{
+	ARegion *ar = CTX_wm_region(C);
+	wmOperator *op = wgroup->type->op;
+	Scene *scene = CTX_data_scene(C);
+	int width = (scene->r.xsch * scene->r.size) / 100;
+	int height = (scene->r.ysch * scene->r.size) / 100;
+	float origin[3];
+
+	wmWidget *cage = WIDGET_rect_transform_new(wgroup, WIDGET_RECT_TRANSFORM_STYLE_SCALE_UNIFORM |
+	                                           WIDGET_RECT_TRANSFORM_STYLE_TRANSLATE, width, height);
+	WM_widget_property(cage, RECT_TRANSFORM_SLOT_OFFSET, op->ptr, "offset");
+	WM_widget_property(cage, RECT_TRANSFORM_SLOT_SCALE, op->ptr, "scale");
+
+	origin[0] = BLI_rcti_size_x(&ar->winrct) / 2.0f;
+	origin[1] = BLI_rcti_size_y(&ar->winrct) / 2.0f;
+
+	WM_widget_set_origin(cage, origin);
+}
+
+static int graph_widget_backdrop_transform_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+{
+	ScrArea *sa = CTX_wm_area(C);
+	SpaceIpo *sipo = CTX_wm_space_graph(C);
+	/* no poll, lives always for the duration of the operator */
+	wmWidgetGroupType *cagetype = WM_widgetgrouptype_new(NULL, widgetgroup_backdrop_draw, CTX_data_main(C), "Graph_Canvas", SPACE_IPO, RGN_TYPE_WINDOW, false);
+	struct wmEventHandler *handler = WM_event_add_modal_handler(C, op);
+	BackDropTransformData *data = MEM_mallocN(sizeof(BackDropTransformData), "overdrop transform data");
+	WM_modal_handler_attach_widgetgroup(C, handler, cagetype, op);
+
+	RNA_float_set_array(op->ptr, "offset", sipo->backdrop_offset);
+	RNA_float_set(op->ptr, "scale", sipo->backdrop_zoom);
+
+	copy_v2_v2(data->init_offset, sipo->backdrop_offset);
+	data->init_zoom = sipo->backdrop_zoom;
+	data->cagetype = cagetype;
+	data->event_type = event->type;
+
+	op->customdata = data;
+
+	ED_area_headerprint(sa, "Drag to place, and scale, Space/Enter/Caller key to confirm, R to recenter, RClick/Esc to cancel");
+
+	return OPERATOR_RUNNING_MODAL;
+}
+
+static void graph_widget_backdrop_transform_finish(bContext *C, BackDropTransformData *data)
+{
+	ScrArea *sa = CTX_wm_area(C);
+	ED_area_headerprint(sa, NULL);
+	WM_widgetgrouptype_unregister(C, CTX_data_main(C), data->cagetype);
+	MEM_freeN(data);
+}
+
+static void graph_widget_backdrop_transform_cancel(struct bContext *C, struct wmOperator *op)
+{
+	BackDropTransformData *data = op->customdata;
+	graph_widget_backdrop_transform_finish(C, data);
+}
+
+static int graph_widget_backdrop_transform_modal(bContext *C, wmOperator *op, const wmEvent *event)
+{
+	BackDropTransformData *data = op->customdata;
+
+	if (event->type == data->event_type && event->val == KM_PRESS) {
+		graph_widget_backdrop_transform_finish(C, data);
+		return OPERATOR_FINISHED;
+	}
+
+	switch (event->type) {
+		case EVT_WIDGET_UPDATE: {
+			SpaceIpo *sipo = CTX_wm_space_graph(C);
+			RNA_float_get_array(op->ptr, "offset", sipo->backdrop_offset);
+			sipo->backdrop_zoom = RNA_float_get(op->ptr, "scale");
+			break;
+		}
+		case RKEY:
+		{
+			SpaceIpo *sipo = CTX_wm_space_graph(C);
+			ARegion *ar = CTX_wm_region(C);
+			float zero[2] = {0.0f};
+			RNA_float_set_array(op->ptr, "offset", zero);
+			RNA_float_set(op->ptr, "scale", 1.0f);
+			copy_v2_v2(sipo->backdrop_offset, zero);
+			sipo->backdrop_zoom = 1.0f;
+			ED_region_tag_redraw(ar);
+			/* add a mousemove to refresh the widget */
+			WM_event_add_mousemove(C);
+			break;
+		}
+		case RETKEY:
+		case PADENTER:
+		case SPACEKEY:
+		{
+			graph_widget_backdrop_transform_finish(C, data);
+			return OPERATOR_FINISHED;
+		}
+		case ESCKEY:
+		case RIGHTMOUSE:
+		{
+			SpaceIpo *sipo = CTX_wm_space_graph(C);
+			copy_v2_v2(sipo->backdrop_offset, data->init_offset);
+			sipo->backdrop_zoom = data->init_zoom;
+
+			graph_widget_backdrop_transform_finish(C, data);
+			return OPERATOR_CANCELLED;
+		}
+	}
+
+	return OPERATOR_RUNNING_MODAL;
+}
+
+void GRAPH_OT_widget_backdrop_transform(struct wmOperatorType *ot)
+{
+	float default_offset[2] = {0.0f, 0.0f};
+
+	/* identifiers */
+	ot->name = "Transform Backdrop";
+	ot->idname = "GRAPH_OT_widget_backdrop_transform";
+	ot->description = "";
+
+	/* api callbacks */
+	ot->invoke = graph_widget_backdrop_transform_invoke;
+	ot->modal = graph_widget_backdrop_transform_modal;
+	ot->poll = graph_widget_backdrop_transform_poll;
+	ot->cancel = graph_widget_backdrop_transform_cancel;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+	
+	RNA_def_float_array(ot->srna, "offset", 2, default_offset, FLT_MIN, FLT_MAX, "Offset", "Offset of the backdrop", FLT_MIN, FLT_MAX);
+	RNA_def_float(ot->srna, "scale", 1.0f, 0.0f, FLT_MAX, "Scale", "Scale of the backdrop", 0.0f, FLT_MAX);
+}
diff --git a/source/blender/editors/space_graph/graph_intern.h b/source/blender/editors/space_graph/graph_intern.h
index e2fab188f..99ada04 100644
--- a/source/blender/editors/space_graph/graph_intern.h
+++ b/source/blender/editors/space_graph/graph_intern.h
@@ -116,6 +116,8 @@ void GRAPH_OT_frame_jump(struct wmOperatorType *ot);
 void GRAPH_OT_snap(struct wmOperatorType *ot);
 void GRAPH_OT_mirror(struct wmOperatorType *ot);
 
+void GRAPH_OT_widget_backdrop_transform(struct wmOperatorType *ot);
+
 /* defines for snap keyframes 
  * NOTE: keep in sync with eEditKeyframes_Snap (in ED_keyframes_edit.h)
  */
diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c
index e266a50..158fcb0 100644
--- a/source/blender/editors/space_graph/graph_ops.c
+++ b/source/blender/editors/space_graph/graph_ops.c
@@ -427,6 +427,8 @@ void graphedit_operatortypes(void)
 	WM_operatortype_append(GRAPH_OT_fmodifier_add);
 	WM_operatortype_append(GRAPH_OT_fmodifier_copy);
 	WM_operatortype_append(GRAPH_OT_fmodifier_paste);
+	
+	WM_operatortype_append(GRAPH_OT_widget_backdrop_transform);
 }
 
 void ED_operatormacros_graph(void)
@@ -665,5 +667,7 @@ void graphedit_keymap(wmKeyConfig *keyconf)
 	/* keyframes */
 	keymap = WM_keymap_find(keyconf, "Graph Editor", SPACE_IPO, 0);
 	graphedit_keymap_keyframes(keyconf, keymap);
+
+	WM_keymap_add_item(keymap, "GRAPH_OT_widget_backdrop_transform", WKEY, KM_PRESS, 0, 0);
 }
 
diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c
index e352545..911f2f5 100644
--- a/source/blender/editors/space_graph/space_graph.c
+++ b/source/blender/editors/space_graph/space_graph.c
@@ -221,6 +221,11 @@ static void graph_main_area_init(wmWindowManager *wm, ARegion *ar)
 	WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
 	keymap = WM_keymap_find(wm->defaultconf, "Graph Editor Generic", SPACE_IPO, 0);
 	WM_event_add_keymap_handler(&ar->handlers, keymap);
+	
+	/* widgets */
+	if (BLI_listbase_is_empty(&ar->widgetmaps)) {
+		BLI_addhead(&ar->widgetmaps, WM_widgetmap_from_type("Graph_Canvas", SPACE_IPO, RGN_TYPE_WINDOW, false));
+	}
 }
 
 static void graph_main_area_draw(const bContext *C, ARegion *ar)
@@ -256,13 +261,19 @@ static void graph_main_area_draw(const bContext *C, ARegion *ar)
 	if (draw_backdrop) {
 		int width = (scene->r.xsch * scene->r.size) / 100;
 		int height = (scene->r.ysch * scene->r.size) / 100;
-		float x = (rect_mask_orig.xmax - width) / 2; /* center of the screen */
-		float y = (rect_mask_orig.ymax - height - U.widget_unit); /* below upper edge with small offset */
+		float x = (BLI_rcti_size_x(&ar->winrct) - width) / 2.0f; /* center of the screen */
+		float y = (BLI_rcti_size_y(&ar->winrct) - height) / 2.0f; /* below upper edge with small offset */
+		
+		width *= sipo->backdrop_zoom;
+		height *= sipo->backdrop_zoom;
+		x += sipo->backdrop_offset[0];
+		y += sipo->backdrop_offset[1];
 		
 		/* reset view matrix */
 		UI_view2d_view_restore(C);
 		
-		ED_region_draw_backdrop_view3d(C, sipo->backdrop_camera, width, height, x, y, 1.0f, 1.0f, true, true);
+		ED_region_draw_backdrop_view3d(C, sipo->backdrop_camera, width, height, x, y,
+		                               1.0f, 1.0f, false, true);
 		
 		UI_view2d_view_ortho(v2d);
 	}
@@ -327,6 +338,10 @@ static void graph_main_area_draw(const bContext *C, ARegion *ar)
 	/* reset view matrix */
 	UI_view2d_view_restore(C);
 	
+	/* finally draw any widgets here */
+	WM_widgets_update(C, ar->widgetmaps.first);
+	WM_widgets_draw(C, ar->widgetmaps.first, false);
+	
 	/* scrollers */
 	// FIXME: args for scrollers depend on the type of data being shown...
 	scrollers = UI_view2d_scrollers_calc(C,

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list