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:
parent
f4e3701893
commit
6105dfdac9
10 changed files with 66 additions and 9 deletions
|
@ -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;
|
||||||
|
|
|
@ -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!
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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"));
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue