[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