[Bf-blender-cvs] [8abdc899] master: Sequencer: Preview dragging playhead over strips

Campbell Barton noreply at git.blender.org
Sun Jan 4 16:28:14 CET 2015


Commit: 8abdc89912e4ae042eeeb5f0e33e833a89eefb8f
Author: Campbell Barton
Date:   Mon Jan 5 02:12:50 2015 +1100
Branches: master
https://developer.blender.org/rB8abdc89912e4ae042eeeb5f0e33e833a89eefb8f

Sequencer: Preview dragging playhead over strips

Bring back the 2.4x feature.

also show a highlight when a strip is being previewed.

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

M	source/blender/editors/animation/anim_ops.c
M	source/blender/editors/include/ED_sequencer.h
M	source/blender/editors/space_sequencer/sequencer_draw.c
M	source/blender/editors/space_sequencer/sequencer_edit.c
M	source/blender/editors/space_sequencer/sequencer_intern.h

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

diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c
index 8a9e02a..1a043b4 100644
--- a/source/blender/editors/animation/anim_ops.c
+++ b/source/blender/editors/animation/anim_ops.c
@@ -56,6 +56,7 @@
 
 #include "ED_anim_api.h"
 #include "ED_screen.h"
+#include "ED_sequencer.h"
 
 #include "anim_intern.h"
 
@@ -143,6 +144,25 @@ static int frame_from_event(bContext *C, const wmEvent *event)
 	return frame;
 }
 
