From 08e3358cdb4abb45cd6de4f24b77ca2a1b31d601 Mon Sep 17 00:00:00 2001 From: kobewi Date: Sun, 28 Sep 2025 22:15:16 +0200 Subject: [PATCH] Improve Move/Duplicate dialog --- editor/docks/filesystem_dock.cpp | 2 +- editor/gui/editor_dir_dialog.cpp | 38 +++++++++++++++++++++++++++++--- editor/gui/editor_dir_dialog.h | 1 + 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/editor/docks/filesystem_dock.cpp b/editor/docks/filesystem_dock.cpp index 6138c06070..7ccf539689 100644 --- a/editor/docks/filesystem_dock.cpp +++ b/editor/docks/filesystem_dock.cpp @@ -2550,7 +2550,7 @@ void FileSystemDock::_file_option(int p_option, const Vector &p_selected } if (to_move.size() > 0) { move_dialog->config(p_selected); - move_dialog->popup_centered_ratio(0.5); + move_dialog->popup_centered(Vector2i(260 * EDSCALE, DisplayServer::get_singleton()->screen_get_size().y * 0.6)); } } break; diff --git a/editor/gui/editor_dir_dialog.cpp b/editor/gui/editor_dir_dialog.cpp index 93936109f7..18284f566f 100644 --- a/editor/gui/editor_dir_dialog.cpp +++ b/editor/gui/editor_dir_dialog.cpp @@ -99,6 +99,7 @@ void EditorDirDialog::config(const Vector &p_paths) { // TRANSLATORS: %d is the number of files that will be moved or duplicated. set_title(vformat(TTRN("Move/Duplicate %d Item", "Move/Duplicate %d Items", p_paths.size()), p_paths.size())); } + base_directory_path = p_paths[0].get_base_dir(); } void EditorDirDialog::reload(const String &p_path) { @@ -129,8 +130,39 @@ void EditorDirDialog::_notification(int p_what) { } break; case NOTIFICATION_VISIBILITY_CHANGED: { - if (must_reload && is_visible()) { - reload(); + if (is_visible()) { + if (must_reload) { + reload(); + } + + tree->deselect_all(); + const PackedStringArray parts = base_directory_path.trim_prefix("res://").split("/"); + if (parts.is_empty()) { + break; + } + + int i = 0; + TreeItem *item = tree->get_root(); + while (i < parts.size()) { + const String &folder = parts[i]; + for (TreeItem *child = item->get_first_child(); child; child = child->get_next()) { + if (child->get_text(0) == folder) { + i++; + if (i == parts.size()) { + TreeItem *parent_item = child->get_parent(); + while (parent_item) { + parent_item->set_collapsed(false); + parent_item = parent_item->get_parent(); + } + child->select(0); + tree->ensure_cursor_is_visible(); + } else { + item = child; + } + break; + } + } + } } } break; } @@ -178,7 +210,7 @@ void EditorDirDialog::_make_dir() { TreeItem *ti = tree->get_selected(); ERR_FAIL_NULL(ti); const String &directory = ti->get_metadata(0); - makedialog->config(directory, callable_mp(this, &EditorDirDialog::_make_dir_confirm).bind(directory), DirectoryCreateDialog::MODE_DIRECTORY, "new folder"); + makedialog->config(directory, callable_mp(this, &EditorDirDialog::_make_dir_confirm).bind(directory), DirectoryCreateDialog::MODE_DIRECTORY, TTR("Create Folder"), "new folder"); makedialog->popup_centered(); } diff --git a/editor/gui/editor_dir_dialog.h b/editor/gui/editor_dir_dialog.h index 5a04e5b206..9a6f58bd72 100644 --- a/editor/gui/editor_dir_dialog.h +++ b/editor/gui/editor_dir_dialog.h @@ -46,6 +46,7 @@ class EditorDirDialog : public ConfirmationDialog { Button *copy = nullptr; HashSet opened_paths; String new_dir_path; + String base_directory_path; Tree *tree = nullptr; bool updating = false;