diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index a16767d9167f..70cef0e345a7 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -1571,6 +1571,8 @@ ProjectManager::ProjectManager() { // Initialize project list. { + project_list->load_project_list(); + Ref dir_access = DirAccess::create(DirAccess::AccessType::ACCESS_FILESYSTEM); String default_project_path = EDITOR_GET("filesystem/directories/default_project_path"); @@ -1581,13 +1583,10 @@ ProjectManager::ProjectManager() { } } - bool scanned_for_projects = false; // Scanning will update the list automatically. - String autoscan_path = EDITOR_GET("filesystem/directories/autoscan_project_path"); if (!autoscan_path.is_empty()) { if (dir_access->dir_exists(autoscan_path)) { project_list->find_projects(autoscan_path); - scanned_for_projects = true; } else { Error error = dir_access->make_dir_recursive(autoscan_path); if (error != OK) { @@ -1595,10 +1594,8 @@ ProjectManager::ProjectManager() { } } } - - if (!scanned_for_projects) { - project_list->update_project_list(); - } + project_list->update_project_list(); + initialized = true; } // Extend menu bar to window title. diff --git a/editor/project_manager.h b/editor/project_manager.h index d472666d1a2e..669b5d8b6c57 100644 --- a/editor/project_manager.h +++ b/editor/project_manager.h @@ -141,6 +141,7 @@ class ProjectManager : public Control { void _update_list_placeholder(); ProjectList *project_list = nullptr; + bool initialized = false; LineEdit *search_box = nullptr; Label *loading_label = nullptr; @@ -239,6 +240,7 @@ class ProjectManager : public Control { // Project list. + bool is_initialized() const { return initialized; } LineEdit *get_search_box(); // Project tag management. diff --git a/editor/project_manager/project_list.cpp b/editor/project_manager/project_list.cpp index aa93d9414bd9..d125754dd72e 100644 --- a/editor/project_manager/project_list.cpp +++ b/editor/project_manager/project_list.cpp @@ -469,23 +469,19 @@ void ProjectList::update_project_list() { // If you have 150 projects, it may read through 150 files on your disk at once + load 150 icons. // FIXME: Does it really have to be a full, hard reload? Runtime updates should be made much cheaper. - // Clear whole list - for (int i = 0; i < _projects.size(); ++i) { - Item &project = _projects.write[i]; - CRASH_COND(project.control == nullptr); - memdelete(project.control); // Why not queue_free()? - } - _projects.clear(); - _last_clicked = ""; - _selected_project_paths.clear(); + if (ProjectManager::get_singleton()->is_initialized()) { + // Clear whole list + for (int i = 0; i < _projects.size(); ++i) { + Item &project = _projects.write[i]; + CRASH_COND(project.control == nullptr); + memdelete(project.control); // Why not queue_free()? + } - List sections; - _config.load(_config_path); - _config.get_sections(§ions); + _projects.clear(); + _last_clicked = ""; + _selected_project_paths.clear(); - for (const String &path : sections) { - bool favorite = _config.get_value(path, "favorite", false); - _projects.push_back(load_project_data(path, favorite)); + load_project_list(); } // Create controls @@ -590,7 +586,21 @@ void ProjectList::find_projects_multiple(const PackedStringArray &p_paths) { } save_config(); - update_project_list(); + + if (ProjectManager::get_singleton()->is_initialized()) { + update_project_list(); + } +} + +void ProjectList::load_project_list() { + List sections; + _config.load(_config_path); + _config.get_sections(§ions); + + for (const String &path : sections) { + bool favorite = _config.get_value(path, "favorite", false); + _projects.push_back(load_project_data(path, favorite)); + } } void ProjectList::_scan_folder_recursive(const String &p_path, List *r_projects) { diff --git a/editor/project_manager/project_list.h b/editor/project_manager/project_list.h index 86f1f13bd89e..981df0f3a00d 100644 --- a/editor/project_manager/project_list.h +++ b/editor/project_manager/project_list.h @@ -220,6 +220,7 @@ class ProjectList : public ScrollContainer { // Project list updates. + void load_project_list(); void update_project_list(); void sort_projects(); int get_project_count() const;