/* if lib!=NULL, only all from lib local */ void all_local(Library *lib, int untagged_only) { ListBase *lbarray[MAX_LIBARRAY], tempbase={NULL, NULL}; ID *id, *idn; int a; a= set_listbasepointers(G.main, lbarray); while(a--) { id= lbarray[a]->first; while(id) { id->newid= NULL; idn= id->next; /* id is possibly being inserted again */ /* The check on the second line (LIB_PRE_EXISTING) is done so its * possible to tag data you dont want to be made local, used for * appending data, so any libdata already linked wont become local * (very nasty to discover all your links are lost after appending) * */ if(id->flag & (LIB_EXTERN|LIB_INDIRECT|LIB_NEW) && (untagged_only==0 || !(id->flag & LIB_PRE_EXISTING))) { if(lib==NULL || id->lib==lib) { id->flag &= ~(LIB_EXTERN|LIB_INDIRECT|LIB_NEW); if(id->lib) { /* relative file patch */ if(GS(id->name)==ID_IM) image_fix_relative_path((Image *)id); id->lib= NULL; new_id(lbarray[a], id, NULL); /* new_id only does it with double names */ sort_alpha_id(lbarray[a], id); } } } id= idn; } /* patch2: make it aphabetically */ while( (id=tempbase.first) ) { BLI_remlink(&tempbase, id); BLI_addtail(lbarray[a], id); new_id(lbarray[a], id, NULL); } } /* patch 3: make sure library data isn't indirect falsely... */ a= set_listbasepointers(G.main, lbarray); while(a--) { for(id= lbarray[a]->first; id; id=id->next) lib_indirect_test_id(id, lib); } }
void test_idbutton(char *name) { /* called from buttons: when name already exists: call new_id */ ListBase *lb; ID *idtest; lb= which_libbase(G.main, GS(name-2) ); if(lb==NULL) return; /* search for id */ idtest= BLI_findstring(lb, name, offsetof(ID, name) + 2); if(idtest) if( new_id(lb, idtest, name)==0 ) sort_alpha_id(lb, idtest); }
int new_id(ListBase *lb, ID *id, const char *tname) { int result; char name[MAX_ID_NAME-2]; /* if library, don't rename */ if(id->lib) return 0; /* if no libdata given, look up based on ID */ if(lb==NULL) lb= which_libbase(G.main, GS(id->name)); /* if no name given, use name of current ID * else make a copy (tname args can be const) */ if(tname==NULL) tname= id->name+2; strncpy(name, tname, sizeof(name)-1); /* if result > 21, strncpy don't put the final '\0' to name. * easier to assign each time then to check if its needed */ name[sizeof(name)-1]= 0; if(name[0] == '\0') { /* disallow empty names */ strcpy(name, ID_FALLBACK_NAME); } else { /* disallow non utf8 chars, * the interface checks for this but new ID's based on file names dont */ BLI_utf8_invalid_strip(name, strlen(name)); } result = check_for_dupid(lb, id, name); strcpy(id->name+2, name); /* This was in 2.43 and previous releases * however all data in blender should be sorted, not just duplicate names * sorting should not hurt, but noting just incause it alters the way other * functions work, so sort every time */ /* if( result ) sort_alpha_id(lb, id);*/ sort_alpha_id(lb, id); return result; }
void test_idbutton(char *name) { /* called from buttons: when name already exists: call new_id */ ListBase *lb; ID *idtest; lb= wich_libbase(G.main, GS(name-2) ); if(lb==0) return; /* search for id */ idtest= lb->first; while(idtest) { if( strcmp(idtest->name+2, name)==0) break; idtest= idtest->next; } if(idtest) if( new_id(lb, idtest, name)==0 ) sort_alpha_id(lb, idtest); }
int new_id(ListBase *lb, ID *id, const char *tname) { int result; char name[22]; /* if library, don't rename */ if(id->lib) return 0; /* if no libdata given, look up based on ID */ if(lb==NULL) lb= wich_libbase(G.main, GS(id->name)); if(tname==0) { /* if no name given, use name of current ID */ strncpy(name, id->name+2, 21); result= strlen(id->name+2); } else { /* else make a copy (tname args can be const) */ strncpy(name, tname, 21); result= strlen(tname); } /* if result > 21, strncpy don't put the final '\0' to name. */ if( result >= 21 ) name[21]= 0; result = check_for_dupid( lb, id, name ); strcpy( id->name+2, name ); /* This was in 2.43 and previous releases * however all data in blender should be sorted, not just duplicate names * sorting should not hurt, but noting just incause it alters the way other * functions work, so sort every time */ /* if( result ) sort_alpha_id(lb, id);*/ sort_alpha_id(lb, id); return result; }