Cleanup: de-duplicate ID renaming utility for versioning

This commit is contained in:
Campbell Barton 2021-08-04 12:43:07 +10:00
parent 71dc134f89
commit 5950b3ab73
4 changed files with 71 additions and 82 deletions

View File

@ -111,40 +111,13 @@
#include "BLO_readfile.h"
#include "readfile.h"
#include "versioning_common.h"
#include "MEM_guardedalloc.h"
/* Make preferences read-only, use versioning_userdef.c. */
#define U (*((const UserDef *)&U))
/**
* Rename if the ID doesn't exist.
*/
static ID *rename_id_for_versioning(Main *bmain,
const short id_type,
const char *name_src,
const char *name_dst)
{
/* We can ignore libraries */
ListBase *lb = which_libbase(bmain, id_type);
ID *id = NULL;
LISTBASE_FOREACH (ID *, idtest, lb) {
if (idtest->lib == NULL) {
if (STREQ(idtest->name + 2, name_src)) {
id = idtest;
}
if (STREQ(idtest->name + 2, name_dst)) {
return NULL;
}
}
}
if (id != NULL) {
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);
}
return id;
}
static bScreen *screen_parent_find(const bScreen *screen)
{
/* Can avoid lookup if screen state isn't maximized/full
@ -1679,32 +1652,32 @@ void do_versions_after_linking_280(Main *bmain, ReportList *UNUSED(reports))
Brush *brush;
Material *ma;
/* Pen Soft brush. */
brush = (Brush *)rename_id_for_versioning(bmain, ID_BR, "Draw Soft", "Pencil Soft");
brush = (Brush *)do_versions_rename_id(bmain, ID_BR, "Draw Soft", "Pencil Soft");
if (brush) {
brush->gpencil_settings->icon_id = GP_BRUSH_ICON_PEN;
}
rename_id_for_versioning(bmain, ID_BR, "Draw Pencil", "Pencil");
rename_id_for_versioning(bmain, ID_BR, "Draw Pen", "Pen");
rename_id_for_versioning(bmain, ID_BR, "Draw Ink", "Ink Pen");
rename_id_for_versioning(bmain, ID_BR, "Draw Noise", "Ink Pen Rough");
rename_id_for_versioning(bmain, ID_BR, "Draw Marker", "Marker Bold");
rename_id_for_versioning(bmain, ID_BR, "Draw Block", "Marker Chisel");
do_versions_rename_id(bmain, ID_BR, "Draw Pencil", "Pencil");
do_versions_rename_id(bmain, ID_BR, "Draw Pen", "Pen");
do_versions_rename_id(bmain, ID_BR, "Draw Ink", "Ink Pen");
do_versions_rename_id(bmain, ID_BR, "Draw Noise", "Ink Pen Rough");
do_versions_rename_id(bmain, ID_BR, "Draw Marker", "Marker Bold");
do_versions_rename_id(bmain, ID_BR, "Draw Block", "Marker Chisel");
ma = BLI_findstring(&bmain->materials, "Black", offsetof(ID, name) + 2);
if (ma && ma->gp_style) {
rename_id_for_versioning(bmain, ID_MA, "Black", "Solid Stroke");
do_versions_rename_id(bmain, ID_MA, "Black", "Solid Stroke");
}
ma = BLI_findstring(&bmain->materials, "Red", offsetof(ID, name) + 2);
if (ma && ma->gp_style) {
rename_id_for_versioning(bmain, ID_MA, "Red", "Squares Stroke");
do_versions_rename_id(bmain, ID_MA, "Red", "Squares Stroke");
}
ma = BLI_findstring(&bmain->materials, "Grey", offsetof(ID, name) + 2);
if (ma && ma->gp_style) {
rename_id_for_versioning(bmain, ID_MA, "Grey", "Solid Fill");
do_versions_rename_id(bmain, ID_MA, "Grey", "Solid Fill");
}
ma = BLI_findstring(&bmain->materials, "Black Dots", offsetof(ID, name) + 2);
if (ma && ma->gp_style) {
rename_id_for_versioning(bmain, ID_MA, "Black Dots", "Dots Stroke");
do_versions_rename_id(bmain, ID_MA, "Black Dots", "Dots Stroke");
}
brush = BLI_findstring(&bmain->brushes, "Pencil", offsetof(ID, name) + 2);

View File

@ -20,9 +20,15 @@
/* allow readfile to use deprecated functionality */
#define DNA_DEPRECATED_ALLOW
#include <cstring>
#include "DNA_screen_types.h"
#include "BLI_listbase.h"
#include "BLI_string.h"
#include "BKE_lib_id.h"
#include "BKE_main.h"
#include "MEM_guardedalloc.h"
@ -48,3 +54,34 @@ ARegion *do_versions_add_region_if_not_found(ListBase *regionbase,
BLI_insertlinkafter(regionbase, link_after_region, new_region);
return new_region;
}
/**
* Rename if the ID doesn't exist.
*
* \return the ID (if found).
*/
ID *do_versions_rename_id(Main *bmain,
const short id_type,
const char *name_src,
const char *name_dst)
{
/* We can ignore libraries */
ListBase *lb = which_libbase(bmain, id_type);
ID *id = nullptr;
LISTBASE_FOREACH (ID *, idtest, lb) {
if (idtest->lib == nullptr) {
if (STREQ(idtest->name + 2, name_src)) {
id = idtest;
}
if (STREQ(idtest->name + 2, name_dst)) {
return nullptr;
}
}
}
if (id != nullptr) {
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);
}
return id;
}

