sequencer clipboard
[blender.git] / source / blender / blenkernel / intern / sequencer.c
index 2faaa2fb5f5f87f5f86c49463866b16c69fbab5d..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);
@@ -3259,7 +3273,7 @@ void seq_tx_set_final_right(Sequence *seq, int val)
 
 /* used so we can do a quick check for single image seq
    since they work a bit differently to normal image seq's (during transform) */
-int check_single_seq(Sequence *seq)
+int seq_single_check(Sequence *seq)
 {
        if ( seq->len==1 && (seq->type == SEQ_IMAGE || seq->type == SEQ_COLOR))
                return 1;
@@ -3276,7 +3290,7 @@ void seq_tx_handle_xlimits(Sequence *seq, int leftflag, int rightflag)
                        seq_tx_set_final_left(seq, seq_tx_get_final_right(seq, 0)-1);
                }
 
-               if (check_single_seq(seq)==0) {
+               if (seq_single_check(seq)==0) {
                        if (seq_tx_get_final_left(seq, 0) >= seq_tx_get_end(seq)) {
                                seq_tx_set_final_left(seq, seq_tx_get_end(seq)-1);
                        }
@@ -3298,7 +3312,7 @@ void seq_tx_handle_xlimits(Sequence *seq, int leftflag, int rightflag)
                        seq_tx_set_final_right(seq, seq_tx_get_final_left(seq, 0)+1);
                }
 
-               if (check_single_seq(seq)==0) {
+               if (seq_single_check(seq)==0) {
                        if (seq_tx_get_final_right(seq, 0) <= seq_tx_get_start(seq)) {
                                seq_tx_set_final_right(seq, seq_tx_get_start(seq)+1);
                        }
@@ -3312,10 +3326,10 @@ void seq_tx_handle_xlimits(Sequence *seq, int leftflag, int rightflag)
        }
 }
 
-void fix_single_seq(Sequence *seq)
+void seq_single_fix(Sequence *seq)
 {
        int left, start, offset;
-       if (!check_single_seq(seq))
+       if (!seq_single_check(seq))
                return;
 
        /* make sure the image is always at the start since there is only one,
@@ -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);