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
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2010-02-16 20:58:50 +0300
committerCampbell Barton <ideasman42@gmail.com>2010-02-16 20:58:50 +0300
commit57308d838262f3d059b688aa31718af25fb21abb (patch)
tree2bb8a3119d1eeace4035d522adf8bb47cbf23fbd /source
parent24a0eececfaf35ffc19053266254b6d5799c87a1 (diff)
[#21102] Nonunique ID names in sequencer!
now uniqute names are ensured with recursive name checking on the scene
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_sequencer.h3
-rw-r--r--source/blender/blenkernel/intern/sequencer.c71
-rw-r--r--source/blender/blenloader/intern/readfile.c2
-rw-r--r--source/blender/editors/space_sequencer/sequencer_add.c2
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c21
-rw-r--r--source/blender/makesrna/intern/rna_sequencer.c14
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)