VSE: Add meta.separate() Python API function
This function can be used to "dissolve" meta strip anywhere in strip hierarchy. This has same effect as `meta_separate` operator. Reviewed By: ISS Differential Revision: https://developer.blender.org/T91005
This commit is contained in:
parent
f1f7a8b018
commit
9cf3d841a8
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue