Skip to content

Commit adfbe4e

Browse files
committed
Merge pull request godotengine#93147 from Hilderin/fix-freeze-after-save
Fix noticeable freeze after saving a scene
2 parents bf30705 + 5e11309 commit adfbe4e

4 files changed

Lines changed: 73 additions & 35 deletions

File tree

editor/editor_file_system.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,10 @@ String EditorFileSystemDirectory::get_file_script_class_icon_path(int p_idx) con
161161
return files[p_idx]->script_class_icon_path;
162162
}
163163

164+
String EditorFileSystemDirectory::get_file_icon_path(int p_idx) const {
165+
return files[p_idx]->icon_path;
166+
}
167+
164168
StringName EditorFileSystemDirectory::get_file_type(int p_idx) const {
165169
ERR_FAIL_INDEX_V(p_idx, files.size(), "");
166170
return files[p_idx]->type;
@@ -740,6 +744,8 @@ void EditorFileSystem::scan() {
740744
scanning = false;
741745
_update_pending_script_classes();
742746
_update_pending_scene_groups();
747+
// Update all icons so they are loaded for the FileSystemDock.
748+
_update_files_icon_path();
743749
emit_signal(SNAME("filesystem_changed"));
744750
emit_signal(SNAME("sources_changed"), sources_changed.size() > 0);
745751
first_scan = false;
@@ -1298,6 +1304,8 @@ void EditorFileSystem::_notification(int p_what) {
12981304
_update_scan_actions();
12991305
_update_pending_script_classes();
13001306
_update_pending_scene_groups();
1307+
// Update all icons so they are loaded for the FileSystemDock.
1308+
_update_files_icon_path();
13011309
emit_signal(SNAME("filesystem_changed"));
13021310
emit_signal(SNAME("sources_changed"), sources_changed.size() > 0);
13031311
first_scan = false;
@@ -1578,6 +1586,43 @@ String EditorFileSystem::_get_global_script_class(const String &p_type, const St
15781586
return String();
15791587
}
15801588

1589+
void EditorFileSystem::_update_file_icon_path(EditorFileSystemDirectory::FileInfo *file_info) {
1590+
String icon_path;
1591+
if (file_info->script_class_icon_path.is_empty() && !file_info->deps.is_empty()) {
1592+
const String &script_path = file_info->deps[0]; // Assuming the first dependency is a script.
1593+
if (!script_path.is_empty()) {
1594+
String *cached = file_icon_cache.getptr(script_path);
1595+
if (cached) {
1596+
icon_path = *cached;
1597+
} else {
1598+
if (ClassDB::is_parent_class(ResourceLoader::get_resource_type(script_path), SNAME("Script"))) {
1599+
int script_file;
1600+
EditorFileSystemDirectory *efsd = find_file(script_path, &script_file);
1601+
if (efsd) {
1602+
icon_path = efsd->files[script_file]->script_class_icon_path;
1603+
}
1604+
}
1605+
file_icon_cache.insert(script_path, icon_path);
1606+
}
1607+
}
1608+
}
1609+
1610+
file_info->icon_path = icon_path;
1611+
}
1612+
1613+
void EditorFileSystem::_update_files_icon_path(EditorFileSystemDirectory *edp) {
1614+
if (!edp) {
1615+
edp = filesystem;
1616+
file_icon_cache.clear();
1617+
}
1618+
for (EditorFileSystemDirectory *sub_dir : edp->subdirs) {
1619+
_update_files_icon_path(sub_dir);
1620+
}
1621+
for (EditorFileSystemDirectory::FileInfo *fi : edp->files) {
1622+
_update_file_icon_path(fi);
1623+
}
1624+
}
1625+
15811626
void EditorFileSystem::_update_script_classes() {
15821627
update_script_mutex.lock();
15831628

@@ -1719,6 +1764,8 @@ void EditorFileSystem::update_file(const String &p_file) {
17191764

17201765
void EditorFileSystem::update_files(const Vector<String> &p_script_paths) {
17211766
bool updated = false;
1767+
bool update_files_icon_cache = false;
1768+
Vector<EditorFileSystemDirectory::FileInfo *> files_to_update_icon_path;
17221769
for (const String &file : p_script_paths) {
17231770
ERR_CONTINUE(file.is_empty());
17241771
EditorFileSystemDirectory *fs = nullptr;
@@ -1741,6 +1788,9 @@ void EditorFileSystem::update_files(const Vector<String> &p_script_paths) {
17411788
}
17421789
if (ClassDB::is_parent_class(fs->files[cpos]->type, SNAME("Script"))) {
17431790
_queue_update_script_class(file);
1791+
if (!fs->files[cpos]->script_class_icon_path.is_empty()) {
1792+
update_files_icon_cache = true;
1793+
}
17441794
}
17451795
if (fs->files[cpos]->type == SNAME("PackedScene")) {
17461796
_queue_update_scene_groups(file);
@@ -1789,6 +1839,7 @@ void EditorFileSystem::update_files(const Vector<String> &p_script_paths) {
17891839
_save_late_updated_files(); //files need to be updated in the re-scan
17901840
}
17911841

1842+
const String old_script_class_icon_path = fs->files[cpos]->script_class_icon_path;
17921843
fs->files[cpos]->type = type;
17931844
fs->files[cpos]->resource_script_class = script_class;
17941845
fs->files[cpos]->uid = uid;
@@ -1816,13 +1867,25 @@ void EditorFileSystem::update_files(const Vector<String> &p_script_paths) {
18161867
if (fs->files[cpos]->type == SNAME("PackedScene")) {
18171868
_queue_update_scene_groups(file);
18181869
}
1870+
if (fs->files[cpos]->type == SNAME("Resource")) {
1871+
files_to_update_icon_path.push_back(fs->files[cpos]);
1872+
} else if (old_script_class_icon_path != fs->files[cpos]->script_class_icon_path) {
1873+
update_files_icon_cache = true;
1874+
}
18191875
updated = true;
18201876
}
18211877
}
18221878

18231879
if (updated) {
18241880
_update_pending_script_classes();
18251881
_update_pending_scene_groups();
1882+
if (update_files_icon_cache) {
1883+
_update_files_icon_path();
1884+
} else {
1885+
for (EditorFileSystemDirectory::FileInfo *fi : files_to_update_icon_path) {
1886+
_update_file_icon_path(fi);
1887+
}
1888+
}
18261889
call_deferred(SNAME("emit_signal"), "filesystem_changed"); //update later
18271890
}
18281891
}

editor/editor_file_system.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class EditorFileSystemDirectory : public Object {
6666
String script_class_name;
6767
String script_class_extends;
6868
String script_class_icon_path;
69+
String icon_path;
6970
};
7071

7172
Vector<FileInfo *> files;
@@ -91,6 +92,7 @@ class EditorFileSystemDirectory : public Object {
9192
String get_file_script_class_name(int p_idx) const; //used for scripts
9293
String get_file_script_class_extends(int p_idx) const; //used for scripts
9394
String get_file_script_class_icon_path(int p_idx) const; //used for scripts
95+
String get_file_icon_path(int p_idx) const; //used for FileSystemDock
9496

9597
EditorFileSystemDirectory *get_parent();
9698

@@ -279,6 +281,7 @@ class EditorFileSystem : public Node {
279281
void _move_group_files(EditorFileSystemDirectory *efd, const String &p_group_file, const String &p_new_location);
280282

281283
HashSet<String> group_file_cache;
284+
HashMap<String, String> file_icon_cache;
282285

283286
struct ImportThreadData {
284287
const ImportFile *reimport_files;
@@ -295,6 +298,9 @@ class EditorFileSystem : public Node {
295298

296299
Vector<Ref<EditorFileSystemImportFormatSupportQuery>> import_support_queries;
297300

301+
void _update_file_icon_path(EditorFileSystemDirectory::FileInfo *file_info);
302+
void _update_files_icon_path(EditorFileSystemDirectory *edp = nullptr);
303+
298304
protected:
299305
void _notification(int p_what);
300306
static void _bind_methods();

editor/filesystem_dock.cpp

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -200,33 +200,6 @@ Ref<Texture2D> FileSystemDock::_get_tree_item_icon(bool p_is_valid, const String
200200
}
201201
}
202202

203-
String FileSystemDock::_get_entry_script_icon(const EditorFileSystemDirectory *p_dir, int p_file) {
204-
const PackedStringArray &deps = p_dir->get_file_deps(p_file);
205-
if (deps.is_empty()) {
206-
return String();
207-
}
208-
209-
const String &script_path = deps[0]; // Assuming the first dependency is a script.
210-
if (script_path.is_empty() || !ClassDB::is_parent_class(ResourceLoader::get_resource_type(script_path), SNAME("Script"))) {
211-
return String();
212-
}
213-
214-
String *cached = icon_cache.getptr(script_path);
215-
if (cached) {
216-
return *cached;
217-
}
218-
219-
HashMap<String, String>::Iterator I;
220-
int script_file;
221-
EditorFileSystemDirectory *efsd = EditorFileSystem::get_singleton()->find_file(script_path, &script_file);
222-
if (efsd) {
223-
I = icon_cache.insert(script_path, efsd->get_file_script_class_icon_path(script_file));
224-
} else {
225-
I = icon_cache.insert(script_path, String());
226-
}
227-
return I->value;
228-
}
229-
230203
bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths, bool p_select_in_favorites, bool p_unfold_path) {
231204
bool parent_should_expand = false;
232205

@@ -316,7 +289,7 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
316289
FileInfo fi;
317290
fi.name = p_dir->get_file(i);
318291
fi.type = p_dir->get_file_type(i);
319-
fi.icon_path = _get_entry_script_icon(p_dir, i);
292+
fi.icon_path = p_dir->get_file_icon_path(i);
320293
fi.import_broken = !p_dir->get_file_import_is_valid(i);
321294
fi.modified_time = p_dir->get_file_modified_time(i);
322295

@@ -414,8 +387,6 @@ void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, boo
414387
updating_tree = true;
415388
TreeItem *root = tree->create_item();
416389

417-
icon_cache.clear();
418-
419390
// Handles the favorites.
420391
TreeItem *favorites_item = tree->create_item(root);
421392
favorites_item->set_icon(0, get_editor_theme_icon(SNAME("Favorites")));
@@ -463,7 +434,7 @@ void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, boo
463434
int index;
464435
EditorFileSystemDirectory *dir = EditorFileSystem::get_singleton()->find_file(favorite, &index);
465436
if (dir) {
466-
icon = _get_tree_item_icon(dir->get_file_import_is_valid(index), dir->get_file_type(index), _get_entry_script_icon(dir, index));
437+
icon = _get_tree_item_icon(dir->get_file_import_is_valid(index), dir->get_file_type(index), dir->get_file_icon_path(index));
467438
} else {
468439
icon = get_editor_theme_icon(SNAME("File"));
469440
}
@@ -1017,7 +988,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
1017988
fi.path = favorite;
1018989
if (efd) {
1019990
fi.type = efd->get_file_type(index);
1020-
fi.icon_path = _get_entry_script_icon(efd, index);
991+
fi.icon_path = efd->get_file_icon_path(index);
1021992
fi.import_broken = !efd->get_file_import_is_valid(index);
1022993
fi.modified_time = efd->get_file_modified_time(index);
1023994
} else {
@@ -1110,7 +1081,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
11101081
fi.name = efd->get_file(i);
11111082
fi.path = directory.path_join(fi.name);
11121083
fi.type = efd->get_file_type(i);
1113-
fi.icon_path = _get_entry_script_icon(efd, i);
1084+
fi.icon_path = efd->get_file_icon_path(i);
11141085
fi.import_broken = !efd->get_file_import_is_valid(i);
11151086
fi.modified_time = efd->get_file_modified_time(i);
11161087

editor/filesystem_dock.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ class FileSystemDock : public VBoxContainer {
142142
FILE_NEW_SCENE,
143143
};
144144

145-
HashMap<String, String> icon_cache;
146145
HashMap<String, Color> folder_colors;
147146
Dictionary assigned_folder_colors;
148147

@@ -250,7 +249,6 @@ class FileSystemDock : public VBoxContainer {
250249
void _reselect_items_selected_on_drag_begin(bool reset = false);
251250

252251
Ref<Texture2D> _get_tree_item_icon(bool p_is_valid, const String &p_file_type, const String &p_icon_path);
253-
String _get_entry_script_icon(const EditorFileSystemDirectory *p_dir, int p_file);
254252
bool _create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths, bool p_select_in_favorites, bool p_unfold_path = false);
255253
void _update_tree(const Vector<String> &p_uncollapsed_paths = Vector<String>(), bool p_uncollapse_root = false, bool p_select_in_favorites = false, bool p_unfold_path = false);
256254
void _navigate_to_path(const String &p_path, bool p_select_in_favorites = false);

0 commit comments

Comments
 (0)