Fix #115192: Inconsistent behavior renaming data-blocks
This is due to `BLI_findstring` returning wrong id from passed name. Two IDs can have same name before making them unique so it can return wrong id. To fix this, pass id argument instead of id_name to `BLI_libblock_ensure_unique_name` and skip the use of `BLI_findstring` Pull Request: https://projects.blender.org/blender/blender/pulls/116246
This commit is contained in:
committed by
Pratik Borhade
parent
4da32e9334
commit
195bb4f8f5
@@ -207,7 +207,7 @@ void BKE_libblock_rename(struct Main *bmain, struct ID *id, const char *name) AT
|
||||
* Use after setting the ID's name
|
||||
* When name exists: call 'new_id'
|
||||
*/
|
||||
void BLI_libblock_ensure_unique_name(struct Main *bmain, const char *name) ATTR_NONNULL();
|
||||
void BLI_libblock_ensure_unique_name(struct Main *bmain, ID *id) ATTR_NONNULL();
|
||||
|
||||
struct ID *BKE_libblock_find_name(struct Main *bmain,
|
||||
short type,
|
||||
|
||||
@@ -1633,6 +1633,7 @@ bool BKE_id_new_name_validate(
|
||||
}
|
||||
|
||||
result = BKE_main_namemap_get_name(bmain, id, name, false);
|
||||
result |= !STREQ(id->name + 2, name);
|
||||
|
||||
BLI_strncpy(id->name + 2, name, sizeof(id->name) - 2);
|
||||
id_sort_by_name(lb, id, nullptr);
|
||||
@@ -2005,21 +2006,17 @@ void BKE_library_make_local(Main *bmain,
|
||||
#endif
|
||||
}
|
||||
|
||||
void BLI_libblock_ensure_unique_name(Main *bmain, const char *name)
|
||||
void BLI_libblock_ensure_unique_name(Main *bmain, ID *id)
|
||||
{
|
||||
ListBase *lb;
|
||||
ID *idtest;
|
||||
|
||||
lb = which_libbase(bmain, GS(name));
|
||||
lb = which_libbase(bmain, GS(id->name));
|
||||
if (lb == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* search for id */
|
||||
idtest = static_cast<ID *>(BLI_findstring(lb, name + 2, offsetof(ID, name) + 2));
|
||||
if (idtest != nullptr && !ID_IS_LINKED(idtest)) {
|
||||
/* BKE_id_new_name_validate also takes care of sorting. */
|
||||
BKE_id_new_name_validate(bmain, lb, idtest, nullptr, false);
|
||||
if (!ID_IS_LINKED(id) && BKE_id_new_name_validate(bmain, lb, id, nullptr, false)) {
|
||||
bmain->is_memfile_undo_written = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,7 +104,7 @@ ID *do_versions_rename_id(Main *bmain,
|
||||
BKE_main_namemap_remove_name(bmain, id, id->name + 2);
|
||||
BLI_strncpy(id->name + 2, name_dst, sizeof(id->name) - 2);
|
||||
/* We know it's unique, this just sorts. */
|
||||
BLI_libblock_ensure_unique_name(bmain, id->name);
|
||||
BLI_libblock_ensure_unique_name(bmain, id);
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
@@ -531,7 +531,7 @@ void BLO_update_defaults_startup_blend(Main *bmain, const char *app_template)
|
||||
if (!STREQ(screen->id.name + 2, workspace->id.name + 2)) {
|
||||
BKE_main_namemap_remove_name(bmain, &screen->id, screen->id.name + 2);
|
||||
BLI_strncpy(screen->id.name + 2, workspace->id.name + 2, sizeof(screen->id.name) - 2);
|
||||
BLI_libblock_ensure_unique_name(bmain, screen->id.name);
|
||||
BLI_libblock_ensure_unique_name(bmain, &screen->id);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -686,7 +686,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname)
|
||||
|
||||
if (tselem->type == TSE_SOME_ID) {
|
||||
BKE_main_namemap_remove_name(bmain, tselem->id, oldname);
|
||||
BLI_libblock_ensure_unique_name(bmain, tselem->id->name);
|
||||
BLI_libblock_ensure_unique_name(bmain, tselem->id);
|
||||
|
||||
WM_msg_publish_rna_prop(mbus, tselem->id, tselem->id, ID, name);
|
||||
|
||||
@@ -754,7 +754,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname)
|
||||
case TSE_NLA_ACTION: {
|
||||
bAction *act = (bAction *)tselem->id;
|
||||
BKE_main_namemap_remove_name(bmain, &act->id, oldname);
|
||||
BLI_libblock_ensure_unique_name(bmain, act->id.name);
|
||||
BLI_libblock_ensure_unique_name(bmain, &act->id);
|
||||
WM_msg_publish_rna_prop(mbus, &act->id, &act->id, ID, name);
|
||||
DEG_id_tag_update(tselem->id, ID_RECALC_COPY_ON_WRITE);
|
||||
break;
|
||||
@@ -876,7 +876,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname)
|
||||
/* The ID is a #Collection, not a #LayerCollection */
|
||||
Collection *collection = (Collection *)tselem->id;
|
||||
BKE_main_namemap_remove_name(bmain, &collection->id, oldname);
|
||||
BLI_libblock_ensure_unique_name(bmain, collection->id.name);
|
||||
BLI_libblock_ensure_unique_name(bmain, &collection->id);
|
||||
WM_msg_publish_rna_prop(mbus, &collection->id, &collection->id, ID, name);
|
||||
WM_event_add_notifier(C, NC_ID | NA_RENAME, nullptr);
|
||||
DEG_id_tag_update(tselem->id, ID_RECALC_COPY_ON_WRITE);
|
||||
|
||||
@@ -286,7 +286,7 @@ void rna_ID_name_set(PointerRNA *ptr, const char *value)
|
||||
BKE_main_namemap_remove_name(G_MAIN, id, id->name + 2);
|
||||
BLI_strncpy_utf8(id->name + 2, value, sizeof(id->name) - 2);
|
||||
BLI_assert(BKE_id_is_in_global_main(id));
|
||||
BLI_libblock_ensure_unique_name(G_MAIN, id->name);
|
||||
BLI_libblock_ensure_unique_name(G_MAIN, id);
|
||||
|
||||
if (GS(id->name) == ID_OB) {
|
||||
Object *ob = (Object *)id;
|
||||
|
||||
Reference in New Issue
Block a user