diff options
author | Campbell Barton <ideasman42@gmail.com> | 2010-02-16 20:58:50 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2010-02-16 20:58:50 +0300 |
commit | 57308d838262f3d059b688aa31718af25fb21abb (patch) | |
tree | 2bb8a3119d1eeace4035d522adf8bb47cbf23fbd | |
parent | 24a0eececfaf35ffc19053266254b6d5799c87a1 (diff) |
[#21102] Nonunique ID names in sequencer!
now uniqute names are ensured with recursive name checking on the scene
-rw-r--r-- | source/blender/blenkernel/BKE_sequencer.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/sequencer.c | 71 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_sequencer/sequencer_add.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_sequencer/sequencer_edit.c | 21 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_sequencer.c | 14 |
6 files changed, 80 insertions, 33 deletions
diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h index 2004db9a70a..b0a810203cf 100644 --- a/source/blender/blenkernel/BKE_sequencer.h +++ b/source/blender/blenkernel/BKE_sequencer.h @@ -194,6 +194,7 @@ void free_imbuf_seq(struct Scene *scene, struct ListBase * seqbasep, int check_m void seq_update_sound(struct Scene* scene, struct Sequence *seq); void seq_update_muting(struct Scene* scene, struct Editing *ed); void seqbase_sound_reload(Scene *scene, ListBase *seqbase); +void seqbase_unique_name_recursive(ListBase *seqbasep, struct Sequence *seq); void clear_scene_in_allseqs(struct Scene *sce); struct Sequence *get_seq_by_name(struct ListBase *seqbase, const char *name, int recursive); @@ -228,8 +229,6 @@ struct Sequence *alloc_sequence(ListBase *lb, int cfra, int machine); void seq_load_apply(struct Scene *scene, struct Sequence *seq, struct SeqLoadInfo *seq_load); -void seqUniqueName(ListBase *seqbasep, struct Sequence *seq); - struct Sequence *sequencer_add_image_strip(struct bContext *C, ListBase *seqbasep, struct SeqLoadInfo *seq_load); struct Sequence *sequencer_add_sound_strip(struct bContext *C, ListBase *seqbasep, struct SeqLoadInfo *seq_load); struct Sequence *sequencer_add_movie_strip(struct bContext *C, ListBase *seqbasep, struct SeqLoadInfo *seq_load); diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index d7d63e850de..ce09fe8817f 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -640,7 +640,7 @@ void reload_sequence_new_file(Scene *scene, Sequence * seq) } BLI_strncpy(seq->name+2, sce->id.name + 2, SEQ_NAME_MAXSTR-2); - seqUniqueName(scene->ed->seqbasep, seq); + seqbase_unique_name_recursive(&scene->ed->seqbase, seq); seq->len= seq->scene->r.efra - seq->scene->r.sfra + 1; seq->len -= seq->anim_startofs; @@ -720,6 +720,62 @@ void clear_scene_in_allseqs(Scene *scene) } } +typedef struct SeqUniqueInfo { + Sequence *seq; + char name_src[32]; + char name_dest[32]; + int count; + int match; +} SeqUniqueInfo; + +/* +static void seqbase_unique_name(ListBase *seqbasep, Sequence *seq) +{ + BLI_uniquename(seqbasep, seq, "Sequence", '.', offsetof(Sequence, name), SEQ_NAME_MAXSTR); +}*/ + +static void seqbase_unique_name(ListBase *seqbasep, SeqUniqueInfo *sui) +{ + Sequence *seq; + for(seq=seqbasep->first; seq; seq= seq->next) { + if (sui->seq != seq && strcmp(sui->name_dest, seq->name+2)==0) { + sprintf(sui->name_dest, "%.18s.%03d", sui->name_src, sui->count++); + sui->match= 1; /* be sure to re-scan */ + } + } +} + +static int seqbase_unique_name_recursive_cb(Sequence *seq, void *arg_pt) +{ + if(seq->seqbase.first) + seqbase_unique_name(&seq->seqbase, (SeqUniqueInfo *)arg_pt); + return 1; +} + +void seqbase_unique_name_recursive(ListBase *seqbasep, struct Sequence *seq) +{ + SeqUniqueInfo sui; + char *dot; + sui.seq= seq; + strcpy(sui.name_src, seq->name+2); + strcpy(sui.name_dest, seq->name+2); + + /* Strip off the suffix */ + if ((dot=strrchr(sui.name_src, '.'))) + *dot= '\0'; + + sui.count= 1; + sui.match= 1; /* assume the worst to start the loop */ + + while(sui.match) { + sui.match= 0; + seqbase_unique_name(seqbasep, &sui); + seqbase_recursive_apply(seqbasep, seqbase_unique_name_recursive_cb, &sui); + } + + strcpy(seq->name+2, sui.name_dest); +} + static char *give_seqname_by_type(int type) { switch(type) { @@ -3685,7 +3741,7 @@ void seq_load_apply(Scene *scene, Sequence *seq, SeqLoadInfo *seq_load) { if(seq) { strcpy(seq->name, seq_load->name); - seqUniqueName(scene->ed->seqbasep, seq); + seqbase_unique_name_recursive(&scene->ed->seqbase, seq); if(seq_load->flag & SEQ_LOAD_FRAME_ADVANCE) { seq_load->start_frame += (seq->enddisp - seq->startdisp); @@ -3728,11 +3784,6 @@ Sequence *alloc_sequence(ListBase *lb, int cfra, int machine) return seq; } -void seqUniqueName(ListBase *seqbasep, Sequence *seq) -{ - BLI_uniquename(seqbasep, seq, "Sequence", '.', offsetof(Sequence, name), SEQ_NAME_MAXSTR); -} - /* NOTE: this function doesn't fill in image names */ Sequence *sequencer_add_image_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo *seq_load) { @@ -3744,7 +3795,7 @@ Sequence *sequencer_add_image_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo seq = alloc_sequence(seqbasep, seq_load->start_frame, seq_load->channel); seq->type= SEQ_IMAGE; BLI_strncpy(seq->name+2, "Image", SEQ_NAME_MAXSTR-2); - seqUniqueName(seqbasep, seq); + seqbase_unique_name_recursive(&scene->ed->seqbase, seq); /* basic defaults */ seq->strip= strip= MEM_callocN(sizeof(Strip), "strip"); @@ -3793,7 +3844,7 @@ Sequence *sequencer_add_sound_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo seq->type= SEQ_SOUND; seq->sound= sound; BLI_strncpy(seq->name+2, "Sound", SEQ_NAME_MAXSTR-2); - seqUniqueName(seqbasep, seq); + seqbase_unique_name_recursive(&scene->ed->seqbase, seq); /* basic defaults */ seq->strip= strip= MEM_callocN(sizeof(Strip), "strip"); @@ -3837,7 +3888,7 @@ Sequence *sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo seq->anim= an; seq->anim_preseek = IMB_anim_get_preseek(an); BLI_strncpy(seq->name+2, "Movie", SEQ_NAME_MAXSTR-2); - seqUniqueName(seqbasep, seq); + seqbase_unique_name_recursive(&scene->ed->seqbase, seq); /* basic defaults */ seq->strip= strip= MEM_callocN(sizeof(Strip), "strip"); diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 627e086ba94..5b17cc14ff2 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -10120,7 +10120,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) { seq=sce->ed->seqbasep->first; while(seq) { - seqUniqueName(sce->ed->seqbasep, seq); + seqbase_unique_name_recursive(&sce->ed->seqbase, seq); seq=seq->next; } } diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c index bae4467e40c..bd1053d8d77 100644 --- a/source/blender/editors/space_sequencer/sequencer_add.c +++ b/source/blender/editors/space_sequencer/sequencer_add.c @@ -513,7 +513,7 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op) else strcpy(seq->name+2, give_seqname(seq)); - seqUniqueName(ed->seqbasep, seq); + seqbase_unique_name_recursive(&ed->seqbase, seq); sh = get_sequence_effect(seq); diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 0fe074a4012..ce8d99da3a9 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -862,7 +862,7 @@ static Sequence *dupli_seq(struct Scene *scene, Sequence *seq) " now...\n"); } - seqUniqueName(scene->ed->seqbasep, seqn); + seqbase_unique_name_recursive(&scene->ed->seqbase, seqn); return seqn; } @@ -1735,11 +1735,20 @@ static int sequencer_add_duplicate_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; recurs_dupli_seq(scene, ed->seqbasep, &new, TRUE); - addlisttolist(ed->seqbasep, &new); - WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene); + if(new.first) { + Sequence * seq= new.first; + /* rely on the new list being added at the end */ + addlisttolist(ed->seqbasep, &new); - return OPERATOR_FINISHED; + for( ; seq; seq= seq->next) + seqbase_unique_name_recursive(&ed->seqbase, seq); + + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene); + return OPERATOR_FINISHED; + } + + return OPERATOR_CANCELLED; } static int sequencer_add_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event) @@ -1905,7 +1914,7 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op) shuffle_seq(ed->seqbasep, seq_new, scene); } - seqUniqueName(scene->ed->seqbasep, seq_new); + seqbase_unique_name_recursive(&scene->ed->seqbase, seq_new); cfra++; start_ofs += step; @@ -2069,7 +2078,7 @@ static int sequencer_meta_make_exec(bContext *C, wmOperator *op) seq_update_muting(scene, ed); - seqUniqueName(scene->ed->seqbasep, seqm); + seqbase_unique_name_recursive(&scene->ed->seqbase, seqm); WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene); diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c index 2346b0c3033..17dbbbf9d05 100644 --- a/source/blender/makesrna/intern/rna_sequencer.c +++ b/source/blender/makesrna/intern/rna_sequencer.c @@ -235,22 +235,10 @@ static int rna_Sequence_name_length(PointerRNA *ptr) static void rna_Sequence_name_set(PointerRNA *ptr, const char *value) { Scene *scene= (Scene*)ptr->id.data; -// Editing *ed= seq_give_editing(scene, FALSE); Sequence *seq= (Sequence*)ptr->data; -// Sequence *iseq; BLI_strncpy(seq->name+2, value, sizeof(seq->name)-2); - seqUniqueName(&scene->ed->seqbase, seq); - - // TODO, unique name for all meta's - /* - SEQ_BEGIN(ed, iseq) { - if(iseq->seqbase.first) - seqUniqueName(&iseq->seqbase, seq); - - } - SEQ_END - */ + seqbase_unique_name_recursive(&scene->ed->seqbase, seq); } static StructRNA* rna_Sequence_refine(struct PointerRNA *ptr) |