Fix #115192: Inconsistent behavior renaming data-blocks #116246
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue