Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use Hashset for dependency list when moving #83941

Merged
merged 1 commit into from
Oct 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions editor/editor_node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1811,11 +1811,18 @@ void EditorNode::save_all_scenes() {
_save_all_scenes();
}

void EditorNode::save_scene_list(Vector<String> p_scene_filenames) {
void EditorNode::save_scene_if_open(const String &p_scene_path) {
AThousandShips marked this conversation as resolved.
Show resolved Hide resolved
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<String> &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);
}
}
Expand Down
3 changes: 2 additions & 1 deletion editor/editor_node.h
Original file line number Diff line number Diff line change
Expand Up @@ -912,7 +912,8 @@ class EditorNode : public Node {
PopupMenu *get_export_as_menu();

void save_all_scenes();
void save_scene_list(Vector<String> p_scene_filenames);
void save_scene_if_open(const String &p_scene_path);
void save_scene_list(const HashSet<String> &p_scene_paths);
void save_before_run();
void try_autosave();
void restart_editor();
Expand Down
27 changes: 14 additions & 13 deletions editor/filesystem_dock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1377,15 +1377,15 @@ void FileSystemDock::_get_all_items_in_dir(EditorFileSystemDirectory *p_efsd, Ve
}
}

void FileSystemDock::_find_file_owners(EditorFileSystemDirectory *p_efsd, const Vector<String> &p_renames, Vector<String> &r_file_owners) const {
void FileSystemDock::_find_file_owners(EditorFileSystemDirectory *p_efsd, const HashSet<String> &p_renames, HashSet<String> &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);
}
for (int i = 0; i < p_efsd->get_file_count(); i++) {
Vector<String> 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;
}
}
Expand Down Expand Up @@ -1578,22 +1578,23 @@ void FileSystemDock::_update_resource_paths_after_move(const HashMap<String, Str
}
}

void FileSystemDock::_update_dependencies_after_move(const HashMap<String, String> &p_renames, const Vector<String> &p_file_owners) const {
void FileSystemDock::_update_dependencies_after_move(const HashMap<String, String> &p_renames, const HashSet<String> &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<String> 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<String, String>::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) {
if (ResourceLoader::get_resource_type(file) == "PackedScene") {
scenes_to_reload.push_back(file);
}
} else {
EditorNode::get_singleton()->add_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");
}
}

Expand Down Expand Up @@ -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<Resource> &p_resource) {
Expand Down Expand Up @@ -1790,7 +1791,7 @@ void FileSystemDock::_rename_operation_confirm() {
}

HashMap<String, ResourceUID::ID> uids;
Vector<String> file_owners; // The files that use these moved/renamed resource files.
HashSet<String> file_owners; // The files that use these moved/renamed resource files.
_before_move(uids, file_owners);

HashMap<String, String> file_renames;
Expand Down Expand Up @@ -1921,7 +1922,7 @@ void FileSystemDock::_move_operation_confirm(const String &p_to_path, bool p_cop
}

HashMap<String, ResourceUID::ID> uids;
Vector<String> file_owners; // The files that use these moved/renamed resource files.
HashSet<String> file_owners; // The files that use these moved/renamed resource files.
_before_move(uids, file_owners);

bool is_moved = false;
Expand Down Expand Up @@ -1953,11 +1954,11 @@ void FileSystemDock::_move_operation_confirm(const String &p_to_path, bool p_cop
}
}

void FileSystemDock::_before_move(HashMap<String, ResourceUID::ID> &r_uids, Vector<String> &r_file_owners) const {
Vector<String> renamed_files;
void FileSystemDock::_before_move(HashMap<String, ResourceUID::ID> &r_uids, HashSet<String> &r_file_owners) const {
HashSet<String> 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;
Expand All @@ -1970,7 +1971,7 @@ void FileSystemDock::_before_move(HashMap<String, ResourceUID::ID> &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;
Expand Down
6 changes: 3 additions & 3 deletions editor/filesystem_dock.h
Original file line number Diff line number Diff line change
Expand Up @@ -266,11 +266,11 @@ class FileSystemDock : public VBoxContainer {
void _update_import_dock();

void _get_all_items_in_dir(EditorFileSystemDirectory *p_efsd, Vector<String> &r_files, Vector<String> &r_folders) const;
void _find_file_owners(EditorFileSystemDirectory *p_efsd, const Vector<String> &p_renames, Vector<String> &r_file_owners) const;
void _find_file_owners(EditorFileSystemDirectory *p_efsd, const HashSet<String> &p_renames, HashSet<String> &r_file_owners) const;
void _try_move_item(const FileOrFolder &p_item, const String &p_new_path, HashMap<String, String> &p_file_renames, HashMap<String, String> &p_folder_renames);
void _try_duplicate_item(const FileOrFolder &p_item, const String &p_new_path) const;
void _before_move(HashMap<String, ResourceUID::ID> &r_uids, Vector<String> &r_file_owners) const;
void _update_dependencies_after_move(const HashMap<String, String> &p_renames, const Vector<String> &p_file_owners) const;
void _before_move(HashMap<String, ResourceUID::ID> &r_uids, HashSet<String> &r_file_owners) const;
void _update_dependencies_after_move(const HashMap<String, String> &p_renames, const HashSet<String> &p_file_owners) const;
void _update_resource_paths_after_move(const HashMap<String, String> &p_renames, const HashMap<String, ResourceUID::ID> &p_uids) const;
void _update_favorites_list_after_move(const HashMap<String, String> &p_files_renames, const HashMap<String, String> &p_folders_renames) const;
void _update_project_settings_after_move(const HashMap<String, String> &p_renames, const HashMap<String, String> &p_folders_renames);
Expand Down
8 changes: 3 additions & 5 deletions editor/plugins/script_editor_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> 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);
Expand All @@ -2534,7 +2532,7 @@ void ScriptEditor::save_current_script() {
}

void ScriptEditor::save_all_scripts() {
Vector<String> scenes_to_save;
HashSet<String> scenes_to_save;

for (int i = 0; i < tab_container->get_tab_count(); i++) {
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_tab_control(i));
Expand Down Expand Up @@ -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);
}
}
}
Expand Down