+static void change_frame_seq_preview_begin(bContext *C, const wmEvent *event)
+{
+	ScrArea *sa = CTX_wm_area(C);
+	if (sa && sa->spacetype == SPACE_SEQ) {
+		SpaceSeq *sseq = sa->spacedata.first;
+		if (ED_space_sequencer_check_show_strip(sseq)) {
+			ED_sequencer_special_preview_set(C, event->mval);
+		}
+	}
+}
+static void change_frame_seq_preview_end(bContext *C)
+{
+	if (ED_sequencer_special_preview_get() != NULL) {
+		Scene *scene = CTX_data_scene(C);
+		ED_sequencer_special_preview_clear();
+		WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene);
+	}
+}
+
 /* Modal Operator init */
 static int change_frame_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 {
@@ -152,6 +172,8 @@ static int change_frame_invoke(bContext *C, wmOperator *op, const wmEvent *event
 	 */
 	RNA_int_set(op->ptr, "frame", frame_from_event(C, event));
 
+	change_frame_seq_preview_begin(C, event);
+
 	change_frame_apply(C, op);
 	
 	/* add temp handler */
@@ -160,14 +182,21 @@ static int change_frame_invoke(bContext *C, wmOperator *op, const wmEvent *event
 	return OPERATOR_RUNNING_MODAL;
 }
 
+static void change_frame_cancel(bContext *C, wmOperator *UNUSED(op))
+{
+	change_frame_seq_preview_end(C);
+}
+
 /* Modal event handling of frame changing */
 static int change_frame_modal(bContext *C, wmOperator *op, const wmEvent *event)
 {
+	int ret = OPERATOR_RUNNING_MODAL;
 	/* execute the events */
 	switch (event->type) {
 		case ESCKEY:
-			return OPERATOR_FINISHED;
-		
+			ret = OPERATOR_FINISHED;
+			break;
+
 		case MOUSEMOVE:
 			RNA_int_set(op->ptr, "frame", frame_from_event(C, event));
 			change_frame_apply(C, op);
@@ -180,7 +209,7 @@ static int change_frame_modal(bContext *C, wmOperator *op, const wmEvent *event)
 			 * the modal op) doesn't work for some reason
 			 */
 			if (event->val == KM_RELEASE)
-				return OPERATOR_FINISHED;
+				ret = OPERATOR_FINISHED;
 			break;
 
 		case LEFTCTRLKEY:
@@ -194,7 +223,11 @@ static int change_frame_modal(bContext *C, wmOperator *op, const wmEvent *event)
 			break;
 	}
 
-	return OPERATOR_RUNNING_MODAL;
+	if (ret == OPERATOR_FINISHED) {
+		change_frame_seq_preview_end(C);
+	}
+
+	return ret;
 }
 
 static void ANIM_OT_change_frame(wmOperatorType *ot)
@@ -209,6 +242,7 @@ static void ANIM_OT_change_frame(wmOperatorType *ot)
 	/* api callbacks */
 	ot->exec = change_frame_exec;
 	ot->invoke = change_frame_invoke;
+	ot->cancel = change_frame_cancel;
 	ot->modal = change_frame_modal;
 	ot->poll = change_frame_poll;
 	
diff --git a/source/blender/editors/include/ED_sequencer.h b/source/blender/editors/include/ED_sequencer.h
index 4e9d67d..94885c2 100644
--- a/source/blender/editors/include/ED_sequencer.h
+++ b/source/blender/editors/include/ED_sequencer.h
@@ -27,6 +27,7 @@
 #ifndef __ED_SEQUENCER_H__
 #define __ED_SEQUENCER_H__
 
+struct bContext;
 struct Scene;
 struct Sequence;
 struct SpaceSeq;
@@ -39,7 +40,12 @@ bool ED_space_sequencer_check_show_maskedit(struct SpaceSeq *sseq, struct Scene
 int  ED_space_sequencer_maskedit_poll(struct bContext *C);
 
 bool ED_space_sequencer_check_show_imbuf(struct SpaceSeq *sseq);
+bool ED_space_sequencer_check_show_strip(struct SpaceSeq *sseq);
 
 void ED_operatormacros_sequencer(void);
 
+Sequence *ED_sequencer_special_preview_get(void);
+void      ED_sequencer_special_preview_set(struct bContext *C, const int mval[2]);
+void      ED_sequencer_special_preview_clear(void);
+
 #endif /*  __ED_SEQUENCER_H__ */
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 293a68c..e326fc7 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -830,17 +830,29 @@ static void draw_seq_strip(const bContext *C, SpaceSeq *sseq, Scene *scene, AReg
 
 static Sequence *special_seq_update = NULL;
 
-static void UNUSED_FUNCTION(set_special_seq_update) (int val)
+void sequencer_special_update_set(Sequence *seq)
 {
-//	int x;
+	special_seq_update = seq;
+}
 
-	/* if mouse over a sequence && LEFTMOUSE */
-	if (val) {
-// XXX		special_seq_update = find_nearest_seq(&x);
-	}
-	else {
-		special_seq_update = NULL;
-	}
+Sequence *ED_sequencer_special_preview_get(void)
+{
+	return special_seq_update;
+}
+
+void ED_sequencer_special_preview_set(bContext *C, const int mval[2])
+{
+	Scene *scene = CTX_data_scene(C);
+	ARegion *ar = CTX_wm_region(C);
+	int hand;
+	Sequence *seq;
+	seq = find_nearest_seq(scene, &ar->v2d, &hand, mval);
+	sequencer_special_update_set(seq);
+}
+
+void ED_sequencer_special_preview_clear(void)
+{
+	sequencer_special_update_set(NULL);
 }
 
 ImBuf *sequencer_ibuf_get(struct Main *bmain, Scene *scene, SpaceSeq *sseq, int cfra, int frame_ofs)
@@ -1450,6 +1462,15 @@ static void draw_seq_strips(const bContext *C, Editing *ed, ARegion *ar)
 	/* draw the last selected last (i.e. 'active' in other parts of Blender), removes some overlapping error */
 	if (last_seq)
 		draw_seq_strip(C, sseq, scene, ar, last_seq, 120, pixelx);
+
+	/* draw highlight when previewing a single strip */
+	if (special_seq_update) {
+		const Sequence *seq = special_seq_update;
+		glEnable(GL_BLEND);
+		glColor4ub(255, 255, 255, 48);
+		glRectf(seq->startdisp, seq->machine + SEQ_STRIP_OFSBOTTOM, seq->enddisp, seq->machine + SEQ_STRIP_OFSTOP);
+		glDisable(GL_BLEND);
+	}
 }
 
 static void seq_draw_sfra_efra(Scene *scene, View2D *v2d)
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index d02e719..910ba66 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -495,6 +495,13 @@ bool ED_space_sequencer_check_show_imbuf(SpaceSeq *sseq)
 	        ELEM(sseq->mainb, SEQ_DRAW_SEQUENCE, SEQ_DRAW_IMG_IMBUF));
 }
 
