2
0
Эх сурвалжийг харах

Fix folder scan replacing project list

kobewi 1 жил өмнө
parent
commit
a00527e415

+ 4 - 7
editor/project_manager.cpp

@@ -1571,6 +1571,8 @@ ProjectManager::ProjectManager() {
 
 	// Initialize project list.
 	{
+		project_list->load_project_list();
+
 		Ref<DirAccess> 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.

+ 2 - 0
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 @@ public:
 
 	// Project list.
 
+	bool is_initialized() const { return initialized; }
 	LineEdit *get_search_box();
 
 	// Project tag management.

+ 26 - 16
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<String> sections;
-	_config.load(_config_path);
-	_config.get_sections(&sections);
+		_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<String> sections;
+	_config.load(_config_path);
+	_config.get_sections(&sections);
+
+	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<String> *r_projects) {

+ 1 - 0
editor/project_manager/project_list.h

@@ -220,6 +220,7 @@ public:
 
 	// Project list updates.
 
+	void load_project_list();
 	void update_project_list();
 	void sort_projects();
 	int get_project_count() const;