From 2cfab94fef35245e4ab7ab6f68122b12506701a2 Mon Sep 17 00:00:00 2001 From: kobewi Date: Sun, 15 Jan 2023 00:20:50 +0100 Subject: [PATCH] Improve performance of imported file scan --- editor/filesystem_dock.cpp | 28 ++++++++++++++++++++++------ editor/filesystem_dock.h | 2 +- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index 17cdab60c8f..046e0bd940b 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -2890,12 +2890,19 @@ void FileSystemDock::_file_list_gui_input(Ref p_event) { } } -void FileSystemDock::_get_imported_files(const String &p_path, Vector &r_files) const { +bool FileSystemDock::_get_imported_files(const String &p_path, String &r_extension, Vector &r_files) const { if (!p_path.ends_with("/")) { if (FileAccess::exists(p_path + ".import")) { + if (r_extension.is_empty()) { + r_extension = p_path.get_extension(); + } else if (r_extension != p_path.get_extension()) { + r_files.clear(); + return false; // File type mismatch, stop search. + } + r_files.push_back(p_path); } - return; + return true; } Ref da = DirAccess::open(p_path); @@ -2904,11 +2911,14 @@ void FileSystemDock::_get_imported_files(const String &p_path, Vector &r while (!n.is_empty()) { if (n != "." && n != ".." && !n.ends_with(".import")) { String npath = p_path + n + (da->current_is_dir() ? "/" : ""); - _get_imported_files(npath, r_files); + if (!_get_imported_files(npath, r_extension, r_files)) { + return false; + } } n = da->get_next(); } da->list_dir_end(); + return true; } void FileSystemDock::_update_import_dock() { @@ -2933,10 +2943,16 @@ void FileSystemDock::_update_import_dock() { } } - // Expand directory selection + if (!selected.is_empty() && selected[0] == "res://") { + // Scanning res:// is costly and unlikely to yield any useful results. + return; + } + + // Expand directory selection. Vector efiles; - for (int i = 0; i < selected.size(); i++) { - _get_imported_files(selected[i], efiles); + String extension; + for (const String &fpath : selected) { + _get_imported_files(fpath, extension, efiles); } // Check import. diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h index 2304d8f8ad2..2d8541d3cb1 100644 --- a/editor/filesystem_dock.h +++ b/editor/filesystem_dock.h @@ -213,7 +213,7 @@ private: void _file_multi_selected(int p_index, bool p_selected); void _tree_multi_selected(Object *p_item, int p_column, bool p_selected); - void _get_imported_files(const String &p_path, Vector &r_files) const; + bool _get_imported_files(const String &p_path, String &r_extension, Vector &r_files) const; void _update_import_dock(); void _get_all_items_in_dir(EditorFileSystemDirectory *p_efsd, Vector &r_files, Vector &r_folders) const;