Project Manager: Fix hacky code for project rename
Instantiating a new ProjectSettings is *not* the way to go.
ConfigFile works just fine to read/change a single value.
Fixes memory leaks as the instantiated ProjectSettings was never freed.
Forbid doing this to prevent such problems.
Fixes #25661.
(cherry picked from commit f21f75eb6f
)
This commit is contained in:
parent
4aa84f1083
commit
4ee12fa80b
|
@ -1049,6 +1049,7 @@ ProjectSettings::ProjectSettings() {
|
||||||
// Initialization of engine variables should be done in the setup() method,
|
// Initialization of engine variables should be done in the setup() method,
|
||||||
// so that the values can be overridden from project.godot or project.binary.
|
// so that the values can be overridden from project.godot or project.binary.
|
||||||
|
|
||||||
|
CRASH_COND_MSG(singleton != nullptr, "Instantiating a new ProjectSettings singleton is not supported.");
|
||||||
singleton = this;
|
singleton = this;
|
||||||
last_order = NO_BUILTIN_ORDER_BASE;
|
last_order = NO_BUILTIN_ORDER_BASE;
|
||||||
last_builtin_order = 0;
|
last_builtin_order = 0;
|
||||||
|
|
|
@ -430,17 +430,17 @@ private:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProjectSettings *current = memnew(ProjectSettings);
|
// Load project.godot as ConfigFile to set the new name.
|
||||||
|
ConfigFile cfg;
|
||||||
int err = current->setup(dir2, "");
|
String project_godot = dir2.plus_file("project.godot");
|
||||||
|
Error err = cfg.load(project_godot);
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
set_message(vformat(TTR("Couldn't load project.godot in project path (error %d). It may be missing or corrupted."), err), MESSAGE_ERROR);
|
set_message(vformat(TTR("Couldn't load project at '%s' (error %d). It may be missing or corrupted."), project_godot, err), MESSAGE_ERROR);
|
||||||
} else {
|
} else {
|
||||||
ProjectSettings::CustomMap edited_settings;
|
cfg.set_value("application", "config/name", project_name->get_text().strip_edges());
|
||||||
edited_settings["application/config/name"] = project_name->get_text().strip_edges();
|
err = cfg.save(project_godot);
|
||||||
|
if (err != OK) {
|
||||||
if (current->save_custom(dir2.plus_file("project.godot"), edited_settings, Vector<String>(), true) != OK) {
|
set_message(vformat(TTR("Couldn't save project at '%s' (error %d)."), project_godot, err), MESSAGE_ERROR);
|
||||||
set_message(TTR("Couldn't edit project.godot in project path."), MESSAGE_ERROR);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -688,18 +688,19 @@ public:
|
||||||
rasterizer_container->hide();
|
rasterizer_container->hide();
|
||||||
get_ok()->set_disabled(false);
|
get_ok()->set_disabled(false);
|
||||||
|
|
||||||
ProjectSettings *current = memnew(ProjectSettings);
|
// Fetch current name from project.godot to prefill the text input.
|
||||||
|
ConfigFile cfg;
|
||||||
int err = current->setup(project_path->get_text(), "");
|
String project_godot = project_path->get_text().plus_file("project.godot");
|
||||||
|
Error err = cfg.load(project_godot);
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
set_message(vformat(TTR("Couldn't load project.godot in project path (error %d). It may be missing or corrupted."), err), MESSAGE_ERROR);
|
set_message(vformat(TTR("Couldn't load project at '%s' (error %d). It may be missing or corrupted."), project_godot, err), MESSAGE_ERROR);
|
||||||
status_rect->show();
|
status_rect->show();
|
||||||
msg->show();
|
msg->show();
|
||||||
get_ok()->set_disabled(true);
|
get_ok()->set_disabled(true);
|
||||||
} else if (current->has_setting("application/config/name")) {
|
} else {
|
||||||
String proj = current->get("application/config/name");
|
String cur_name = cfg.get_value("application", "config/name", "");
|
||||||
project_name->set_text(proj);
|
project_name->set_text(cur_name);
|
||||||
_text_changed(proj);
|
_text_changed(cur_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
project_name->call_deferred("grab_focus");
|
project_name->call_deferred("grab_focus");
|
||||||
|
|
Loading…
Reference in New Issue