[Bf-blender-cvs] [9e9514c] wiggly-widgets: Sequencer image resize widget: Initial visual-only implementation

Julian Eisel noreply at git.blender.org
Mon Mar 30 21:22:06 CEST 2015


Commit: 9e9514c10cc301eec221502efc9104f8ea6b6359
Author: Julian Eisel
Date:   Mon Mar 30 21:16:02 2015 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB9e9514c10cc301eec221502efc9104f8ea6b6359

Sequencer image resize widget: Initial visual-only implementation

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

M	source/blender/editors/space_sequencer/sequencer_draw.c
M	source/blender/editors/space_sequencer/sequencer_intern.h
M	source/blender/editors/space_sequencer/sequencer_ops.c
M	source/blender/editors/space_sequencer/sequencer_view.c
M	source/blender/editors/space_sequencer/space_sequencer.c

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

diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index f526e5e..0270b77 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -952,7 +952,7 @@ static ImBuf *sequencer_make_scope(Scene *scene, ImBuf *ibuf, ImBuf *(*make_scop
 	return scope;
 }
 
-static void sequencer_display_size(Scene *scene, SpaceSeq *sseq, float r_viewrect[2])
+void sequencer_display_size(Scene *scene, SpaceSeq *sseq, float r_viewrect[2])
 {
 	float render_size, proxy_size;
 
diff --git a/source/blender/editors/space_sequencer/sequencer_intern.h b/source/blender/editors/space_sequencer/sequencer_intern.h
index 63ae52c..93a5f6c 100644
--- a/source/blender/editors/space_sequencer/sequencer_intern.h
+++ b/source/blender/editors/space_sequencer/sequencer_intern.h
@@ -56,6 +56,7 @@ void draw_image_seq(const struct bContext *C, struct Scene *scene, struct  ARegi
 void color3ubv_from_seq(struct Scene *curscene, struct Sequence *seq, unsigned char col[3]);
 void draw_shadedstrip(struct Sequence *seq, unsigned char col[3], float x1, float y1, float x2, float y2);
 void draw_sequence_extensions(struct Scene *scene, struct ARegion *ar, struct Sequence *seq);
+void sequencer_display_size(struct Scene *scene, struct SpaceSeq *sseq, float r_viewrect[2]);
 
 void sequencer_special_update_set(Sequence *seq);
 
@@ -133,6 +134,7 @@ void SEQUENCER_OT_rebuild_proxy(struct wmOperatorType *ot);
 void SEQUENCER_OT_enable_proxies(struct wmOperatorType *ot);
 
 void SEQUENCER_OT_overdrop_transform(struct wmOperatorType *ot);
+void SEQUENCER_OT_image_transform_widget(struct wmOperatorType *ot);
 
 /* preview specific operators */
 void SEQUENCER_OT_view_all_preview(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c
index 4019190..6fc4098 100644
--- a/source/blender/editors/space_sequencer/sequencer_ops.c
+++ b/source/blender/editors/space_sequencer/sequencer_ops.c
@@ -125,6 +125,7 @@ void sequencer_operatortypes(void)
 	/* sequencer_view.h */
 	WM_operatortype_append(SEQUENCER_OT_sample);
 	WM_operatortype_append(SEQUENCER_OT_overdrop_transform);
+	WM_operatortype_append(SEQUENCER_OT_image_transform_widget);
 }
 
 
@@ -345,6 +346,8 @@ void sequencer_keymap(wmKeyConfig *keyconf)
 	/* would prefer to use numpad keys for job */
 	RNA_float_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom_ratio", PAD1, KM_PRESS, 0, 0)->ptr, "ratio", 1.0f);
 
+	WM_keymap_add_item(keymap, "SEQUENCER_OT_image_transform_widget", VKEY, KM_PRESS, 0, 0);
+
 	/* Setting zoom levels is not that useful, except for back to zoom level 1, removing keymap because of conflicts for now */
 #if 0
 	RNA_float_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom_ratio", PAD8, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 8.0f);
diff --git a/source/blender/editors/space_sequencer/sequencer_view.c b/source/blender/editors/space_sequencer/sequencer_view.c
index 71eb64a..108e527 100644
--- a/source/blender/editors/space_sequencer/sequencer_view.c
+++ b/source/blender/editors/space_sequencer/sequencer_view.c
@@ -395,3 +395,162 @@ void SEQUENCER_OT_overdrop_transform(struct wmOperatorType *ot)
 	RNA_def_float(ot->srna, "scale", 1.0f, 0.0f, FLT_MAX, "Scale", "Scale of the backdrop", 0.0f, FLT_MAX);
 }
 
+/******** transform widget (preview area) *******/
+
+static int sequencer_image_transform_widget_poll(bContext *C)
+{
+	SpaceSeq *sseq = CTX_wm_space_seq(C);
+	ARegion *ar = CTX_wm_region(C);
+
+	return (sseq && ar && ar->type->regionid == RGN_TYPE_PREVIEW);
+}
+
+#include "BIF_glutil.h"
+static void widgetgroup_image_transform_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);
+	SpaceSeq *sseq = CTX_wm_space_seq(C);
+	ImBuf *imbuf = sequencer_ibuf_get(CTX_data_main(C), scene, sseq, CFRA, 0);
+	View2D *v2d = &ar->v2d;
+	wmWidget *cage;
+	float origin[3];
+	float viewrect[2];
+	float scale[2];
+
+	if (!imbuf)
+		return;
+
+	sequencer_display_size(scene, sseq, viewrect);
+
+	UI_view2d_scale_get(v2d, &scale[0], &scale[1]);
+
+	cage = WIDGET_rect_transform_new(wgroup, WIDGET_RECT_TRANSFORM_STYLE_SCALE_UNIFORM |
+	                                 WIDGET_RECT_TRANSFORM_STYLE_TRANSLATE,
+	                                 viewrect[0] * scale[0], viewrect[1] * scale[1]);
+//	WM_widget_property(cage, RECT_TRANSFORM_SLOT_OFFSET, op->ptr, "offset");
+//	WM_widget_property(cage, RECT_TRANSFORM_SLOT_SCALE, op->ptr, "scale");
+
+	origin[0] = -(v2d->cur.xmin * scale[0]);
+	origin[1] = -(v2d->cur.ymin * scale[1]);
+	WM_widget_set_origin(cage, origin);
+}
+
+static int sequencer_image_transform_widget_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+{
+	ScrArea *sa = CTX_wm_area(C);
+	SpaceSeq *sseq = CTX_wm_space_seq(C);
+	/* no poll, lives always for the duration of the operator */
+	wmWidgetGroupType *cagetype = WM_widgetgrouptype_new(NULL, widgetgroup_image_transform_draw, CTX_data_main(C), "Seq_Canvas", SPACE_SEQ, RGN_TYPE_PREVIEW, false);
+	struct wmEventHandler *handler = WM_event_add_modal_handler(C, op);
+	OverDropTransformData *data = MEM_mallocN(sizeof(OverDropTransformData), "overdrop transform data");
+	WM_modal_handler_attach_widgetgroup(C, handler, cagetype, op);
+
+	RNA_float_set_array(op->ptr, "offset", sseq->overdrop_offset);
+	RNA_float_set(op->ptr, "scale", sseq->overdrop_zoom);
+
+	copy_v2_v2(data->init_offset, sseq->overdrop_offset);
+	data->init_zoom = sseq->overdrop_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 sequencer_image_transform_widget_finish(bContext *C, OverDropTransformData *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 sequencer_image_transform_widget_cancel(struct bContext *C, struct wmOperator *op)
+{
+	OverDropTransformData *data = op->customdata;
+	sequencer_image_transform_widget_finish(C, data);
+}
+
+static int sequencer_image_transform_widget_modal(bContext *C, wmOperator *op, const wmEvent *event)
+{
+	OverDropTransformData *data = op->customdata;
+
+	if (event->type == data->event_type && event->val == KM_PRESS) {
+		sequencer_image_transform_widget_finish(C, data);
+		return OPERATOR_FINISHED;
+	}
+
+	switch (event->type) {
+		case EVT_WIDGET_UPDATE: {
+//			SpaceSeq *sseq = CTX_wm_space_seq(C);
+//			RNA_float_get_array(op->ptr, "offset", sseq->overdrop_offset);
+//			sseq->overdrop_zoom = RNA_float_get(op->ptr, "scale");
+//			break;
+			return OPERATOR_RUNNING_MODAL;
+		}
+
+		case RKEY:
+		{
+//			SpaceSeq *sseq = CTX_wm_space_seq(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(sseq->overdrop_offset, zero);
+//			sseq->overdrop_zoom = 1.0;
+			ED_region_tag_redraw(ar);
+			/* add a mousemove to refresh the widget */
+			WM_event_add_mousemove(C);
+//			break;
+			return OPERATOR_RUNNING_MODAL;
+		}
+		case RETKEY:
+		case PADENTER:
+		case SPACEKEY:
+		{
+			sequencer_image_transform_widget_finish(C, data);
+			return OPERATOR_FINISHED;
+		}
+
+		case ESCKEY:
+		case RIGHTMOUSE:
+		{
+//			SpaceSeq *sseq = CTX_wm_space_seq(C);
+//			copy_v2_v2(sseq->overdrop_offset, data->init_offset);
+//			sseq->overdrop_zoom = data->init_zoom;
+
+			sequencer_image_transform_widget_finish(C, data);
+			return OPERATOR_CANCELLED;
+		}
+	}
+
+	return OPERATOR_RUNNING_MODAL;
+}
+
+void SEQUENCER_OT_image_transform_widget(struct wmOperatorType *ot)
+{
+	float default_offset[2] = {0.0f, 0.0f};
+
+	/* identifiers */
+	ot->name = "Image Transform";
+	ot->idname = "SEQUENCER_OT_image_transform_widget";
+	ot->description = "Transform the image using a widget";
+
+	/* api callbacks */
+	ot->invoke = sequencer_image_transform_widget_invoke;
+	ot->modal = sequencer_image_transform_widget_modal;
+	ot->poll = sequencer_image_transform_widget_poll;
+	ot->cancel = sequencer_image_transform_widget_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_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c
index ad70ec2..e74903d 100644
--- a/source/blender/editors/space_sequencer/space_sequencer.c
+++ b/source/blender/editors/space_sequencer/space_sequencer.c
@@ -564,6 +564,10 @@ static void sequencer_preview_area_init(wmWindowManager *wm, ARegion *ar)
 	/* own keymap */
 	keymap = WM_keymap_find(wm->defaultconf, "SequencerPreview", SPACE_SEQ, 0);
 	WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+
+	if (BLI_listbase_is_empty(&ar->widgetmaps)) {
+		BLI_addhead(&ar->widgetmaps, WM_widgetmap_from_type("Seq_Canvas", SPACE_SEQ, RGN_TYPE_PREVIEW, false));
+	}
 }
 
 static void sequencer_preview_area_draw(const bContext *C, ARegion *ar)
@@ -597,6 +601,9 @@ static void sequencer_preview_area_draw(const bContext *C, ARegion *ar)
 		ED_region_visible_rect(ar, &rect);
 		ED_scene_draw_fps(scene, &rect);
 	}
+
+	WM_widgets_update(C, ar->widgetmaps.first);
+	WM_widgets_draw(C, ar->widgetmaps.first, false);
 }
 
 static void sequencer_preview_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
@@ -699,6 +706,8 @@ static void sequencer_widgets(void)
 {
 	/* create the widgetmap for the area here */
 	WM_widgetmaptype_find("Seq_Canvas", SPACE_SEQ, RGN_TYPE_WINDOW, false, true);
+
+	WM_widgetmaptype_find("Seq_Canvas", SPACE_SEQ, RGN_TYPE_PREVIEW, false, true);
 }




More information about the Bf-blender-cvs mailing list