summaryrefslogtreecommitdiffstats
path: root/editor
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-06-11 11:46:35 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-06-11 11:46:35 +0200
commite4fa8543ea11b7d25c24c81c4a0b824b60fb82ec (patch)
tree1cb028256f8c3dbb92ea9ea4c7af73d1c363d451 /editor
parent62a056aa56ca4471c035e43741c88e4a22d81802 (diff)
downloadredot-engine-e4fa8543ea11b7d25c24c81c4a0b824b60fb82ec.tar.gz
Revert "Fix FileSystem dock won't show any file folders"
This reverts commit 72856d633a6be5c596d4a3231acab009828a2efe. Fixes #93022.
Diffstat (limited to 'editor')
-rw-r--r--editor/editor_file_system.cpp417
-rw-r--r--editor/editor_file_system.h26
-rw-r--r--editor/editor_node.cpp10
-rw-r--r--editor/filesystem_dock.cpp19
-rw-r--r--editor/filesystem_dock.h2
5 files changed, 182 insertions, 292 deletions
diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp
index 035e2dcd65..37e00bf042 100644
--- a/editor/editor_file_system.cpp
+++ b/editor/editor_file_system.cpp
@@ -316,6 +316,8 @@ void EditorFileSystem::_scan_filesystem() {
EditorProgressBG scan_progress("efs", "ScanFS", 1000);
ScanProgress sp;
+ sp.low = 0;
+ sp.hi = 1;
sp.progress = &scan_progress;
new_filesystem = memnew(EditorFileSystemDirectory);
@@ -323,8 +325,7 @@ void EditorFileSystem::_scan_filesystem() {
Ref<DirAccess> d = DirAccess::create(DirAccess::ACCESS_RESOURCES);
d->change_dir("res://");
-
- _scan_new_dir(new_filesystem, d, &sp, 1);
+ _scan_new_dir(new_filesystem, d, sp);
dep_update_list.clear();
file_cache.clear(); //clear caches, no longer needed
@@ -559,27 +560,15 @@ bool EditorFileSystem::_scan_import_support(const Vector<String> &reimports) {
return false;
}
-bool EditorFileSystem::_update_scan_actions(bool p_show_progress) {
+bool EditorFileSystem::_update_scan_actions() {
sources_changed.clear();
bool fs_changed = false;
Vector<String> reimports;
Vector<String> reloads;
- HashMap<String, String> import_group_files;
-
- EditorProgress *editor_progress = nullptr;
- if (p_show_progress && scan_actions.size() > 0) {
- editor_progress = memnew(EditorProgress("_update_scan_actions", TTR("Scanning actions..."), scan_actions.size()));
- editor_progress->step("", 0, true);
- }
- int idx_action = 0;
for (const ItemAction &ia : scan_actions) {
- if (editor_progress) {
- editor_progress->step(ia.file, idx_action, false);
- }
- idx_action++;
switch (ia.action) {
case ItemAction::ACTION_NONE: {
} break;
@@ -654,17 +643,10 @@ bool EditorFileSystem::_update_scan_actions(bool p_show_progress) {
if (_test_for_reimport(full_path, false)) {
//must reimport
reimports.push_back(full_path);
- if (!ia.import_group_file.is_empty()) {
- import_group_files[full_path] = ia.import_group_file;
- }
Vector<String> dependencies = _get_dependencies(full_path);
for (const String &dependency_path : dependencies) {
if (import_extensions.has(dependency_path.get_extension())) {
reimports.push_back(dependency_path);
- String import_groupe_file = ResourceFormatImporter::get_singleton()->get_import_group_file(dependency_path);
- if (!ia.import_group_file.is_empty()) {
- import_group_files[dependency_path] = import_groupe_file;
- }
}
}
} else {
@@ -694,8 +676,6 @@ bool EditorFileSystem::_update_scan_actions(bool p_show_progress) {
}
}
- memdelete_notnull(editor_progress);
-
if (_scan_extensions()) {
//needs editor restart
//extensions also may provide filetypes to be imported, so they must run before importing
@@ -714,7 +694,7 @@ bool EditorFileSystem::_update_scan_actions(bool p_show_progress) {
return true;
}
- _reimport_files_internal(reimports, &import_group_files);
+ reimport_files(reimports);
} else {
//reimport files will update the uid cache file so if nothing was reimported, update it manually
ResourceUID::get_singleton()->update_cache();
@@ -745,10 +725,10 @@ void EditorFileSystem::scan() {
}
_update_extensions();
+
if (!use_threads) {
scanning = true;
scan_total = 0;
- emit_signal(SNAME("scan_started"), true);
_scan_filesystem();
if (filesystem) {
memdelete(filesystem);
@@ -756,7 +736,7 @@ void EditorFileSystem::scan() {
//file_type_cache.clear();
filesystem = new_filesystem;
new_filesystem = nullptr;
- _update_scan_actions(true);
+ _update_scan_actions();
scanning = false;
_update_pending_script_classes();
_update_pending_scene_groups();
@@ -769,50 +749,28 @@ void EditorFileSystem::scan() {
Thread::Settings s;
scanning = true;
scan_total = 0;
- emit_signal(SNAME("scan_started"), true);
s.priority = Thread::PRIORITY_LOW;
thread.start(_thread_func, this, s);
+ //tree->hide();
+ //progress->show();
}
}
-void EditorFileSystem::ScanProgress::increment() {
- real++;
- nb_file_to_scan--;
- current = CLAMP(real / estimated, current, 1);
- progress->step(current * 1000);
- EditorFileSystem::singleton->scan_total = current;
+void EditorFileSystem::ScanProgress::update(int p_current, int p_total) const {
+ float ratio = low + ((hi - low) / p_total) * p_current;
+ progress->step(ratio * 1000);
+ EditorFileSystem::singleton->scan_total = ratio;
}
-void EditorFileSystem::ScanProgress::update_estimated(int p_depth, int p_nb_sub_dirs, int p_nb_files) {
- // The algorithm calculates an estimated value for the progress of scanning directories and files.
- // It adjusts the estimate based on the number of directories and files discovered so far,
- // and ensures the estimated value does not decrease drastically between updates.
- float average = 10;
- directories_processed++;
- if (nb_dir_to_scan > 0) {
- nb_dir_to_scan--;
- }
- nb_dir_to_scan += p_nb_sub_dirs;
- nb_file_to_scan += p_nb_files;
-
- if (directories_processed > 2) {
- average = (real + nb_file_to_scan) / directories_processed;
- if (average < 10) {
- average = 10;
- }
- }
-
- float old_estimated = estimated;
- estimated = real + nb_file_to_scan + (nb_dir_to_scan * average * p_depth);
- if (estimated < old_estimated * 0.95) {
- estimated = old_estimated * 0.95;
- }
- if (estimated <= real + average) {
- estimated = real + average;
- }
+EditorFileSystem::ScanProgress EditorFileSystem::ScanProgress::get_sub(int p_current, int p_total) const {
+ ScanProgress sp = *this;
+ float slice = (sp.hi - sp.low) / p_total;
+ sp.low += slice * p_current;
+ sp.hi = slice;
+ return sp;
}
-void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, Ref<DirAccess> &da, ScanProgress *p_progress, int p_depth) {
+void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, Ref<DirAccess> &da, const ScanProgress &p_progress) {
List<String> dirs;
List<String> files;
@@ -852,12 +810,11 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, Ref<DirAc
dirs.sort_custom<FileNoCaseComparator>();
files.sort_custom<FileNoCaseComparator>();
- p_progress->update_estimated(p_depth, dirs.size(), files.size());
-
+ int total = dirs.size() + files.size();
int idx = 0;
+
for (List<String>::Element *E = dirs.front(); E; E = E->next(), idx++) {
- String name = E->get();
- if (da->change_dir(name) == OK) {
+ if (da->change_dir(E->get()) == OK) {
String d = da->get_current_dir();
if (d == cd || !d.begins_with(cd)) {
@@ -868,27 +825,38 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, Ref<DirAc
efd->parent = p_dir;
efd->name = E->get();
- _scan_new_dir(efd, da, p_progress, p_depth + 1);
+ _scan_new_dir(efd, da, p_progress.get_sub(idx, total));
- // Folders are already sorted with FileNoCaseComparator.
- p_dir->subdirs.push_back(efd);
+ int idx2 = 0;
+ for (int i = 0; i < p_dir->subdirs.size(); i++) {
+ if (efd->name.filenocasecmp_to(p_dir->subdirs[i]->name) < 0) {
+ break;
+ }
+ idx2++;
+ }
+ if (idx2 == p_dir->subdirs.size()) {
+ p_dir->subdirs.push_back(efd);
+ } else {
+ p_dir->subdirs.insert(idx2, efd);
+ }
da->change_dir("..");
}
} else {
ERR_PRINT("Cannot go into subdir '" + E->get() + "'.");
}
+
+ p_progress.update(idx, total);
}
for (List<String>::Element *E = files.front(); E; E = E->next(), idx++) {
- String name = E->get();
- String ext = name.get_extension().to_lower();
+ String ext = E->get().get_extension().to_lower();
if (!valid_extensions.has(ext)) {
continue; //invalid
}
EditorFileSystemDirectory::FileInfo *fi = memnew(EditorFileSystemDirectory::FileInfo);
- fi->file = name;
+ fi->file = E->get();
String path = cd.path_join(fi->file);
@@ -916,31 +884,31 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, Ref<DirAc
fi->script_class_extends = fc->script_class_extends;
fi->script_class_icon_path = fc->script_class_icon_path;
- if (fc->type.is_empty()) {
- fi->type = ResourceLoader::get_resource_type(path);
- fi->resource_script_class = ResourceLoader::get_resource_script_class(path);
- fi->import_group_file = ResourceLoader::get_import_group_file(path);
- //there is also the chance that file type changed due to reimport, must probably check this somehow here (or kind of note it for next time in another file?)
- //note: I think this should not happen any longer..
- }
-
if (revalidate_import_files && !ResourceFormatImporter::get_singleton()->are_import_settings_valid(path)) {
ItemAction ia;
ia.action = ItemAction::ACTION_FILE_TEST_REIMPORT;
ia.dir = p_dir;
ia.file = E->get();
- ia.import_group_file = fi->import_group_file;
scan_actions.push_back(ia);
}
+ if (fc->type.is_empty()) {
+ fi->type = ResourceLoader::get_resource_type(path);
+ fi->resource_script_class = ResourceLoader::get_resource_script_class(path);
+ fi->import_group_file = ResourceLoader::get_import_group_file(path);
+ //there is also the chance that file type changed due to reimport, must probably check this somehow here (or kind of note it for next time in another file?)
+ //note: I think this should not happen any longer..
+ }
+
if (fc->uid == ResourceUID::INVALID_ID) {
// imported files should always have a UID, so attempt to fetch it.
fi->uid = ResourceLoader::get_resource_uid(path);
}
} else {
- // Using get_resource_import_info() to prevent calling 3 times ResourceFormatImporter::_get_path_and_type.
- ResourceFormatImporter::get_singleton()->get_resource_import_info(path, fi->type, fi->uid, fi->import_group_file);
+ fi->type = ResourceFormatImporter::get_singleton()->get_resource_type(path);
+ fi->uid = ResourceFormatImporter::get_singleton()->get_resource_uid(path);
+ fi->import_group_file = ResourceFormatImporter::get_singleton()->get_import_group_file(path);
fi->script_class_name = _get_global_script_class(fi->type, path, &fi->script_class_extends, &fi->script_class_icon_path);
fi->modified_time = 0;
fi->import_modified_time = 0;
@@ -950,7 +918,6 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, Ref<DirAc
ia.action = ItemAction::ACTION_FILE_TEST_REIMPORT;
ia.dir = p_dir;
ia.file = E->get();
- ia.import_group_file = fi->import_group_file;
scan_actions.push_back(ia);
}
} else {
@@ -1001,11 +968,11 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, Ref<DirAc
}
p_dir->files.push_back(fi);
- p_progress->increment();
+ p_progress.update(idx, total);
}
}
-void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, ScanProgress *p_progress) {
+void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const ScanProgress &p_progress) {
uint64_t current_mtime = FileAccess::get_modified_time(p_dir->get_path());
bool updated_dir = false;
@@ -1061,7 +1028,7 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, ScanPr
efd->name = f;
Ref<DirAccess> d = DirAccess::create(DirAccess::ACCESS_RESOURCES);
d->change_dir(cd.path_join(f));
- _scan_new_dir(efd, d, p_progress, 1);
+ _scan_new_dir(efd, d, p_progress.get_sub(1, 1));
ItemAction ia;
ia.action = ItemAction::ACTION_DIR_ADD;
@@ -1113,7 +1080,6 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, ScanPr
ia.action = ItemAction::ACTION_FILE_TEST_REIMPORT;
ia.dir = p_dir;
ia.file = f;
- ia.import_group_file = fi->import_group_file;
scan_actions.push_back(ia);
}
@@ -1164,7 +1130,6 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, ScanPr
ia.action = ItemAction::ACTION_FILE_TEST_REIMPORT;
ia.dir = p_dir;
ia.file = p_dir->files[i]->file;
- ia.import_group_file = p_dir->files[i]->import_group_file;
scan_actions.push_back(ia);
}
} else if (ResourceCache::has(path)) { //test for potential reload
@@ -1214,7 +1179,9 @@ void EditorFileSystem::_thread_func_sources(void *_userdata) {
EditorProgressBG pr("sources", TTR("ScanSources"), 1000);
ScanProgress sp;
sp.progress = &pr;
- efs->_scan_fs_changes(efs->filesystem, &sp);
+ sp.hi = 1;
+ sp.low = 0;
+ efs->_scan_fs_changes(efs->filesystem, sp);
}
efs->scanning_changes_done.set();
}
@@ -1237,9 +1204,10 @@ void EditorFileSystem::scan_changes() {
EditorProgressBG pr("sources", TTR("ScanSources"), 1000);
ScanProgress sp;
sp.progress = &pr;
+ sp.hi = 1;
+ sp.low = 0;
scan_total = 0;
- emit_signal(SNAME("scan_started"), false);
- _scan_fs_changes(filesystem, &sp);
+ _scan_fs_changes(filesystem, sp);
bool changed = _update_scan_actions();
_update_pending_script_classes();
_update_pending_scene_groups();
@@ -1254,7 +1222,6 @@ void EditorFileSystem::scan_changes() {
ERR_FAIL_COND(thread_sources.is_started());
set_process(true);
scan_total = 0;
- emit_signal(SNAME("scan_started"), false);
Thread::Settings s;
s.priority = Thread::PRIORITY_LOW;
thread_sources.start(_thread_func_sources, this, s);
@@ -1308,7 +1275,6 @@ void EditorFileSystem::_notification(int p_what) {
if (thread_sources.is_started()) {
thread_sources.wait_to_finish();
}
- emit_signal(SNAME("scan_stopped"), false);
bool changed = _update_scan_actions();
_update_pending_script_classes();
_update_pending_scene_groups();
@@ -1329,8 +1295,7 @@ void EditorFileSystem::_notification(int p_what) {
filesystem = new_filesystem;
new_filesystem = nullptr;
thread.wait_to_finish();
- emit_signal(SNAME("scan_stopped"), true);
- _update_scan_actions(true);
+ _update_scan_actions();
_update_pending_script_classes();
_update_pending_scene_groups();
emit_signal(SNAME("filesystem_changed"));
@@ -1613,20 +1578,10 @@ String EditorFileSystem::_get_global_script_class(const String &p_type, const St
return String();
}
-void EditorFileSystem::_update_script_classes(bool p_show_progress) {
+void EditorFileSystem::_update_script_classes() {
update_script_mutex.lock();
- EditorProgress *ep = nullptr;
- if (p_show_progress && update_script_paths.size() > 0) {
- ep = memnew(EditorProgress("update_scripts_classes", TTR("(Re)importing Scripts"), update_script_paths.size() * 2));
- ep->step("", 0, true);
- }
-
- int step_count = 0;
for (const String &path : update_script_paths) {
- if (ep) {
- ep->step(TTR("Registering global classes..."), step_count++, false);
- }
EditorFileSystem::get_singleton()->register_global_class_script(path, path);
}
@@ -1635,10 +1590,6 @@ void EditorFileSystem::_update_script_classes(bool p_show_progress) {
int index = -1;
EditorFileSystemDirectory *efd = find_file(path, &index);
- if (ep) {
- ep->step(TTR("Updating documentation..."), step_count++, false);
- }
-
if (!efd || index < 0) {
// The file was removed
continue;
@@ -1659,8 +1610,6 @@ void EditorFileSystem::_update_script_classes(bool p_show_progress) {
}
}
- memdelete_notnull(ep);
-
update_script_paths.clear();
update_script_mutex.unlock();
@@ -1677,9 +1626,9 @@ void EditorFileSystem::_update_script_classes(bool p_show_progress) {
ResourceSaver::add_custom_savers();
}
-void EditorFileSystem::_update_pending_script_classes(bool p_show_progress) {
+void EditorFileSystem::_update_pending_script_classes() {
if (!update_script_paths.is_empty()) {
- _update_script_classes(p_show_progress);
+ _update_script_classes();
} else {
// In case the class cache file was removed somehow, regenerate it.
if (!FileAccess::exists(ScriptServer::get_global_class_cache_file_path())) {
@@ -1719,7 +1668,7 @@ void EditorFileSystem::_update_scene_groups() {
}
if (ep) {
- ep->step(TTR("Updating Scene Groups..."), step_count++, false);
+ ep->step(TTR("Updating Scene Groups..."), step_count++);
}
}
@@ -1800,13 +1749,9 @@ void EditorFileSystem::update_files(const Vector<String> &p_script_paths) {
fs->files.remove_at(cpos);
}
- // Preventing update of scripts and scene groups while first scan.
- // Some ResourceLoader resave files which invoke update_file while loading (ex: ResourceImporterCSVTranslation).
- if (!first_scan) {
- _update_pending_script_classes();
- _update_pending_scene_groups();
- call_deferred(SNAME("emit_signal"), "filesystem_changed"); // Update later.
- }
+ _update_pending_script_classes();
+ _update_pending_scene_groups();
+ call_deferred(SNAME("emit_signal"), "filesystem_changed"); //update later
return;
}
@@ -1877,13 +1822,9 @@ void EditorFileSystem::update_files(const Vector<String> &p_script_paths) {
}
}
- // Preventing update of scripts and scene groups while first scan.
- // Some ResourceLoader resave files which invoke update_file while loading (ex: ResourceImporterCSVTranslation).
- if (!first_scan) {
- _update_pending_script_classes();
- _update_pending_scene_groups();
- call_deferred(SNAME("emit_signal"), "filesystem_changed"); // Update later.
- }
+ _update_pending_script_classes();
+ _update_pending_scene_groups();
+ call_deferred(SNAME("emit_signal"), "filesystem_changed"); //update later
}
HashSet<String> EditorFileSystem::get_valid_extensions() const {
@@ -2404,152 +2345,132 @@ void EditorFileSystem::_reimport_thread(uint32_t p_index, ImportThreadData *p_im
}
void EditorFileSystem::reimport_files(const Vector<String> &p_files) {
- _reimport_files_internal(p_files, nullptr);
-}
-
-void EditorFileSystem::_reimport_files_internal(const Vector<String> &p_files, const HashMap<String, String> *p_import_group_files) {
ERR_FAIL_COND_MSG(importing, "Attempted to call reimport_files() recursively, this is not allowed.");
importing = true;
Vector<String> reloads;
- {
- EditorProgress pr("reimport", TTR("(Re)Importing Assets"), p_files.size());
- pr.step("", 0, true);
-
- Vector<ImportFile> reimport_files;
- HashMap<String, String> import_group_files = *p_import_group_files;
-
- HashSet<String> groups_to_reimport;
-
- for (int i = 0; i < p_files.size(); i++) {
- String file = p_files[i];
+ EditorProgress pr("reimport", TTR("(Re)Importing Assets"), p_files.size());
- ResourceUID::ID uid = ResourceUID::get_singleton()->text_to_id(file);
- if (uid != ResourceUID::INVALID_ID && ResourceUID::get_singleton()->has_id(uid)) {
- file = ResourceUID::get_singleton()->get_id_path(uid);
- }
-
- String group_file;
- if (p_import_group_files) {
- if (p_import_group_files->has(file)) {
- group_file = (*p_import_group_files)[file];
- }
- } else {
- group_file = ResourceFormatImporter::get_singleton()->get_import_group_file(file);
- }
+ Vector<ImportFile> reimport_files;
- if (group_file_cache.has(file)) {
- // Maybe the file itself is a group!
- groups_to_reimport.insert(file);
- // Groups do not belong to groups.
- group_file = String();
- } else if (groups_to_reimport.has(file)) {
- // Groups do not belong to groups.
- group_file = String();
- } else if (!group_file.is_empty()) {
- // It's a group file, add group to import and skip this file.
- groups_to_reimport.insert(group_file);
- } else {
- // It's a regular file.
- ImportFile ifile;
- ifile.path = file;
- ResourceFormatImporter::get_singleton()->get_import_order_threads_and_importer(file, ifile.order, ifile.threaded, ifile.importer);
- reloads.push_back(file);
- reimport_files.push_back(ifile);
- }
+ HashSet<String> groups_to_reimport;
- // Group may have changed, so also update group reference.
- if (!p_import_group_files) {
- EditorFileSystemDirectory *fs = nullptr;
- int cpos = -1;
- if (_find_file(file, &fs, cpos)) {
- fs->files.write[cpos]->import_group_file = group_file;
- }
- }
+ for (int i = 0; i < p_files.size(); i++) {
+ String file = p_files[i];
+
+ ResourceUID::ID uid = ResourceUID::get_singleton()->text_to_id(file);
+ if (uid != ResourceUID::INVALID_ID && ResourceUID::get_singleton()->has_id(uid)) {
+ file = ResourceUID::get_singleton()->get_id_path(uid);
+ }
+
+ String group_file = ResourceFormatImporter::get_singleton()->get_import_group_file(file);
+
+ if (group_file_cache.has(file)) {
+ // Maybe the file itself is a group!
+ groups_to_reimport.insert(file);
+ // Groups do not belong to groups.
+ group_file = String();
+ } else if (groups_to_reimport.has(file)) {
+ // Groups do not belong to groups.
+ group_file = String();
+ } else if (!group_file.is_empty()) {
+ // It's a group file, add group to import and skip this file.
+ groups_to_reimport.insert(group_file);
+ } else {
+ // It's a regular file.
+ ImportFile ifile;
+ ifile.path = file;
+ ResourceFormatImporter::get_singleton()->get_import_order_threads_and_importer(file, ifile.order, ifile.threaded, ifile.importer);
+ reloads.push_back(file);
+ reimport_files.push_back(ifile);
+ }
- pr.step(TTR("Preparing files to reimport..."), i, false);
+ // Group may have changed, so also update group reference.
+ EditorFileSystemDirectory *fs = nullptr;
+ int cpos = -1;
+ if (_find_file(file, &fs, cpos)) {
+ fs->files.write[cpos]->import_group_file = group_file;
}
+ }
- reimport_files.sort();
+ reimport_files.sort();
#ifdef THREADS_ENABLED
- bool use_multiple_threads = GLOBAL_GET("editor/import/use_multiple_threads");
+ bool use_multiple_threads = GLOBAL_GET("editor/import/use_multiple_threads");
#else
- bool use_multiple_threads = false;
+ bool use_multiple_threads = false;
#endif
- int from = 0;
- for (int i = 0; i < reimport_files.size(); i++) {
- if (groups_to_reimport.has(reimport_files[i].path)) {
- continue;
- }
+ int from = 0;
+ for (int i = 0; i < reimport_files.size(); i++) {
+ if (groups_to_reimport.has(reimport_files[i].path)) {
+ continue;
+ }
- if (use_multiple_threads && reimport_files[i].threaded) {
- if (i + 1 == reimport_files.size() || reimport_files[i + 1].importer != reimport_files[from].importer) {
- if (from - i == 0) {
- // Single file, do not use threads.
- pr.step(reimport_files[i].path.get_file(), i, false);
- _reimport_file(reimport_files[i].path);
- } else {
- Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(reimport_files[from].importer);
- ERR_CONTINUE(importer.is_null());
-
- importer->import_threaded_begin();
-
- ImportThreadData tdata;
- tdata.max_index.set(from);
- tdata.reimport_from = from;
- tdata.reimport_files = reimport_files.ptr();
-
- WorkerThreadPool::GroupID group_task = WorkerThreadPool::get_singleton()->add_template_group_task(this, &EditorFileSystem::_reimport_thread, &tdata, i - from + 1, -1, false, vformat(TTR("Import resources of type: %s"), reimport_files[from].importer));
- int current_index = from - 1;
- do {
- if (current_index < tdata.max_index.get()) {
- current_index = tdata.max_index.get();
- pr.step(reimport_files[current_index].path.get_file(), current_index, false);
- }
- OS::get_singleton()->delay_usec(1);
- } while (!WorkerThreadPool::get_singleton()->is_group_task_completed(group_task));
-
- WorkerThreadPool::get_singleton()->wait_for_group_task_completion(group_task);
-
- importer->import_threaded_end();
- }
+ if (use_multiple_threads && reimport_files[i].threaded) {
+ if (i + 1 == reimport_files.size() || reimport_files[i + 1].importer != reimport_files[from].importer) {
+ if (from - i == 0) {
+ // Single file, do not use threads.
+ pr.step(reimport_files[i].path.get_file(), i);
+ _reimport_file(reimport_files[i].path);
+ } else {
+ Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(reimport_files[from].importer);
+ ERR_CONTINUE(!importer.is_valid());
+
+ importer->import_threaded_begin();
+
+ ImportThreadData tdata;
+ tdata.max_index.set(from);
+ tdata.reimport_from = from;
+ tdata.reimport_files = reimport_files.ptr();
+
+ WorkerThreadPool::GroupID group_task = WorkerThreadPool::get_singleton()->add_template_group_task(this, &EditorFileSystem::_reimport_thread, &tdata, i - from + 1, -1, false, vformat(TTR("Import resources of type: %s"), reimport_files[from].importer));
+ int current_index = from - 1;
+ do {
+ if (current_index < tdata.max_index.get()) {
+ current_index = tdata.max_index.get();
+ pr.step(reimport_files[current_index].path.get_file(), current_index);
+ }
+ OS::get_singleton()->delay_usec(1);
+ } while (!WorkerThreadPool::get_singleton()->is_group_task_completed(group_task));
+
+ WorkerThreadPool::get_singleton()->wait_for_group_task_completion(group_task);
- from = i + 1;
+ importer->import_threaded_end();
}
- } else {
- pr.step(reimport_files[i].path.get_file(), i, false);
- _reimport_file(reimport_files[i].path);
+ from = i + 1;
}
+
+ } else {
+ pr.step(reimport_files[i].path.get_file(), i);
+ _reimport_file(reimport_files[i].path);
}
+ }
- // Reimport groups.
+ // Reimport groups.
- from = reimport_files.size();
+ from = reimport_files.size();
- if (groups_to_reimport.size()) {
- HashMap<String, Vector<String>> group_files;
- _find_group_files(filesystem, group_files, groups_to_reimport);
- for (const KeyValue<String, Vector<String>> &E : group_files) {
- pr.step(E.key.get_file(), from++, false);
- Error err = _reimport_group(E.key, E.value);
- reloads.push_back(E.key);
- reloads.append_array(E.value);
- if (err == OK) {
- _reimport_file(E.key);
- }
+ if (groups_to_reimport.size()) {
+ HashMap<String, Vector<String>> group_files;
+ _find_group_files(filesystem, group_files, groups_to_reimport);
+ for (const KeyValue<String, Vector<String>> &E : group_files) {
+ pr.step(E.key.get_file(), from++);
+ Error err = _reimport_group(E.key, E.value);
+ reloads.push_back(E.key);
+ reloads.append_array(E.value);
+ if (err == OK) {
+ _reimport_file(E.key);
}
}
-
- ResourceUID::get_singleton()->update_cache(); // After reimporting, update the cache.
-
- _save_filesystem_cache();
}
- _update_pending_script_classes(true);
+ ResourceUID::get_singleton()->update_cache(); // After reimporting, update the cache.
+
+ _save_filesystem_cache();
+ _update_pending_script_classes();
_update_pending_scene_groups();
importing = false;
if (!is_scanning()) {
@@ -2767,8 +2688,6 @@ void EditorFileSystem::_bind_methods() {
ADD_SIGNAL(MethodInfo("sources_changed", PropertyInfo(Variant::BOOL, "exist")));
ADD_SIGNAL(MethodInfo("resources_reimported", PropertyInfo(Variant::PACKED_STRING_ARRAY, "resources")));
ADD_SIGNAL(MethodInfo("resources_reload", PropertyInfo(Variant::PACKED_STRING_ARRAY, "resources")));
- ADD_SIGNAL(MethodInfo("scan_started", PropertyInfo(Variant::BOOL, "complete_scan")));
- ADD_SIGNAL(MethodInfo("scan_stopped", PropertyInfo(Variant::BOOL, "complete_scan")));
}
void EditorFileSystem::_update_extensions() {
diff --git a/editor/editor_file_system.h b/editor/editor_file_system.h
index ea839ec823..cd95d5fb95 100644
--- a/editor/editor_file_system.h
+++ b/editor/editor_file_system.h
@@ -153,7 +153,6 @@ class EditorFileSystem : public Node {
Action action = ACTION_NONE;
EditorFileSystemDirectory *dir = nullptr;
String file;
- String import_group_file;
EditorFileSystemDirectory *new_dir = nullptr;
EditorFileSystemDirectory::FileInfo *new_file = nullptr;
};
@@ -201,15 +200,11 @@ class EditorFileSystem : public Node {
HashSet<String> dep_update_list;
struct ScanProgress {
- int directories_processed = 0;
- int nb_dir_to_scan = 0;
- int nb_file_to_scan = 0;
- float estimated = 0;
- float real = 0;
- float current = 0;
- EditorProgressBG *progress = nullptr;
- void increment();
- void update_estimated(int p_depth, int p_nb_dirs, int p_nb_files);
+ float low = 0;
+ float hi = 0;
+ mutable EditorProgressBG *progress = nullptr;
+ void update(int p_current, int p_total) const;
+ ScanProgress get_sub(int p_current, int p_total) const;
};
void _save_filesystem_cache();
@@ -217,7 +212,7 @@ class EditorFileSystem : public Node {
bool _find_file(const String &p_file, EditorFileSystemDirectory **r_d, int &r_file_pos) const;
- void _scan_fs_changes(EditorFileSystemDirectory *p_dir, ScanProgress *p_progress);
+ void _scan_fs_changes(EditorFileSystemDirectory *p_dir, const ScanProgress &p_progress);
void _delete_internal_files(const String &p_file);
@@ -225,7 +220,7 @@ class EditorFileSystem : public Node {
HashSet<String> valid_extensions;
HashSet<String> import_extensions;
- void _scan_new_dir(EditorFileSystemDirectory *p_dir, Ref<DirAccess> &da, ScanProgress *p_progress, int p_depth);
+ void _scan_new_dir(EditorFileSystemDirectory *p_dir, Ref<DirAccess> &da, const ScanProgress &p_progress);
Thread thread_sources;
bool scanning_changes = false;
@@ -236,7 +231,7 @@ class EditorFileSystem : public Node {
List<String> sources_changed;
List<ItemAction> scan_actions;
- bool _update_scan_actions(bool p_show_progress = false);
+ bool _update_scan_actions();
void _update_extensions();
@@ -262,8 +257,8 @@ class EditorFileSystem : public Node {
Mutex update_script_mutex;
HashSet<String> update_script_paths;
void _queue_update_script_class(const String &p_path);
- void _update_script_classes(bool p_show_progress = false);
- void _update_pending_script_classes(bool p_show_progress = false);
+ void _update_script_classes();
+ void _update_pending_script_classes();
Mutex update_scene_mutex;
HashSet<String> update_scene_paths;
@@ -291,7 +286,6 @@ class EditorFileSystem : public Node {
SafeNumeric<int> max_index;
};
- void _reimport_files_internal(const Vector<String> &p_files, const HashMap<String, String> *p_import_group_files);
void _reimport_thread(uint32_t p_index, ImportThreadData *p_import_data);
static ResourceUID::ID _resource_saver_get_resource_id_for_path(const String &p_path, bool p_generate);
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index b58b378414..94bd590fc1 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -5103,8 +5103,6 @@ void EditorNode::save_editor_layout_delayed() {
}
void EditorNode::_load_editor_layout() {
- EditorProgress ep("loading_editor_layout", TTR("Loading editor"), 5);
- ep.step("Loading editor layout...", 0, true);
Ref<ConfigFile> config;
config.instantiate();
Error err = config->load(EditorPaths::get_singleton()->get_project_settings_dir().path_join("editor_layout.cfg"));
@@ -5126,19 +5124,11 @@ void EditorNode::_load_editor_layout() {
return;
}
- ep.step("Loading docks...", 1, true);
editor_dock_manager->load_docks_from_config(config, "docks");
-
- ep.step("Reopening scenes...", 2, true);
_load_open_scenes_from_config(config);
-
- ep.step("Loading central editor layout...", 3, true);
_load_central_editor_layout_from_config(config);
- ep.step("Loading plugin window layout...", 4, true);
editor_data.set_plugin_window_layout(config);
-
- ep.step("Editor layout ready.", 5, true);
}
void EditorNode::_save_central_editor_layout_to_config(Ref<ConfigFile> p_config_file) {
diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp
index 7d90da05c2..f8a82187b9 100644
--- a/editor/filesystem_dock.cpp
+++ b/editor/filesystem_dock.cpp
@@ -550,8 +550,6 @@ void FileSystemDock::_notification(int p_what) {
case NOTIFICATION_READY: {
EditorFeatureProfileManager::get_singleton()->connect("current_feature_profile_changed", callable_mp(this, &FileSystemDock::_feature_profile_changed));
EditorFileSystem::get_singleton()->connect("filesystem_changed", callable_mp(this, &FileSystemDock::_fs_changed));
- EditorFileSystem::get_singleton()->connect("scan_started", callable_mp(this, &FileSystemDock::_scan_started));
- EditorFileSystem::get_singleton()->connect("scan_stopped", callable_mp(this, &FileSystemDock::_scan_stopped));
EditorResourcePreview::get_singleton()->connect("preview_invalidated", callable_mp(this, &FileSystemDock::_preview_invalidated));
button_file_list_display_mode->connect(SceneStringName(pressed), callable_mp(this, &FileSystemDock::_toggle_file_display));
@@ -568,7 +566,9 @@ void FileSystemDock::_notification(int p_what) {
_update_display_mode();
- if (!EditorFileSystem::get_singleton()->is_scanning()) {
+ if (EditorFileSystem::get_singleton()->is_scanning()) {
+ _set_scanning_mode();
+ } else {
_update_tree(Vector<String>(), true);
}
} break;
@@ -1326,18 +1326,6 @@ void FileSystemDock::_fs_changed() {
set_process(false);
}
-void FileSystemDock::_scan_started(bool p_complete_scan) {
- if (p_complete_scan) {
- _set_scanning_mode();
- }
-}
-
-void FileSystemDock::_scan_stopped(bool p_complete_scan) {
- if (p_complete_scan) {
- _fs_changed();
- }
-}
-
void FileSystemDock::_set_scanning_mode() {
button_hist_prev->set_disabled(true);
button_hist_next->set_disabled(true);
@@ -2661,6 +2649,7 @@ bool FileSystemDock::_matches_all_search_tokens(const String &p_text) {
}
void FileSystemDock::_rescan() {
+ _set_scanning_mode();
EditorFileSystem::get_singleton()->scan();
}
diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h
index 2e9e52fcf6..3fbff3ef19 100644
--- a/editor/filesystem_dock.h
+++ b/editor/filesystem_dock.h
@@ -308,8 +308,6 @@ private:
void _set_scanning_mode();
void _rescan();
- void _scan_started(bool p_complete_scan);
- void _scan_stopped(bool p_complete_scan);
void _change_split_mode();
void _split_dragged(int p_offset);