Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFĂ©lix <Miadim>2022-06-27 20:29:41 +0300
committerRichard Antalik <richardantalik@gmail.com>2022-06-27 20:44:16 +0300
commit6b35d9e6fbef49d4ce61604c27393425c16cd7a6 (patch)
treead67b3e9f1c1ea448f04aeb15f295b332a4824d8 /source/blender/sequencer/intern
parenta2b9b9d3c48f302fd28042299d73ea0634a210f3 (diff)
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
Diffstat (limited to 'source/blender/sequencer/intern')
-rw-r--r--source/blender/sequencer/intern/sequencer.c55
-rw-r--r--source/blender/sequencer/intern/strip_edit.c17
-rw-r--r--source/blender/sequencer/intern/strip_relations.c13
3 files changed, 60 insertions, 25 deletions
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;
+}
+
/** \} */
/* -------------------------------------------------------------------- */
diff --git a/source/blender/sequencer/intern/strip_edit.c b/source/blender/sequencer/intern/strip_edit.c
index bd439e3c9f8..4a88eab0fe2 100644
--- a/source/blender/sequencer/intern/strip_edit.c
+++ b/source/blender/sequencer/intern/strip_edit.c
@@ -192,19 +192,6 @@ void SEQ_edit_remove_flagged_sequences(Scene *scene, ListBase *seqbase)
}
}
-static bool seq_exists_in_seqbase(Sequence *seq, ListBase *seqbase)
-{
- LISTBASE_FOREACH (Sequence *, seq_test, seqbase) {
- if (seq_test->type == SEQ_TYPE_META && seq_exists_in_seqbase(seq, &seq_test->seqbase)) {
- return true;
- }
- if (seq_test == seq) {
- return true;
- }
- }
- return false;
-}
-
bool SEQ_edit_move_strip_to_seqbase(Scene *scene,
ListBase *seqbase,
Sequence *seq,
@@ -247,12 +234,12 @@ bool SEQ_edit_move_strip_to_meta(Scene *scene,
return false;
}
- if (src_seq->type == SEQ_TYPE_META && seq_exists_in_seqbase(dst_seqm, &src_seq->seqbase)) {
+ if (src_seq->type == SEQ_TYPE_META && SEQ_exists_in_seqbase(dst_seqm, &src_seq->seqbase)) {
*error_str = N_("Moved strip is parent of provided meta strip");
return false;
}
- if (!seq_exists_in_seqbase(dst_seqm, &ed->seqbase)) {
+ if (!SEQ_exists_in_seqbase(dst_seqm, &ed->seqbase)) {
*error_str = N_("Can not move strip to different scene");
return false;
}
diff --git a/source/blender/sequencer/intern/strip_relations.c b/source/blender/sequencer/intern/strip_relations.c
index 4acf2763ce5..a123212cb6e 100644
--- a/source/blender/sequencer/intern/strip_relations.c
+++ b/source/blender/sequencer/intern/strip_relations.c
@@ -457,3 +457,16 @@ struct Sequence *SEQ_find_metastrip_by_sequence(ListBase *seqbase, Sequence *met
return NULL;
}
+
+bool SEQ_exists_in_seqbase(const Sequence *seq, const ListBase *seqbase)
+{
+ LISTBASE_FOREACH (Sequence *, seq_test, seqbase) {
+ if (seq_test->type == SEQ_TYPE_META && SEQ_exists_in_seqbase(seq, &seq_test->seqbase)) {
+ return true;
+ }
+ if (seq_test == seq) {
+ return true;
+ }
+ }
+ return false;
+}