View File

@ -22,6 +22,7 @@
struct ARegion;
struct ListBase;
struct Main;
#ifdef __cplusplus
extern "C" {
@ -32,6 +33,11 @@ struct ARegion *do_versions_add_region_if_not_found(struct ListBase *regionbase,
const char *name,
int link_after_region_type);
ID *do_versions_rename_id(Main *bmain,
const short id_type,
const char *name_src,
const char *name_dst);
#ifdef __cplusplus
}
#endif

View File

@ -65,38 +65,11 @@
#include "BLO_readfile.h"
#include "versioning_common.h"
/* Make preferences read-only, use versioning_userdef.c. */
#define U (*((const UserDef *)&U))
/**
* Rename if the ID doesn't exist.
*/
static ID *rename_id_for_versioning(Main *bmain,
const short id_type,
const char *name_src,
const char *name_dst)
{
/* We can ignore libraries */
ListBase *lb = which_libbase(bmain, id_type);
ID *id = NULL;
LISTBASE_FOREACH (ID *, idtest, lb) {
if (idtest->lib == NULL) {
if (STREQ(idtest->name + 2, name_src)) {
id = idtest;
}
if (STREQ(idtest->name + 2, name_dst)) {
return NULL;
}
}
}
if (id != NULL) {
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);
}
return id;
}
static bool blo_is_builtin_template(const char *app_template)
{
/* For all builtin templates shipped with Blender. */
@ -406,28 +379,28 @@ void BLO_update_defaults_startup_blend(Main *bmain, const char *app_template)
Brush *brush;
/* Pencil brush. */
rename_id_for_versioning(bmain, ID_BR, "Draw Pencil", "Pencil");
do_versions_rename_id(bmain, ID_BR, "Draw Pencil", "Pencil");
/* Pen brush. */
rename_id_for_versioning(bmain, ID_BR, "Draw Pen", "Pen");
do_versions_rename_id(bmain, ID_BR, "Draw Pen", "Pen");
/* Pen Soft brush. */
brush = (Brush *)rename_id_for_versioning(bmain, ID_BR, "Draw Soft", "Pencil Soft");
brush = (Brush *)do_versions_rename_id(bmain, ID_BR, "Draw Soft", "Pencil Soft");
if (brush) {
brush->gpencil_settings->icon_id = GP_BRUSH_ICON_PEN;
}
/* Ink Pen brush. */
rename_id_for_versioning(bmain, ID_BR, "Draw Ink", "Ink Pen");
do_versions_rename_id(bmain, ID_BR, "Draw Ink", "Ink Pen");
/* Ink Pen Rough brush. */
rename_id_for_versioning(bmain, ID_BR, "Draw Noise", "Ink Pen Rough");
do_versions_rename_id(bmain, ID_BR, "Draw Noise", "Ink Pen Rough");
/* Marker Bold brush. */
rename_id_for_versioning(bmain, ID_BR, "Draw Marker", "Marker Bold");
do_versions_rename_id(bmain, ID_BR, "Draw Marker", "Marker Bold");
/* Marker Chisel brush. */
rename_id_for_versioning(bmain, ID_BR, "Draw Block", "Marker Chisel");
do_versions_rename_id(bmain, ID_BR, "Draw Block", "Marker Chisel");
/* Remove useless Fill Area.001 brush. */
brush = BLI_findstring(&bmain->brushes, "Fill Area.001", offsetof(ID, name) + 2);
@ -438,10 +411,10 @@ void BLO_update_defaults_startup_blend(Main *bmain, const char *app_template)
/* Rename and fix materials and enable default object lights on. */
if (app_template && STREQ(app_template, "2D_Animation")) {
Material *ma = NULL;
rename_id_for_versioning(bmain, ID_MA, "Black", "Solid Stroke");
rename_id_for_versioning(bmain, ID_MA, "Red", "Squares Stroke");
rename_id_for_versioning(bmain, ID_MA, "Grey", "Solid Fill");
rename_id_for_versioning(bmain, ID_MA, "Black Dots", "Dots Stroke");
do_versions_rename_id(bmain, ID_MA, "Black", "Solid Stroke");
do_versions_rename_id(bmain, ID_MA, "Red", "Squares Stroke");
do_versions_rename_id(bmain, ID_MA, "Grey", "Solid Fill");
do_versions_rename_id(bmain, ID_MA, "Black Dots", "Dots Stroke");
/* Dots Stroke. */
ma = BLI_findstring(&bmain->materials, "Dots Stroke", offsetof(ID, name) + 2);
@ -553,8 +526,8 @@ void BLO_update_defaults_startup_blend(Main *bmain, const char *app_template)
}
/* Objects */
rename_id_for_versioning(bmain, ID_OB, "Lamp", "Light");
rename_id_for_versioning(bmain, ID_LA, "Lamp", "Light");
do_versions_rename_id(bmain, ID_OB, "Lamp", "Light");
do_versions_rename_id(bmain, ID_LA, "Lamp", "Light");
if (app_template && STREQ(app_template, "2D_Animation")) {
for (Object *object = bmain->objects.first; object; object = object->id.next) {