From d5550c7b2c6b3278444f1f377d62776736c5dff9 Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Tue, 5 Apr 2022 14:52:32 +0200 Subject: Fix T97071: Duplicating strip in locked channel creates overlapping strips Add flag `SEQ_IGNORE_CHANNEL_LOCK` to indicate, that channel lock should not apply to strip. This flag must be cleared after transformation. --- source/blender/editors/space_sequencer/sequencer_edit.c | 1 + source/blender/editors/transform/transform_convert_sequencer.c | 5 +++++ source/blender/makesdna/DNA_sequence_types.h | 2 +- source/blender/sequencer/intern/strip_transform.c | 3 ++- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 70fba9d4ac9..0305ad279a0 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -1687,6 +1687,7 @@ static int sequencer_add_duplicate_exec(bContext *C, wmOperator *UNUSED(op)) SEQ_select_active_set(scene, seq); } seq->flag &= ~(SEQ_LEFTSEL + SEQ_RIGHTSEL + SEQ_LOCK); + seq->flag |= SEQ_IGNORE_CHANNEL_LOCK; SEQ_animation_duplicate(scene, seq, &fcurves_original_backup); SEQ_ensure_unique_name(seq, scene); } diff --git a/source/blender/editors/transform/transform_convert_sequencer.c b/source/blender/editors/transform/transform_convert_sequencer.c index 16a96001fd2..990d3680057 100644 --- a/source/blender/editors/transform/transform_convert_sequencer.c +++ b/source/blender/editors/transform/transform_convert_sequencer.c @@ -606,6 +606,11 @@ static void freeSeqData(TransInfo *t, TransDataContainer *tc, TransCustomData *c SeqCollection *transformed_strips = seq_transform_collection_from_transdata(tc); SEQ_collection_expand(seqbase_active_get(t), transformed_strips, SEQ_query_strip_effect_chain); + Sequence *seq; + SEQ_ITERATOR_FOREACH (seq, transformed_strips) { + seq->flag &= ~SEQ_IGNORE_CHANNEL_LOCK; + } + if (t->state == TRANS_CANCEL) { seq_transform_cancel(t, transformed_strips); SEQ_collection_free(transformed_strips); diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h index cb660619a37..d28550b5456 100644 --- a/source/blender/makesdna/DNA_sequence_types.h +++ b/source/blender/makesdna/DNA_sequence_types.h @@ -562,7 +562,7 @@ enum { SEQ_MAKE_FLOAT = (1 << 13), SEQ_LOCK = (1 << 14), SEQ_USE_PROXY = (1 << 15), - SEQ_FLAG_UNUSED_23 = (1 << 16), /* cleared */ + SEQ_IGNORE_CHANNEL_LOCK = (1 << 16), SEQ_FLAG_UNUSED_22 = (1 << 17), /* cleared */ SEQ_FLAG_UNUSED_18 = (1 << 18), /* cleared */ SEQ_FLAG_UNUSED_19 = (1 << 19), /* cleared */ diff --git a/source/blender/sequencer/intern/strip_transform.c b/source/blender/sequencer/intern/strip_transform.c index 618fed079f4..087e2610bd6 100644 --- a/source/blender/sequencer/intern/strip_transform.c +++ b/source/blender/sequencer/intern/strip_transform.c @@ -395,7 +395,8 @@ void SEQ_transform_offset_after_frame(Scene *scene, bool SEQ_transform_is_locked(ListBase *channels, Sequence *seq) { SeqTimelineChannel *channel = SEQ_channel_get_by_index(channels, seq->machine); - return seq->flag & SEQ_LOCK || SEQ_channel_is_locked(channel); + return seq->flag & SEQ_LOCK || + (SEQ_channel_is_locked(channel) && ((seq->flag & SEQ_IGNORE_CHANNEL_LOCK) == 0)); } void SEQ_image_transform_mirror_factor_get(const Sequence *seq, float r_mirror[2]) -- cgit v1.2.3