Merge pull request #25713 from qarmin/remove_all_missing_projects
Add button in Project Manager to remove all missing projects
This commit is contained in:
commit
1b08ba1a48
2 changed files with 74 additions and 0 deletions
|
@ -987,6 +987,24 @@ void ProjectManager::_update_project_buttons() {
|
|||
open_btn->set_disabled(empty_selection);
|
||||
rename_btn->set_disabled(empty_selection);
|
||||
run_btn->set_disabled(empty_selection);
|
||||
|
||||
bool missing_projects = false;
|
||||
Map<String, String> list_all_projects;
|
||||
for (int i = 0; i < scroll_children->get_child_count(); i++) {
|
||||
HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i));
|
||||
if (hb) {
|
||||
list_all_projects.insert(hb->get_meta("name"), hb->get_meta("main_scene"));
|
||||
}
|
||||
}
|
||||
for (Map<String, String>::Element *E = list_all_projects.front(); E; E = E->next()) {
|
||||
String project_name = E->key().replace("::", "/") + "/project.godot";
|
||||
if (!FileAccess::exists(project_name)) {
|
||||
missing_projects = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
erase_missing_btn->set_visible(missing_projects);
|
||||
}
|
||||
|
||||
void ProjectManager::_panel_input(const Ref<InputEvent> &p_ev, Node *p_hb) {
|
||||
|
@ -1700,6 +1718,39 @@ void ProjectManager::_erase_project_confirm() {
|
|||
_load_recent_projects();
|
||||
}
|
||||
|
||||
void ProjectManager::_erase_missing_projects_confirm() {
|
||||
|
||||
Map<String, String> list_all_projects;
|
||||
for (int i = 0; i < scroll_children->get_child_count(); i++) {
|
||||
HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i));
|
||||
if (hb) {
|
||||
list_all_projects.insert(hb->get_meta("name"), hb->get_meta("main_scene"));
|
||||
}
|
||||
}
|
||||
|
||||
if (list_all_projects.size() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
int deleted_projects = 0;
|
||||
int remaining_projects = 0;
|
||||
for (Map<String, String>::Element *E = list_all_projects.front(); E; E = E->next()) {
|
||||
String project_name = E->key().replace("::", "/") + "/project.godot";
|
||||
if (!FileAccess::exists(project_name)) {
|
||||
deleted_projects++;
|
||||
EditorSettings::get_singleton()->erase("projects/" + E->key());
|
||||
EditorSettings::get_singleton()->erase("favorite_projects/" + E->key());
|
||||
} else {
|
||||
remaining_projects++;
|
||||
}
|
||||
}
|
||||
print_line("Deleted " + itos(deleted_projects) + " projects, remaining " + itos(remaining_projects) + " projects");
|
||||
EditorSettings::get_singleton()->save();
|
||||
selected_list.clear();
|
||||
last_clicked = "";
|
||||
_load_recent_projects();
|
||||
}
|
||||
|
||||
void ProjectManager::_erase_project() {
|
||||
|
||||
if (selected_list.size() == 0)
|
||||
|
@ -1716,6 +1767,12 @@ void ProjectManager::_erase_project() {
|
|||
erase_ask->popup_centered_minsize();
|
||||
}
|
||||
|
||||
void ProjectManager::_erase_missing_projects() {
|
||||
|
||||
erase_missing_ask->set_text(TTR("Remove all missing projects from the list? (Folders contents will not be modified)"));
|
||||
erase_missing_ask->popup_centered_minsize();
|
||||
}
|
||||
|
||||
void ProjectManager::_language_selected(int p_id) {
|
||||
|
||||
String lang = language_btn->get_item_metadata(p_id);
|
||||
|
@ -1812,7 +1869,9 @@ void ProjectManager::_bind_methods() {
|
|||
ClassDB::bind_method("_new_project", &ProjectManager::_new_project);
|
||||
ClassDB::bind_method("_rename_project", &ProjectManager::_rename_project);
|
||||
ClassDB::bind_method("_erase_project", &ProjectManager::_erase_project);
|
||||
ClassDB::bind_method("_erase_missing_projects", &ProjectManager::_erase_missing_projects);
|
||||
ClassDB::bind_method("_erase_project_confirm", &ProjectManager::_erase_project_confirm);
|
||||
ClassDB::bind_method("_erase_missing_projects_confirm", &ProjectManager::_erase_missing_projects_confirm);
|
||||
ClassDB::bind_method("_language_selected", &ProjectManager::_language_selected);
|
||||
ClassDB::bind_method("_restart_confirm", &ProjectManager::_restart_confirm);
|
||||
ClassDB::bind_method("_exit_dialog", &ProjectManager::_exit_dialog);
|
||||
|
@ -2050,6 +2109,12 @@ ProjectManager::ProjectManager() {
|
|||
erase->connect("pressed", this, "_erase_project");
|
||||
erase_btn = erase;
|
||||
|
||||
Button *erase_missing = memnew(Button);
|
||||
erase_missing->set_text(TTR("Remove Missing"));
|
||||
tree_vb->add_child(erase_missing);
|
||||
erase_missing->connect("pressed", this, "_erase_missing_projects");
|
||||
erase_missing_btn = erase_missing;
|
||||
|
||||
tree_vb->add_spacer();
|
||||
|
||||
if (StreamPeerSSL::is_available()) {
|
||||
|
@ -2113,6 +2178,11 @@ ProjectManager::ProjectManager() {
|
|||
language_restart_ask->get_cancel()->set_text(TTR("Continue"));
|
||||
gui_base->add_child(language_restart_ask);
|
||||
|
||||
erase_missing_ask = memnew(ConfirmationDialog);
|
||||
erase_missing_ask->get_ok()->set_text(TTR("Remove All"));
|
||||
erase_missing_ask->get_ok()->connect("pressed", this, "_erase_missing_projects_confirm");
|
||||
gui_base->add_child(erase_missing_ask);
|
||||
|
||||
erase_ask = memnew(ConfirmationDialog);
|
||||
erase_ask->get_ok()->set_text(TTR("Remove"));
|
||||
erase_ask->get_ok()->connect("pressed", this, "_erase_project_confirm");
|
||||
|
|
|
@ -45,6 +45,7 @@ class ProjectManager : public Control {
|
|||
GDCLASS(ProjectManager, Control);
|
||||
|
||||
Button *erase_btn;
|
||||
Button *erase_missing_btn;
|
||||
Button *open_btn;
|
||||
Button *rename_btn;
|
||||
Button *run_btn;
|
||||
|
@ -57,6 +58,7 @@ class ProjectManager : public Control {
|
|||
FileDialog *scan_dir;
|
||||
ConfirmationDialog *language_restart_ask;
|
||||
ConfirmationDialog *erase_ask;
|
||||
ConfirmationDialog *erase_missing_ask;
|
||||
ConfirmationDialog *multi_open_ask;
|
||||
ConfirmationDialog *multi_run_ask;
|
||||
ConfirmationDialog *multi_scan_ask;
|
||||
|
@ -89,7 +91,9 @@ class ProjectManager : public Control {
|
|||
void _new_project();
|
||||
void _rename_project();
|
||||
void _erase_project();
|
||||
void _erase_missing_projects();
|
||||
void _erase_project_confirm();
|
||||
void _erase_missing_projects_confirm();
|
||||
void _update_project_buttons();
|
||||
void _language_selected(int p_id);
|
||||
void _restart_confirm();
|
||||
|
|
Loading…
Reference in a new issue