summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvolzhs <volzhs@gmail.com>2020-10-14 03:28:45 +0900
committervolzhs <volzhs@gmail.com>2021-01-02 17:57:28 +0900
commit1f4b1e1488551ad297ffa10379ebcbff9cdc764b (patch)
tree640855638e447e984195e993bb878d3fca572891
parenta22c7eff0f3d443aa18cc962a6c50d066c3bdc2a (diff)
Enhance editor file dialog
1. show valid directory path when opening editor file dialog 2. keep file name when changing path by entering path 3. add first extension in filter automatically if not given 4. remove directory in recent list if it's not valid anymore
-rw-r--r--editor/editor_file_dialog.cpp34
-rw-r--r--editor/editor_file_dialog.h1
-rw-r--r--editor/editor_node.cpp9
3 files changed, 28 insertions, 16 deletions
diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp
index 2140b6bd13..138569fae9 100644
--- a/editor/editor_file_dialog.cpp
+++ b/editor/editor_file_dialog.cpp
@@ -220,7 +220,6 @@ void EditorFileDialog::update_dir() {
void EditorFileDialog::_dir_entered(String p_dir) {
dir_access->change_dir(p_dir);
- file->set_text("");
invalidate();
update_dir();
_push_history();
@@ -239,6 +238,14 @@ void EditorFileDialog::_save_confirm_pressed() {
void EditorFileDialog::_post_popup() {
ConfirmationDialog::_post_popup();
+
+ // Check if the current path doesn't exist and correct it.
+ String current = dir_access->get_current_dir();
+ while (!dir_access->dir_exists(current)) {
+ current = current.get_base_dir();
+ }
+ set_current_dir(current);
+
if (invalidated) {
update_file_list();
invalidated = false;
@@ -277,11 +284,17 @@ void EditorFileDialog::_post_popup() {
} else {
name = name.get_file() + "/";
}
-
- recent->add_item(name, folder);
- recent->set_item_metadata(recent->get_item_count() - 1, recentd[i]);
- recent->set_item_icon_modulate(recent->get_item_count() - 1, folder_color);
+ bool exists = dir_access->dir_exists(recentd[i]);
+ if (!exists) {
+ // Remove invalid directory from the list of Recent directories.
+ recentd.remove(i--);
+ } else {
+ recent->add_item(name, folder);
+ recent->set_item_metadata(recent->get_item_count() - 1, recentd[i]);
+ recent->set_item_icon_modulate(recent->get_item_count() - 1, folder_color);
+ }
}
+ EditorSettings::get_singleton()->set_recent_dirs(recentd);
local_history.clear();
local_history_pos = -1;
@@ -432,9 +445,12 @@ void EditorFileDialog::_action_pressed() {
}
}
+ // Add first extension of filter if no valid extension is found.
if (!valid) {
- exterr->popup_centered(Size2(250, 80) * EDSCALE);
- return;
+ int idx = filter->get_selected();
+ String flt = filters[idx].get_slice(";", 0);
+ String ext = flt.get_slice(",", 0).strip_edges().get_extension();
+ f += "." + ext;
}
if (dir_access->file_exists(f) && !disable_overwrite_warning) {
@@ -1670,10 +1686,6 @@ EditorFileDialog::EditorFileDialog() {
mkdirerr->set_text(TTR("Could not create folder."));
add_child(mkdirerr);
- exterr = memnew(AcceptDialog);
- exterr->set_text(TTR("Must use a valid extension."));
- add_child(exterr);
-
update_filters();
update_dir();
diff --git a/editor/editor_file_dialog.h b/editor/editor_file_dialog.h
index df5b41ae1d..947f617aa4 100644
--- a/editor/editor_file_dialog.h
+++ b/editor/editor_file_dialog.h
@@ -110,7 +110,6 @@ private:
LineEdit *file;
OptionButton *filter;
AcceptDialog *mkdirerr;
- AcceptDialog *exterr;
DirAccess *dir_access;
ConfirmationDialog *confirm_save;
DependencyRemoveDialog *remove_dialog;
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index 73562e0695..849b053357 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -2262,7 +2262,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
int scene_idx = (p_option == FILE_SAVE_SCENE) ? -1 : tab_closing;
Node *scene = editor_data.get_edited_scene_root(scene_idx);
- if (scene && scene->get_filename() != "") {
+ if (scene && scene->get_filename() != "" && FileAccess::exists(scene->get_filename())) {
if (scene_idx != editor_data.get_edited_scene()) {
_save_scene_with_preview(scene->get_filename(), scene_idx);
} else {
@@ -2307,11 +2307,12 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
}
if (scene->get_filename() != "") {
- file->set_current_path(scene->get_filename());
+ String path = scene->get_filename();
+ file->set_current_path(path);
if (extensions.size()) {
- String ext = scene->get_filename().get_extension().to_lower();
+ String ext = path.get_extension().to_lower();
if (extensions.find(ext) == nullptr) {
- file->set_current_path(scene->get_filename().replacen("." + ext, "." + extensions.front()->get()));
+ file->set_current_path(path.replacen("." + ext, "." + extensions.front()->get()));
}
}
} else {