diff options
Diffstat (limited to 'source/blender/editors/space_sequencer/sequencer_edit.c')
-rw-r--r-- | source/blender/editors/space_sequencer/sequencer_edit.c | 88 |
1 files changed, 56 insertions, 32 deletions
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index e7f77db3b9e..f0ed8d4107d 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -496,6 +496,13 @@ int ED_space_sequencer_maskedit_poll(bContext *C) return FALSE; } +/* are we displaying the seq output (not channels or histogram)*/ +int ED_space_sequencer_check_show_imbuf(SpaceSeq *sseq) +{ + return (ELEM(sseq->view, SEQ_VIEW_PREVIEW, 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); @@ -513,7 +520,7 @@ int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequen return 0; } if ((seq != activeseq) && (seq != seq2)) { - if (seq2 == NULL) seq2 = seq; + if (seq2 == NULL) seq2 = seq; else if (seq1 == NULL) seq1 = seq; else if (seq3 == NULL) seq3 = seq; else { @@ -810,18 +817,23 @@ static Sequence *cut_seq_soft(Scene *scene, Sequence *seq, int cutframe) /* like duplicate, but only duplicate and cut overlapping strips, - * strips to the left of the cutframe are ignored and strips to the right are moved into the new list */ -static int cut_seq_list(Scene *scene, ListBase *old, ListBase *new, int cutframe, + * strips to the left of the cutframe are ignored and strips to the right + * are moved to the end of slist + * we have to work on the same slist (not using a seperate list), since + * otherwise dupli_seq can't check for duplicate names properly and + * may generate strips with the same name (which will mess up animdata) + */ + +static int cut_seq_list(Scene *scene, ListBase *slist, int cutframe, Sequence * (*cut_seq)(Scene *, Sequence *, int)) { - int did_something = FALSE; Sequence *seq, *seq_next_iter; + Sequence *seq_first_new = NULL; - seq = old->first; - - while (seq) { + seq = slist->first; + + while (seq && seq != seq_first_new) { seq_next_iter = seq->next; /* we need this because we may remove seq */ - seq->tmp = NULL; if (seq->flag & SELECT) { if (cutframe > seq->startdisp && @@ -829,22 +841,29 @@ static int cut_seq_list(Scene *scene, ListBase *old, ListBase *new, int cutframe { Sequence *seqn = cut_seq(scene, seq, cutframe); if (seqn) { - BLI_addtail(new, seqn); + BLI_addtail(slist, seqn); + if (seq_first_new == NULL) { + seq_first_new = seqn; + } } - did_something = TRUE; } else if (seq->enddisp <= cutframe) { /* do nothing */ } else if (seq->startdisp >= cutframe) { - /* move into new list */ - BLI_remlink(old, seq); - BLI_addtail(new, seq); + /* move to tail */ + BLI_remlink(slist, seq); + BLI_addtail(slist, seq); + + if (seq_first_new == NULL) { + seq_first_new = seq; + } } } seq = seq_next_iter; } - return did_something; + + return (seq_first_new != NULL); } static int insert_gap(Scene *scene, int gap, int cfra) @@ -870,7 +889,7 @@ static int insert_gap(Scene *scene, int gap, int cfra) return done; } -static void UNUSED_FUNCTION(touch_seq_files) (Scene * scene) +static void UNUSED_FUNCTION(touch_seq_files) (Scene *scene) { Sequence *seq; Editing *ed = BKE_sequencer_editing_get(scene, FALSE); @@ -918,7 +937,7 @@ static void set_filter_seq(Scene *scene) if (seq->type == SEQ_TYPE_MOVIE) { seq->flag |= SEQ_FILTERY; reload_sequence_new_file(scene, seq, FALSE); - calc_sequence(scene, seq); + BKE_sequence_calc(scene, seq); } } @@ -927,7 +946,7 @@ static void set_filter_seq(Scene *scene) } #endif -static void UNUSED_FUNCTION(seq_remap_paths) (Scene * scene) +static void UNUSED_FUNCTION(seq_remap_paths) (Scene *scene) { Sequence *seq, *last_seq = BKE_sequencer_active_get(scene); Editing *ed = BKE_sequencer_editing_get(scene, FALSE); @@ -969,7 +988,7 @@ static void UNUSED_FUNCTION(seq_remap_paths) (Scene * scene) } -static void UNUSED_FUNCTION(no_gaps) (Scene * scene) +static void UNUSED_FUNCTION(no_gaps) (Scene *scene) { Editing *ed = BKE_sequencer_editing_get(scene, FALSE); int cfra, first = 0, done; @@ -1102,7 +1121,7 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int sequencer_snap_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) +static int sequencer_snap_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) { Scene *scene = CTX_data_scene(C); @@ -1117,7 +1136,7 @@ static int sequencer_snap_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(ev void SEQUENCER_OT_snap(struct wmOperatorType *ot) { /* identifiers */ - ot->name = "Snap strips"; + ot->name = "Snap Strips"; ot->idname = "SEQUENCER_OT_snap"; ot->description = "Frame where selected strips will be snapped"; @@ -1481,25 +1500,21 @@ static int sequencer_cut_exec(bContext *C, wmOperator *op) Editing *ed = BKE_sequencer_editing_get(scene, FALSE); int cut_side, cut_hard, cut_frame; - ListBase newlist; int changed; cut_frame = RNA_int_get(op->ptr, "frame"); cut_hard = RNA_enum_get(op->ptr, "type"); cut_side = RNA_enum_get(op->ptr, "side"); - newlist.first = newlist.last = NULL; - if (cut_hard == SEQ_CUT_HARD) { - changed = cut_seq_list(scene, ed->seqbasep, &newlist, cut_frame, cut_seq_hard); + changed = cut_seq_list(scene, ed->seqbasep, cut_frame, cut_seq_hard); } else { - changed = cut_seq_list(scene, ed->seqbasep, &newlist, cut_frame, cut_seq_soft); + changed = cut_seq_list(scene, ed->seqbasep, cut_frame, cut_seq_soft); } - if (newlist.first) { /* got new strips ? */ + if (changed) { /* got new strips ? */ Sequence *seq; - BLI_movelisttolist(ed->seqbasep, &newlist); if (cut_side != SEQ_SIDE_BOTH) { SEQP_BEGIN (ed, seq) @@ -1531,7 +1546,7 @@ static int sequencer_cut_exec(bContext *C, wmOperator *op) } -static int sequencer_cut_invoke(bContext *C, wmOperator *op, wmEvent *event) +static int sequencer_cut_invoke(bContext *C, wmOperator *op, const wmEvent *event) { Scene *scene = CTX_data_scene(C); View2D *v2d = UI_view2d_fromcontext(C); @@ -1680,7 +1695,7 @@ static int sequencer_delete_exec(bContext *C, wmOperator *UNUSED(op)) return OPERATOR_FINISHED; } -static int sequencer_delete_invoke(bContext *C, wmOperator *op, wmEvent *event) +static int sequencer_delete_invoke(bContext *C, wmOperator *op, const wmEvent *event) { ARegion *ar = CTX_wm_region(C); @@ -1899,6 +1914,9 @@ static int sequencer_meta_toggle_exec(bContext *C, wmOperator *UNUSED(op)) for (seq = ed->seqbasep->first; seq; seq = seq->next) BKE_sequence_calc(scene, seq); + if (BKE_sequence_test_overlap(ed->seqbasep, ms->parseq)) + BKE_sequence_base_shuffle(ed->seqbasep, ms->parseq, scene); + BKE_sequencer_active_set(scene, ms->parseq); ms->parseq->flag |= SELECT; @@ -2453,9 +2471,15 @@ void SEQUENCER_OT_strip_jump(wmOperatorType *ot) static void swap_sequence(Scene *scene, Sequence *seqa, Sequence *seqb) { int gap = seqb->startdisp - seqa->enddisp; - seqb->start = (seqb->start - seqb->startdisp) + seqa->startdisp; + int seq_a_start; + int seq_b_start; + + seq_b_start = (seqb->start - seqb->startdisp) + seqa->startdisp; + BKE_sequence_translate(scene, seqb, seq_b_start - seqb->start); BKE_sequence_calc(scene, seqb); - seqa->start = (seqa->start - seqa->startdisp) + seqb->enddisp + gap; + + seq_a_start = (seqa->start - seqa->startdisp) + seqb->enddisp + gap; + BKE_sequence_translate(scene, seqa, seq_a_start - seqa->start); BKE_sequence_calc(scene, seqa); } @@ -3081,7 +3105,7 @@ static int sequencer_change_path_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int sequencer_change_path_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) +static int sequencer_change_path_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) { Scene *scene = CTX_data_scene(C); Sequence *seq = BKE_sequencer_active_get(scene); |