Improve UX of drive letters

Namely, move the drive dropdown to just the left of the path text box and don't include the former
in the latter.

This improves the UX on Windows.

In the UNIX case, since its concept of drives is (ab)used to provide shortcuts to useful paths, its
dropdown is kept at the original location.
This commit is contained in:
Pedro J. Estébanez 2020-03-06 12:12:02 +01:00 committed by Pedro J. Estébanez
parent f4e3701893
commit 6105dfdac9
10 changed files with 66 additions and 9 deletions

View file

@ -66,6 +66,16 @@ int DirAccess::get_current_drive() {
return 0; return 0;
} }
bool DirAccess::drives_are_shortcuts() {
return false;
}
String DirAccess::get_current_dir_without_drive() {
return get_current_dir();
}
static Error _erase_recursive(DirAccess *da) { static Error _erase_recursive(DirAccess *da) {
List<String> dirs; List<String> dirs;

View file

@ -76,9 +76,11 @@ public:
virtual int get_drive_count() = 0; virtual int get_drive_count() = 0;
virtual String get_drive(int p_drive) = 0; virtual String get_drive(int p_drive) = 0;
virtual int get_current_drive(); virtual int get_current_drive();
virtual bool drives_are_shortcuts();
virtual Error change_dir(String p_dir) = 0; ///< can be relative or absolute, return false on success virtual Error change_dir(String p_dir) = 0; ///< can be relative or absolute, return false on success
virtual String get_current_dir() = 0; ///< return current dir location virtual String get_current_dir() = 0; ///< return current dir location
virtual String get_current_dir_without_drive();
virtual Error make_dir(String p_dir) = 0; virtual Error make_dir(String p_dir) = 0;
virtual Error make_dir_recursive(String p_dir); virtual Error make_dir_recursive(String p_dir);
virtual Error erase_contents_recursive(); //super dangerous, use with care! virtual Error erase_contents_recursive(); //super dangerous, use with care!

View file

@ -269,6 +269,11 @@ String DirAccessUnix::get_drive(int p_drive) {
return list[p_drive]; return list[p_drive];
} }
bool DirAccessUnix::drives_are_shortcuts() {
return true;
}
Error DirAccessUnix::make_dir(String p_dir) { Error DirAccessUnix::make_dir(String p_dir) {
GLOBAL_LOCK_FUNCTION GLOBAL_LOCK_FUNCTION

View file

@ -63,6 +63,7 @@ public:
virtual int get_drive_count(); virtual int get_drive_count();
virtual String get_drive(int p_drive); virtual String get_drive(int p_drive);
virtual bool drives_are_shortcuts();
virtual Error change_dir(String p_dir); ///< can be relative or absolute, return false on success virtual Error change_dir(String p_dir); ///< can be relative or absolute, return false on success
virtual String get_current_dir(); ///< return current dir location virtual String get_current_dir(); ///< return current dir location

View file

@ -206,6 +206,13 @@ String DirAccessWindows::get_current_dir() {
return current_dir; return current_dir;
} }
String DirAccessWindows::get_current_dir_without_drive() {
String dir = get_current_dir();
int p = current_dir.find(":");
return p != -1 ? dir.right(p + 1) : dir;
}
bool DirAccessWindows::file_exists(String p_file) { bool DirAccessWindows::file_exists(String p_file) {
GLOBAL_LOCK_FUNCTION GLOBAL_LOCK_FUNCTION

View file

@ -70,6 +70,7 @@ public:
virtual Error change_dir(String p_dir); ///< can be relative or absolute, return false on success virtual Error change_dir(String p_dir); ///< can be relative or absolute, return false on success
virtual String get_current_dir(); ///< return current dir location virtual String get_current_dir(); ///< return current dir location
virtual String get_current_dir_without_drive();
virtual bool file_exists(String p_file); virtual bool file_exists(String p_file);
virtual bool dir_exists(String p_dir); virtual bool dir_exists(String p_dir);

View file

@ -199,7 +199,10 @@ Vector<String> EditorFileDialog::get_selected_files() const {
void EditorFileDialog::update_dir() { void EditorFileDialog::update_dir() {
dir->set_text(dir_access->get_current_dir()); if (drives->is_visible()) {
drives->select(dir_access->get_current_drive());
}
dir->set_text(dir_access->get_current_dir_without_drive());
// Disable "Open" button only when selecting file(s) mode. // Disable "Open" button only when selecting file(s) mode.
get_ok()->set_disabled(_is_open_should_be_disabled()); get_ok()->set_disabled(_is_open_should_be_disabled());
@ -946,7 +949,7 @@ void EditorFileDialog::add_filter(const String &p_filter) {
String EditorFileDialog::get_current_dir() const { String EditorFileDialog::get_current_dir() const {
return dir->get_text(); return dir_access->get_current_dir();
} }
String EditorFileDialog::get_current_file() const { String EditorFileDialog::get_current_file() const {
@ -954,7 +957,7 @@ String EditorFileDialog::get_current_file() const {
} }
String EditorFileDialog::get_current_path() const { String EditorFileDialog::get_current_path() const {
return dir->get_text().plus_file(file->get_text()); return dir_access->get_current_dir().plus_file(file->get_text());
} }
void EditorFileDialog::set_current_dir(const String &p_dir) { void EditorFileDialog::set_current_dir(const String &p_dir) {
@ -1149,6 +1152,12 @@ void EditorFileDialog::_update_drives() {
drives->hide(); drives->hide();
} else { } else {
drives->clear(); drives->clear();
Node *dp = drives->get_parent();
if (dp) {
dp->remove_child(drives);
}
dp = dir_access->drives_are_shortcuts() ? shortcuts_container : drives_container;
dp->add_child(drives);
drives->show(); drives->show();
for (int i = 0; i < dir_access->get_drive_count(); i++) { for (int i = 0; i < dir_access->get_drive_count(); i++) {
@ -1543,6 +1552,12 @@ EditorFileDialog::EditorFileDialog() {
pathhb->add_child(memnew(Label(TTR("Path:")))); pathhb->add_child(memnew(Label(TTR("Path:"))));
drives_container = memnew(HBoxContainer);
pathhb->add_child(drives_container);
drives = memnew(OptionButton);
drives->connect("item_selected", this, "_select_drive");
dir = memnew(LineEdit); dir = memnew(LineEdit);
pathhb->add_child(dir); pathhb->add_child(dir);
dir->set_h_size_flags(SIZE_EXPAND_FILL); dir->set_h_size_flags(SIZE_EXPAND_FILL);
@ -1586,9 +1601,8 @@ EditorFileDialog::EditorFileDialog() {
mode_list->set_tooltip(TTR("View items as a list.")); mode_list->set_tooltip(TTR("View items as a list."));
pathhb->add_child(mode_list); pathhb->add_child(mode_list);
drives = memnew(OptionButton); shortcuts_container = memnew(HBoxContainer);
pathhb->add_child(drives); pathhb->add_child(shortcuts_container);
drives->connect("item_selected", this, "_select_drive");
makedir = memnew(Button); makedir = memnew(Button);
makedir->set_text(TTR("Create Folder")); makedir->set_text(TTR("Create Folder"));

View file

@ -100,6 +100,8 @@ private:
ToolButton *dir_next; ToolButton *dir_next;
ToolButton *dir_up; ToolButton *dir_up;
HBoxContainer *drives_container;
HBoxContainer *shortcuts_container;
OptionButton *drives; OptionButton *drives;
ItemList *item_list; ItemList *item_list;
PopupMenu *item_menu; PopupMenu *item_menu;

View file

@ -135,7 +135,8 @@ Vector<String> FileDialog::get_selected_files() const {
void FileDialog::update_dir() { void FileDialog::update_dir() {
dir->set_text(dir_access->get_current_dir()); dir->set_text(dir_access->get_current_dir_without_drive());
if (drives->is_visible()) { if (drives->is_visible()) {
drives->select(dir_access->get_current_drive()); drives->select(dir_access->get_current_drive());
} }
@ -789,6 +790,12 @@ void FileDialog::_update_drives() {
drives->hide(); drives->hide();
} else { } else {
drives->clear(); drives->clear();
Node *dp = drives->get_parent();
if (dp) {
dp->remove_child(drives);
}
dp = dir_access->drives_are_shortcuts() ? shortcuts_container : drives_container;
dp->add_child(drives);
drives->show(); drives->show();
for (int i = 0; i < dir_access->get_drive_count(); i++) { for (int i = 0; i < dir_access->get_drive_count(); i++) {
@ -902,11 +909,14 @@ FileDialog::FileDialog() {
hbc->add_child(dir_up); hbc->add_child(dir_up);
dir_up->connect("pressed", this, "_go_up"); dir_up->connect("pressed", this, "_go_up");
hbc->add_child(memnew(Label(RTR("Path:"))));
drives_container = memnew(HBoxContainer);
hbc->add_child(drives_container);
drives = memnew(OptionButton); drives = memnew(OptionButton);
hbc->add_child(drives);
drives->connect("item_selected", this, "_select_drive"); drives->connect("item_selected", this, "_select_drive");
hbc->add_child(memnew(Label(RTR("Path:"))));
dir = memnew(LineEdit); dir = memnew(LineEdit);
hbc->add_child(dir); hbc->add_child(dir);
dir->set_h_size_flags(SIZE_EXPAND_FILL); dir->set_h_size_flags(SIZE_EXPAND_FILL);
@ -923,6 +933,9 @@ FileDialog::FileDialog() {
show_hidden->connect("toggled", this, "set_show_hidden_files"); show_hidden->connect("toggled", this, "set_show_hidden_files");
hbc->add_child(show_hidden); hbc->add_child(show_hidden);
shortcuts_container = memnew(HBoxContainer);
hbc->add_child(shortcuts_container);
makedir = memnew(Button); makedir = memnew(Button);
makedir->set_text(RTR("Create Folder")); makedir->set_text(RTR("Create Folder"));
makedir->connect("pressed", this, "_make_dir"); makedir->connect("pressed", this, "_make_dir");

View file

@ -76,6 +76,8 @@ private:
VBoxContainer *vbox; VBoxContainer *vbox;
Mode mode; Mode mode;
LineEdit *dir; LineEdit *dir;
HBoxContainer *drives_container;
HBoxContainer *shortcuts_container;
OptionButton *drives; OptionButton *drives;
Tree *tree; Tree *tree;
HBoxContainer *file_box; HBoxContainer *file_box;