Fix #30798: when linking a datablock, it got simply added to the back of the

list, now the linked datablocks are sorted by name too (but still appear after
the non-linked datablocks).
This commit is contained in:
Brecht Van Lommel 2012-04-06 16:19:30 +00:00
parent f7a0499f16
commit ee307bec88
3 changed files with 15 additions and 6 deletions

@ -58,6 +58,7 @@ int id_make_local(struct ID *id, int test);
int id_single_user(struct bContext *C, struct ID *id, struct PointerRNA *ptr, struct PropertyRNA *prop); int id_single_user(struct bContext *C, struct ID *id, struct PointerRNA *ptr, struct PropertyRNA *prop);
int id_copy(struct ID *id, struct ID **newid, int test); int id_copy(struct ID *id, struct ID **newid, int test);
int id_unlink(struct ID *id, int test); int id_unlink(struct ID *id, int test);
void id_sort_by_name(struct ListBase *lb, struct ID *id);
int new_id(struct ListBase *lb, struct ID *id, const char *name); int new_id(struct ListBase *lb, struct ID *id, const char *name);
void id_clear_lib_data(struct Main *bmain, struct ID *id); void id_clear_lib_data(struct Main *bmain, struct ID *id);

@ -1076,7 +1076,7 @@ void IMAnames_to_pupstring(const char **str, const char *title, const char *extr
BLI_dynstr_free(pupds); BLI_dynstr_free(pupds);
} }
static void sort_alpha_id(ListBase *lb, ID *id) void id_sort_by_name(ListBase *lb, ID *id)
{ {
ID *idtest; ID *idtest;
@ -1086,7 +1086,7 @@ static void sort_alpha_id(ListBase *lb, ID *id)
idtest= lb->first; idtest= lb->first;
while (idtest) { while (idtest) {
if (BLI_strcasecmp(idtest->name, id->name)>0 || idtest->lib) { if (BLI_strcasecmp(idtest->name, id->name)>0 || (idtest->lib && !id->lib)) {
BLI_insertlinkbefore(lb, idtest, id); BLI_insertlinkbefore(lb, idtest, id);
break; break;
} }
@ -1270,10 +1270,10 @@ int new_id(ListBase *lb, ID *id, const char *tname)
* functions work, so sort every time */ * functions work, so sort every time */
#if 0 #if 0
if ( result ) if ( result )
sort_alpha_id(lb, id); id_sort_by_name(lb, id);
#endif #endif
sort_alpha_id(lb, id); id_sort_by_name(lb, id);
return result; return result;
} }
@ -1415,7 +1415,7 @@ void BKE_library_make_local(Main *bmain, Library *lib, int untagged_only)
/* why sort alphabetically here but not in /* why sort alphabetically here but not in
* id_clear_lib_data() ? - campbell */ * id_clear_lib_data() ? - campbell */
sort_alpha_id(lbarray[a], id); id_sort_by_name(lbarray[a], id);
} }
else { else {
id->flag &= ~(LIB_EXTERN|LIB_INDIRECT|LIB_NEW); id->flag &= ~(LIB_EXTERN|LIB_INDIRECT|LIB_NEW);
@ -1455,7 +1455,7 @@ void test_idbutton(char *name)
/* search for id */ /* search for id */
idtest= BLI_findstring(lb, name, offsetof(ID, name) + 2); idtest= BLI_findstring(lb, name, offsetof(ID, name) + 2);
if (idtest) if ( new_id(lb, idtest, name)==0 ) sort_alpha_id(lb, idtest); if (idtest) if ( new_id(lb, idtest, name)==0 ) id_sort_by_name(lb, idtest);
} }
void text_idbutton(struct ID *id, char *text) void text_idbutton(struct ID *id, char *text)

@ -14587,9 +14587,17 @@ static ID *append_named_part(Main *mainl, FileData *fd, const char *idname, cons
found= 1; found= 1;
id= is_yet_read(fd, mainl, bhead); id= is_yet_read(fd, mainl, bhead);
if (id==NULL) { if (id==NULL) {
/* not read yet */
read_libblock(fd, mainl, bhead, LIB_TESTEXT, &id); read_libblock(fd, mainl, bhead, LIB_TESTEXT, &id);
if (id) {
/* sort by name in list */
ListBase *lb= which_libbase(mainl, idcode);
id_sort_by_name(lb, id);
}
} }
else { else {
/* already linked */
printf("append: already linked\n"); printf("append: already linked\n");
oldnewmap_insert(fd->libmap, bhead->old, id, 1); oldnewmap_insert(fd->libmap, bhead->old, id, 1);
if (id->flag & LIB_INDIRECT) { if (id->flag & LIB_INDIRECT) {