From 6b35d9e6fbef49d4ce61604c27393425c16cd7a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix?= Date: Mon, 27 Jun 2022 19:29:41 +0200 Subject: VSE: Add API function to select displayed meta strip Use function `sequence_editor.display_stack(meta_strip)` to set displayed timeline content. To view top-level timeline, that does not belong to any meta strip, pass `None` as argument. Differential Revision: https://developer.blender.org/D12048 --- source/blender/sequencer/intern/sequencer.c | 55 +++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 10 deletions(-) (limited to 'source/blender/sequencer/intern/sequencer.c') diff --git a/source/blender/sequencer/intern/sequencer.c b/source/blender/sequencer/intern/sequencer.c index ad57412034a..71f4aef6916 100644 --- a/source/blender/sequencer/intern/sequencer.c +++ b/source/blender/sequencer/intern/sequencer.c @@ -397,23 +397,23 @@ void SEQ_seqbase_active_set(Editing *ed, ListBase *seqbase) ed->seqbasep = seqbase; } -MetaStack *SEQ_meta_stack_alloc(Editing *ed, Sequence *seq_meta) +static MetaStack *seq_meta_stack_alloc(const Scene *scene, Sequence *seq_meta) { + Editing *ed = SEQ_editing_get(scene); + MetaStack *ms = MEM_mallocN(sizeof(MetaStack), "metastack"); - BLI_addtail(&ed->metastack, ms); + BLI_addhead(&ed->metastack, ms); ms->parseq = seq_meta; - ms->oldbasep = ed->seqbasep; - ms->old_channels = ed->displayed_channels; + + /* Reference to previously displayed timeline data. */ + Sequence *higher_level_meta = seq_sequence_lookup_meta_by_seq(scene, seq_meta); + ms->oldbasep = higher_level_meta ? &higher_level_meta->seqbase : &ed->seqbase; + ms->old_channels = higher_level_meta ? &higher_level_meta->channels : &ed->channels; + copy_v2_v2_int(ms->disp_range, &ms->parseq->startdisp); return ms; } -void SEQ_meta_stack_free(Editing *ed, MetaStack *ms) -{ - BLI_remlink(&ed->metastack, ms); - MEM_freeN(ms); -} - MetaStack *SEQ_meta_stack_active_get(const Editing *ed) { if (ed == NULL) { @@ -423,6 +423,41 @@ MetaStack *SEQ_meta_stack_active_get(const Editing *ed) return ed->metastack.last; } +void SEQ_meta_stack_set(const Scene *scene, Sequence *seqm) +{ + Editing *ed = SEQ_editing_get(scene); + /* Clear metastack */ + BLI_freelistN(&ed->metastack); + + if (seqm != NULL) { + /* Allocate meta stack in a way, that represents meta hierarchy in timeline. */ + seq_meta_stack_alloc(scene, seqm); + Sequence *meta_parent = seqm; + while (meta_parent = seq_sequence_lookup_meta_by_seq(scene, meta_parent)) { + seq_meta_stack_alloc(scene, meta_parent); + } + + SEQ_seqbase_active_set(ed, &seqm->seqbase); + SEQ_channels_displayed_set(ed, &seqm->channels); + } + else { + /* Go to top level, exiting meta strip. */ + SEQ_seqbase_active_set(ed, &ed->seqbase); + SEQ_channels_displayed_set(ed, &ed->channels); + } +} + +Sequence *SEQ_meta_stack_pop(Editing *ed) +{ + MetaStack *ms = SEQ_meta_stack_active_get(ed); + Sequence *meta_parent = ms->parseq; + SEQ_seqbase_active_set(ed, ms->oldbasep); + SEQ_channels_displayed_set(ed, ms->old_channels); + BLI_remlink(&ed->metastack, ms); + MEM_freeN(ms); + return meta_parent; +} + /** \} */ /* -------------------------------------------------------------------- */ -- cgit v1.2.3