Fix #115192: Inconsistent behavior renaming data-blocks #116246

Merged
Pratik Borhade merged 2 commits from PratikPB2123/blender:115192-id-naming into main 2024-01-15 12:45:57 +01:00
6 changed files with 11 additions and 14 deletions

View File

@ -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,

View File

@ -1632,6 +1632,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);
@ -2004,21 +2005,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;
}
}

View File

@ -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;
}

View File

@ -528,7 +528,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);
}
}

View File

@ -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);

View File

@ -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;