+bool ED_space_sequencer_check_show_strip(SpaceSeq *sseq)
+{
+	return (ELEM(sseq->view, SEQ_VIEW_SEQUENCE, SEQ_VIEW_SEQUENCE_PREVIEW) &&
+	        ELEM(sseq->mainb, SEQ_DRAW_SEQUENCE, SEQ_DRAW_IMG_IMBUF));
+}
+
+
 int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequence **selseq1, Sequence **selseq2, Sequence **selseq3, const char **error_str)
 {
 	Editing *ed = BKE_sequencer_editing_get(scene, false);
@@ -1130,7 +1137,7 @@ int sequencer_strip_has_path_poll(bContext *C)
 	return (((ed = BKE_sequencer_editing_get(CTX_data_scene(C), false)) != NULL) && ((seq = ed->act_seq) != NULL) && (SEQ_HAS_PATH(seq)));
 }
 
-int sequencer_view_poll(bContext *C)
+int sequencer_view_preview_poll(bContext *C)
 {
 	SpaceSeq *sseq = CTX_wm_space_seq(C);
 	Editing *ed = BKE_sequencer_editing_get(CTX_data_scene(C), false);
@@ -1140,6 +1147,15 @@ int sequencer_view_poll(bContext *C)
 	return 0;
 }
 
+int sequencer_view_strips_poll(bContext *C)
+{
+	SpaceSeq *sseq = CTX_wm_space_seq(C);
+	if (sseq && ED_space_sequencer_check_show_strip(sseq))
+		return 1;
+
+	return 0;
+}
+
 /* snap operator*/
 static int sequencer_snap_exec(bContext *C, wmOperator *op)
 {
@@ -3314,7 +3330,7 @@ void SEQUENCER_OT_view_ghost_border(wmOperatorType *ot)
 	ot->invoke = WM_border_select_invoke;
 	ot->exec = view_ghost_border_exec;
 	ot->modal = WM_border_select_modal;
-	ot->poll = sequencer_view_poll;
+	ot->poll = sequencer_view_preview_poll;
 	ot->cancel = WM_border_select_cancel;
 
 	/* flags */
diff --git a/source/blender/editors/space_sequencer/sequencer_intern.h b/source/blender/editors/space_sequencer/sequencer_intern.h
index 4e11b4d..5f1c931 100644
--- a/source/blender/editors/space_sequencer/sequencer_intern.h
+++ b/source/blender/editors/space_sequencer/sequencer_intern.h
@@ -58,6 +58,8 @@ void color3ubv_from_seq(struct Scene *curscene, struct Sequence *seq, unsigned c
 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_special_update_set(Sequence *seq);
+
 /* UNUSED */
 // void seq_reset_imageofs(struct SpaceSeq *sseq);
 
@@ -77,7 +79,8 @@ int sequencer_edit_poll(struct bContext *C);
 /* UNUSED */
 //int sequencer_strip_poll(struct bContext *C);
 int sequencer_strip_has_path_poll(struct bContext *C);
-int sequencer_view_poll(struct bContext *C);
+int sequencer_view_preview_poll(struct bContext *C);
+int sequencer_view_strips_poll(struct bContext *C);
 
 /* externs */
 extern EnumPropertyItem sequencer_prop_effect_types[];




More information about the Bf-blender-cvs mailing list