diff options
-rw-r--r-- | source/blender/makesrna/intern/rna_sequencer.c | 27 | ||||
-rw-r--r-- | source/blender/sequencer/SEQ_edit.h | 5 | ||||
-rw-r--r-- | source/blender/sequencer/intern/strip_edit.c | 46 |
3 files changed, 67 insertions, 11 deletions
diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c index 61b3f1d63d6..f92043995dd 100644 --- a/source/blender/makesrna/intern/rna_sequencer.c +++ b/source/blender/makesrna/intern/rna_sequencer.c @@ -1366,6 +1366,28 @@ static float rna_Sequence_fps_get(PointerRNA *ptr) return SEQ_time_sequence_get_fps(scene, seq); } +static void rna_Sequence_separate(ID *id, Sequence *seqm, Main *bmain) +{ + Scene *scene = (Scene *)id; + + /* Find the appropriate seqbase */ + Editing *ed = SEQ_editing_get(scene); + ListBase *seqbase = SEQ_get_seqbase_by_seq(&ed->seqbase, seqm); + + LISTBASE_FOREACH_MUTABLE (Sequence *, seq, &seqm->seqbase) { + SEQ_edit_move_strip_to_seqbase(scene, &seqm->seqbase, seq, seqbase); + } + + SEQ_edit_flag_for_removal(scene, seqbase, seqm); + SEQ_edit_remove_flagged_sequences(scene, seqbase); + + /* Update depsgraph. */ + DEG_relations_tag_update(bmain); + DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS); + + WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, scene); +} + #else static void rna_def_strip_element(BlenderRNA *brna) @@ -2439,6 +2461,7 @@ static void rna_def_image(BlenderRNA *brna) static void rna_def_meta(BlenderRNA *brna) { StructRNA *srna; + FunctionRNA *func; PropertyRNA *prop; srna = RNA_def_struct(brna, "MetaSequence", "Sequence"); @@ -2452,6 +2475,10 @@ static void rna_def_meta(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Sequences", "Sequences nested in meta strip"); RNA_api_sequences(brna, prop, true); + func = RNA_def_function(srna, "separate", "rna_Sequence_separate"); + RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_MAIN); + RNA_def_function_ui_description(func, "Separate meta"); + rna_def_filter_video(srna); rna_def_proxy(srna); rna_def_input(srna); diff --git a/source/blender/sequencer/SEQ_edit.h b/source/blender/sequencer/SEQ_edit.h index fbbf4bc53ea..f3a64c9cd62 100644 --- a/source/blender/sequencer/SEQ_edit.h +++ b/source/blender/sequencer/SEQ_edit.h @@ -33,10 +33,15 @@ struct Scene; struct Sequence; int SEQ_edit_sequence_swap(struct Sequence *seq_a, struct Sequence *seq_b, const char **error_str); +bool SEQ_edit_move_strip_to_seqbase(struct Scene *scene, + ListBase *seqbase, + struct Sequence *src_seq, + ListBase *dst_seqbase); bool SEQ_edit_move_strip_to_meta(struct Scene *scene, struct Sequence *src_seq, struct Sequence *dst_seqm, const char **error_str); +bool SEQ_meta_separate(struct Scene *scene, struct Sequence *src_meta, const char **error_str); void SEQ_edit_flag_for_removal(struct Scene *scene, struct ListBase *seqbase, struct Sequence *seq); diff --git a/source/blender/sequencer/intern/strip_edit.c b/source/blender/sequencer/intern/strip_edit.c index 747f0eb3deb..00b3da86306 100644 --- a/source/blender/sequencer/intern/strip_edit.c +++ b/source/blender/sequencer/intern/strip_edit.c @@ -221,6 +221,40 @@ static bool seq_exists_in_seqbase(Sequence *seq, ListBase *seqbase) return false; } +/** + * Move sequence to seqbase. + * + * \param scene: Scene containing the editing + * \param dst_seqbase: seqbase where `seq` is located + * \param seq: Sequence to move + * \param dst_seqbase: Target seqbase + */ +bool SEQ_edit_move_strip_to_seqbase(Scene *scene, + ListBase *seqbase, + Sequence *seq, + ListBase *dst_seqbase) +{ + /* Move to meta. */ + BLI_remlink(seqbase, seq); + BLI_addtail(dst_seqbase, seq); + SEQ_relations_invalidate_cache_preprocessed(scene, seq); + + /* Update meta. */ + if (SEQ_transform_test_overlap(dst_seqbase, seq)) { + SEQ_transform_seqbase_shuffle(dst_seqbase, seq, scene); + } + + return true; +} + +/** + * Move sequence to meta sequence. + * + * \param scene: Scene containing the editing + * \param src_seq: Sequence to move + * \param dst_seqm: Target Meta sequence + * \param error_str: Error message + */ bool SEQ_edit_move_strip_to_meta(Scene *scene, Sequence *src_seq, Sequence *dst_seqm, @@ -262,17 +296,7 @@ bool SEQ_edit_move_strip_to_meta(Scene *scene, Sequence *seq; SEQ_ITERATOR_FOREACH (seq, collection) { /* Move to meta. */ - BLI_remlink(seqbase, seq); - BLI_addtail(&dst_seqm->seqbase, seq); - SEQ_relations_invalidate_cache_preprocessed(scene, seq); - - /* Update meta. */ - ListBase *meta_seqbase = SEQ_get_seqbase_by_seq(&ed->seqbase, dst_seqm); - SEQ_time_update_meta_strip_range(scene, dst_seqm); - SEQ_time_update_sequence(scene, meta_seqbase, dst_seqm); - if (SEQ_transform_test_overlap(&dst_seqm->seqbase, seq)) { - SEQ_transform_seqbase_shuffle(&dst_seqm->seqbase, seq, scene); - } + SEQ_edit_move_strip_to_seqbase(scene, seqbase, seq, &dst_seqm->seqbase); } SEQ_collection_free(collection); |