diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 8c3637663d4..3d431ae67ec 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -1811,11 +1811,18 @@ void EditorNode::save_all_scenes() { _save_all_scenes(); } -void EditorNode::save_scene_list(Vector p_scene_filenames) { +void EditorNode::save_scene_if_open(const String &p_scene_path) { + int idx = editor_data.get_edited_scene_from_path(p_scene_path); + if (idx >= 0) { + _save_scene(p_scene_path, idx); + } +} + +void EditorNode::save_scene_list(const HashSet &p_scene_paths) { for (int i = 0; i < editor_data.get_edited_scene_count(); i++) { Node *scene = editor_data.get_edited_scene_root(i); - if (scene && (p_scene_filenames.find(scene->get_scene_file_path()) >= 0)) { + if (scene && p_scene_paths.has(scene->get_scene_file_path())) { _save_scene(scene->get_scene_file_path(), i); } } diff --git a/editor/editor_node.h b/editor/editor_node.h index 7d85055ac27..bc7da69e757 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -912,7 +912,8 @@ public: PopupMenu *get_export_as_menu(); void save_all_scenes(); - void save_scene_list(Vector p_scene_filenames); + void save_scene_if_open(const String &p_scene_path); + void save_scene_list(const HashSet &p_scene_paths); void save_before_run(); void try_autosave(); void restart_editor(); diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index a491a9b214f..d743c2a13b6 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -1377,7 +1377,7 @@ void FileSystemDock::_get_all_items_in_dir(EditorFileSystemDirectory *p_efsd, Ve } } -void FileSystemDock::_find_file_owners(EditorFileSystemDirectory *p_efsd, const Vector &p_renames, Vector &r_file_owners) const { +void FileSystemDock::_find_file_owners(EditorFileSystemDirectory *p_efsd, const HashSet &p_renames, HashSet &r_file_owners) const { for (int i = 0; i < p_efsd->get_subdir_count(); i++) { _find_file_owners(p_efsd->get_subdir(i), p_renames, r_file_owners); } @@ -1385,7 +1385,7 @@ void FileSystemDock::_find_file_owners(EditorFileSystemDirectory *p_efsd, const Vector deps = p_efsd->get_file_deps(i); for (int j = 0; j < deps.size(); j++) { if (p_renames.has(deps[j])) { - r_file_owners.push_back(p_efsd->get_file_path(i)); + r_file_owners.insert(p_efsd->get_file_path(i)); break; } } @@ -1578,14 +1578,15 @@ void FileSystemDock::_update_resource_paths_after_move(const HashMap &p_renames, const Vector &p_file_owners) const { +void FileSystemDock::_update_dependencies_after_move(const HashMap &p_renames, const HashSet &p_file_owners) const { // The following code assumes that the following holds: // 1) EditorFileSystem contains the old paths/folder structure from before the rename/move. // 2) ResourceLoader can use the new paths without needing to call rescan. List scenes_to_reload; - for (int i = 0; i < p_file_owners.size(); ++i) { + for (const String &E : p_file_owners) { // Because we haven't called a rescan yet the found remap might still be an old path itself. - const String file = p_renames.has(p_file_owners[i]) ? p_renames[p_file_owners[i]] : p_file_owners[i]; + const HashMap::ConstIterator I = p_renames.find(E); + const String file = I ? I->value : E; print_verbose("Remapping dependencies for: " + file); const Error err = ResourceLoader::rename_dependencies(file, p_renames); if (err == OK) { @@ -1593,7 +1594,7 @@ void FileSystemDock::_update_dependencies_after_move(const HashMapadd_io_error(TTR("Unable to update dependencies for:") + "\n" + p_file_owners[i] + "\n"); + EditorNode::get_singleton()->add_io_error(TTR("Unable to update dependencies for:") + "\n" + E + "\n"); } } @@ -1687,7 +1688,7 @@ void FileSystemDock::_make_scene_confirm() { int idx = EditorNode::get_singleton()->new_scene(); EditorNode::get_editor_data().set_scene_path(idx, scene_path); EditorNode::get_singleton()->set_edited_scene(make_scene_dialog->create_scene_root()); - EditorNode::get_singleton()->save_scene_list({ scene_path }); + EditorNode::get_singleton()->save_scene_if_open(scene_path); } void FileSystemDock::_resource_removed(const Ref &p_resource) { @@ -1790,7 +1791,7 @@ void FileSystemDock::_rename_operation_confirm() { } HashMap uids; - Vector file_owners; // The files that use these moved/renamed resource files. + HashSet file_owners; // The files that use these moved/renamed resource files. _before_move(uids, file_owners); HashMap file_renames; @@ -1921,7 +1922,7 @@ void FileSystemDock::_move_operation_confirm(const String &p_to_path, bool p_cop } HashMap uids; - Vector file_owners; // The files that use these moved/renamed resource files. + HashSet file_owners; // The files that use these moved/renamed resource files. _before_move(uids, file_owners); bool is_moved = false; @@ -1953,11 +1954,11 @@ void FileSystemDock::_move_operation_confirm(const String &p_to_path, bool p_cop } } -void FileSystemDock::_before_move(HashMap &r_uids, Vector &r_file_owners) const { - Vector renamed_files; +void FileSystemDock::_before_move(HashMap &r_uids, HashSet &r_file_owners) const { + HashSet renamed_files; for (int i = 0; i < to_move.size(); i++) { if (to_move[i].is_file) { - renamed_files.push_back(to_move[i].path); + renamed_files.insert(to_move[i].path); ResourceUID::ID uid = ResourceLoader::get_resource_uid(to_move[i].path); if (uid != ResourceUID::INVALID_ID) { r_uids[to_move[i].path] = uid; @@ -1970,7 +1971,7 @@ void FileSystemDock::_before_move(HashMap &r_uids, Vect current_folder = folders.front()->get(); for (int j = 0; j < current_folder->get_file_count(); j++) { const String file_path = current_folder->get_file_path(j); - renamed_files.push_back(file_path); + renamed_files.insert(file_path); ResourceUID::ID uid = ResourceLoader::get_resource_uid(file_path); if (uid != ResourceUID::INVALID_ID) { r_uids[file_path] = uid; diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h index 104def71c80..1cde735cb8b 100644 --- a/editor/filesystem_dock.h +++ b/editor/filesystem_dock.h @@ -266,11 +266,11 @@ private: void _update_import_dock(); void _get_all_items_in_dir(EditorFileSystemDirectory *p_efsd, Vector &r_files, Vector &r_folders) const; - void _find_file_owners(EditorFileSystemDirectory *p_efsd, const Vector &p_renames, Vector &r_file_owners) const; + void _find_file_owners(EditorFileSystemDirectory *p_efsd, const HashSet &p_renames, HashSet &r_file_owners) const; void _try_move_item(const FileOrFolder &p_item, const String &p_new_path, HashMap &p_file_renames, HashMap &p_folder_renames); void _try_duplicate_item(const FileOrFolder &p_item, const String &p_new_path) const; - void _before_move(HashMap &r_uids, Vector &r_file_owners) const; - void _update_dependencies_after_move(const HashMap &p_renames, const Vector &p_file_owners) const; + void _before_move(HashMap &r_uids, HashSet &r_file_owners) const; + void _update_dependencies_after_move(const HashMap &p_renames, const HashSet &p_file_owners) const; void _update_resource_paths_after_move(const HashMap &p_renames, const HashMap &p_uids) const; void _update_favorites_list_after_move(const HashMap &p_files_renames, const HashMap &p_folders_renames) const; void _update_project_settings_after_move(const HashMap &p_renames, const HashMap &p_folders_renames); diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index 16d281d037a..22596c09d10 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -2520,9 +2520,7 @@ void ScriptEditor::save_current_script() { // If built-in script, save the scene instead. const String scene_path = resource->get_path().get_slice("::", 0); if (!scene_path.is_empty()) { - Vector scene_to_save; - scene_to_save.push_back(scene_path); - EditorNode::get_singleton()->save_scene_list(scene_to_save); + EditorNode::get_singleton()->save_scene_if_open(scene_path); } } else { EditorNode::get_singleton()->save_resource(resource); @@ -2534,7 +2532,7 @@ void ScriptEditor::save_current_script() { } void ScriptEditor::save_all_scripts() { - Vector scenes_to_save; + HashSet scenes_to_save; for (int i = 0; i < tab_container->get_tab_count(); i++) { ScriptEditorBase *se = Object::cast_to(tab_container->get_tab_control(i)); @@ -2583,7 +2581,7 @@ void ScriptEditor::save_all_scripts() { // For built-in scripts, save their scenes instead. const String scene_path = edited_res->get_path().get_slice("::", 0); if (!scene_path.is_empty() && !scenes_to_save.has(scene_path)) { - scenes_to_save.push_back(scene_path); + scenes_to_save.insert(scene_path); } } }