sequencer clipboard
[blender.git] / source / blender / blenkernel / intern / sequencer.c
index 4d6033e4f4a34ff7c4d36f9a46dc1d7f3b51af6a..41e51885bfcf21fe1aeb06d8b664bad60237cc47 100644 (file)
@@ -232,11 +232,23 @@ Editing *seq_give_editing(Scene *scene, int alloc)
        return scene->ed;
 }
 
+void seq_free_clipboard(Scene *scene)
+{
+       Editing *ed = scene->ed;
+       Sequence *seq, *nseq;
+
+       for(seq= ed->seqbase_clipboard.first; seq; seq= nseq) {
+               nseq= seq->next;
+               seq_free_sequence(scene, seq);
+       }
+       ed->seqbase_clipboard.first= ed->seqbase_clipboard.last= NULL;
+}
+
 void seq_free_editing(Scene *scene)
 {
        Editing *ed = scene->ed;
        MetaStack *ms;
-       Sequence *seq;
+       Sequence *seq, *nseq;
 
        if(ed==NULL)
                return;
@@ -246,6 +258,8 @@ void seq_free_editing(Scene *scene)
        }
        SEQ_END
 
+       seq_free_clipboard(scene);
+
        while((ms= ed->metastack.first)) {
                BLI_remlink(&ed->metastack, ms);
                MEM_freeN(ms);
@@ -3532,6 +3546,23 @@ void seq_update_muting(Editing *ed)
        }
 }
 
+/* in cases where we done know the sequence's listbase */
+ListBase *seq_seqbase(ListBase *seqbase, Sequence *seq)
+{
+       Sequence *iseq;
+       ListBase *lb= NULL;
+
+       for(iseq= seqbase->first; iseq; iseq= iseq->next) {
+               if(seq==iseq) {
+                       return seqbase;
+               }
+               else if(iseq->seqbase.first && (lb= seq_seqbase(&iseq->seqbase, seq))) {
+                       return lb;
+               }
+       }
+
+       return NULL;
+}
 
 /* XXX - hackish function needed for transforming strips! TODO - have some better solution */
 void seq_offset_animdata(Scene *scene, Sequence *seq, int ofs)
@@ -3558,6 +3589,23 @@ void seq_offset_animdata(Scene *scene, Sequence *seq, int ofs)
 }
 
 
+Sequence *get_seq_by_name(ListBase *seqbase, const char *name, int recursive)
+{
+       Sequence *iseq=NULL;
+       Sequence *rseq=NULL;
+
+       for (iseq=seqbase->first; iseq; iseq=iseq->next) {
+               if (strcmp(name, iseq->name+2) == 0)
+                       return iseq;
+               else if(recursive && (iseq->seqbase.first) && (rseq=get_seq_by_name(&iseq->seqbase, name, 1))) {
+                       return rseq;
+               }
+       }
+
+       return NULL;
+}
+
+
 Sequence *active_seq_get(Scene *scene)
 {
        Editing *ed= seq_give_editing(scene, FALSE);