Fix sequencer clipboard with meta's containing ID references

This commit is contained in:
Campbell Barton 2014-10-21 11:36:11 +02:00
parent 2e7d72202f
commit 40938c3b4b
3 changed files with 36 additions and 20 deletions

View File

@ -217,6 +217,10 @@ void BKE_sequence_clipboard_pointers_free(struct Sequence *seq);
void BKE_sequence_clipboard_pointers_store(struct Sequence *seq);
void BKE_sequence_clipboard_pointers_restore(struct Sequence *seq, struct Main *bmain);
void BKE_sequencer_base_clipboard_pointers_free(struct ListBase *seqbase);
void BKE_sequencer_base_clipboard_pointers_store(struct ListBase *seqbase);
void BKE_sequencer_base_clipboard_pointers_restore(struct ListBase *seqbase, struct Main *bmain);
void BKE_sequence_free(struct Scene *scene, struct Sequence *seq);
const char *BKE_sequence_give_name(struct Sequence *seq);
void BKE_sequence_calc(struct Scene *scene, struct Sequence *seq);

View File

@ -257,26 +257,15 @@ Editing *BKE_sequencer_editing_get(Scene *scene, bool alloc)
return scene->ed;
}
static void seq_free_clipboard_recursive(Sequence *seq_parent)
{
Sequence *seq, *nseq;
for (seq = seq_parent->seqbase.first; seq; seq = nseq) {
nseq = seq->next;
seq_free_clipboard_recursive(seq);
}
BKE_sequence_clipboard_pointers_free(seq_parent);
BKE_sequence_free_ex(NULL, seq_parent, false);
}
void BKE_sequencer_free_clipboard(void)
{
Sequence *seq, *nseq;
BKE_sequencer_base_clipboard_pointers_free(&seqbase_clipboard);
for (seq = seqbase_clipboard.first; seq; seq = nseq) {
nseq = seq->next;
seq_free_clipboard_recursive(seq);
seq_free_sequence_recurse(NULL, seq);
}
BLI_listbase_clear(&seqbase_clipboard);
}
@ -373,6 +362,33 @@ void BKE_sequence_clipboard_pointers_restore(Sequence *seq, Main *bmain)
seqclipboard_ptr_restore(bmain, (ID **)&seq->mask);
seqclipboard_ptr_restore(bmain, (ID **)&seq->sound);
}
/* recursive versions of funcions above */
void BKE_sequencer_base_clipboard_pointers_free(ListBase *seqbase)
{
Sequence *seq;
for (seq = seqbase->first; seq; seq = seq->next) {
BKE_sequence_clipboard_pointers_free(seq);
BKE_sequencer_base_clipboard_pointers_free(&seq->seqbase);
}
}
void BKE_sequencer_base_clipboard_pointers_store(ListBase *seqbase)
{
Sequence *seq;
for (seq = seqbase->first; seq; seq = seq->next) {
BKE_sequence_clipboard_pointers_store(seq);
BKE_sequencer_base_clipboard_pointers_store(&seq->seqbase);
}
}
void BKE_sequencer_base_clipboard_pointers_restore(ListBase *seqbase, Main *bmain)
{
Sequence *seq;
for (seq = seqbase->first; seq; seq = seq->next) {
BKE_sequence_clipboard_pointers_restore(seq, bmain);
BKE_sequencer_base_clipboard_pointers_restore(&seq->seqbase, bmain);
}
}
/* end clipboard pointer mess */

View File

@ -3153,9 +3153,7 @@ static int sequencer_copy_exec(bContext *C, wmOperator *op)
}
/* duplicate pointers */
for (seq = seqbase_clipboard.first; seq; seq = seq->next) {
BKE_sequence_clipboard_pointers_store(seq);
}
BKE_sequencer_base_clipboard_pointers_store(&seqbase_clipboard);
}
return OPERATOR_FINISHED;
@ -3199,9 +3197,7 @@ static int sequencer_paste_exec(bContext *C, wmOperator *UNUSED(op))
}
}
for (iseq = nseqbase.first; iseq; iseq = iseq->next) {
BKE_sequence_clipboard_pointers_restore(iseq, bmain);
}
BKE_sequencer_base_clipboard_pointers_restore(&nseqbase, bmain);
for (iseq = nseqbase.first; iseq; iseq = iseq->next) {
BKE_sequence_sound_init(scene, iseq);