Skip to content

Commit

Permalink
Some improvements to file/dir open/save dialogs:
Browse files Browse the repository at this point in the history
1. Removed "..", instead you now will see "Select Current Folder" and "Select this Folder" buttons.
2. Added "go to parent folder" (^) button to Save a File dialog.
3. Tree.cpp: "nothing_selected" signal has been re-made (previous implementation, merged in godotengine#13308, wasn't optimal in context of performance)
4. Fixed issue in Project Export dialog: MODE_SAVE_FILE wasn't set when you click "Export".
5. Now you can deselect items by clicking on empty space in Open a Directory dialog.
  • Loading branch information
Krakean committed Nov 27, 2017
1 parent d992eb1 commit 3e0ce97
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 15 deletions.
7 changes: 1 addition & 6 deletions editor/editor_file_dialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,7 @@ void EditorFileDialog::update_file_list() {

while ((item = dir_access->get_next(&isdir)) != "") {

if (item == ".")
if (item == "." || item == "..")
continue;

ishidden = dir_access->current_is_hidden();
Expand All @@ -599,11 +599,6 @@ void EditorFileDialog::update_file_list() {
}
}

if (dirs.find("..") == NULL) {
//may happen if lacking permissions
dirs.push_back("..");
}

dirs.sort_custom<NaturalNoCaseComparator>();
files.sort_custom<NaturalNoCaseComparator>();

Expand Down
1 change: 1 addition & 0 deletions editor/project_export.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -723,6 +723,7 @@ void ProjectExportDialog::_export_project() {
export_project->add_filter("*." + extension + " ; " + platform->get_name() + " Export");
}

export_project->set_mode(FileDialog::MODE_SAVE_FILE);
export_project->popup_centered_ratio();
}

Expand Down
57 changes: 51 additions & 6 deletions scene/gui/file_dialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ void FileDialog::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE) {

refresh->set_icon(get_icon("reload"));
dir_up->set_icon(get_icon("ArrowUp", "EditorIcons"));
}

if (p_what == NOTIFICATION_DRAW) {
Expand Down Expand Up @@ -122,6 +123,9 @@ void FileDialog::update_dir() {
if (drives->is_visible()) {
drives->select(dir_access->get_current_drive());
}

// Deselect any item, to make "Select Current Folder" button text by default.
deselect_items();
}

void FileDialog::_dir_entered(String p_dir) {
Expand Down Expand Up @@ -156,6 +160,10 @@ void FileDialog::_post_popup() {
tree->grab_focus();

set_process_unhandled_input(true);

// For open dir mode, deselect all items on file dialog open.
if (mode == MODE_OPEN_DIR)
deselect_items();
}

void FileDialog::_action_pressed() {
Expand Down Expand Up @@ -296,6 +304,37 @@ bool FileDialog::_is_open_should_be_disabled() {
return false;
}

void FileDialog::_go_up() {

dir_access->change_dir("..");
update_file_list();
update_dir();
}

void FileDialog::deselect_items() {

// Clear currently selected items in file manager.
tree->deselect_all();

// And change get_ok title.
if (!tree->is_anything_selected()) {
get_ok()->set_disabled(_is_open_should_be_disabled());

switch (mode) {

case MODE_OPEN_FILE:
case MODE_OPEN_FILES:
get_ok()->set_text(TTR("Open"));
get_ok()->set_disabled(false);
break;

case MODE_OPEN_DIR:
get_ok()->set_text(TTR("Select Current Folder"));
get_ok()->set_disabled(false);
break;
}
}
}
void FileDialog::_tree_selected() {

TreeItem *ti = tree->get_selected();
Expand All @@ -306,6 +345,8 @@ void FileDialog::_tree_selected() {
if (!d["dir"]) {

file->set_text(d["name"]);
} else if (mode == MODE_OPEN_DIR) {
get_ok()->set_text(TTR("Select this Folder"));
}

get_ok()->set_disabled(_is_open_should_be_disabled());
Expand Down Expand Up @@ -349,7 +390,7 @@ void FileDialog::update_file_list() {

while ((item = dir_access->get_next(&isdir)) != "") {

if (item == ".")
if (item == "." || item == "..")
continue;

ishidden = dir_access->current_is_hidden();
Expand All @@ -362,11 +403,6 @@ void FileDialog::update_file_list() {
}
}

if (dirs.find("..") == NULL) {
//may happen if lacking permissions
dirs.push_back("..");
}

dirs.sort_custom<NaturalNoCaseComparator>();
files.sort_custom<NaturalNoCaseComparator>();

Expand Down Expand Up @@ -742,6 +778,8 @@ void FileDialog::_bind_methods() {
ClassDB::bind_method(D_METHOD("_make_dir_confirm"), &FileDialog::_make_dir_confirm);
ClassDB::bind_method(D_METHOD("_update_file_list"), &FileDialog::update_file_list);
ClassDB::bind_method(D_METHOD("_update_dir"), &FileDialog::update_dir);
ClassDB::bind_method(D_METHOD("_go_up"), &FileDialog::_go_up);
ClassDB::bind_method(D_METHOD("deselect_items"), &FileDialog::deselect_items);

ClassDB::bind_method(D_METHOD("invalidate"), &FileDialog::invalidate);

Expand Down Expand Up @@ -789,6 +827,12 @@ FileDialog::FileDialog() {
set_title(RTR("Save a File"));

HBoxContainer *hbc = memnew(HBoxContainer);

dir_up = memnew(ToolButton);
dir_up->set_tooltip(TTR("Go to parent folder"));
hbc->add_child(dir_up);
dir_up->connect("pressed", this, "_go_up");

hbc->add_child(memnew(Label(RTR("Path:"))));
dir = memnew(LineEdit);
hbc->add_child(dir);
Expand Down Expand Up @@ -833,6 +877,7 @@ FileDialog::FileDialog() {
//cancel->connect("pressed", this,"_cancel_pressed");
tree->connect("cell_selected", this, "_tree_selected", varray(), CONNECT_DEFERRED);
tree->connect("item_activated", this, "_tree_db_selected", varray());
tree->connect("nothing_selected", this, "deselect_items");
dir->connect("text_entered", this, "_dir_entered");
file->connect("text_entered", this, "_file_entered");
filter->connect("item_selected", this, "_filter_selected");
Expand Down
5 changes: 5 additions & 0 deletions scene/gui/file_dialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@ class FileDialog : public ConfirmationDialog {
DirAccess *dir_access;
ConfirmationDialog *confirm_save;

ToolButton *dir_up;

ToolButton *refresh;

Vector<String> filters;
Expand All @@ -111,6 +113,7 @@ class FileDialog : public ConfirmationDialog {
void _filter_selected(int);
void _make_dir();
void _make_dir_confirm();
void _go_up();

void _update_drives();

Expand Down Expand Up @@ -156,6 +159,8 @@ class FileDialog : public ConfirmationDialog {

void invalidate();

void deselect_items();

FileDialog();
~FileDialog();
};
Expand Down
28 changes: 25 additions & 3 deletions scene/gui/tree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1923,9 +1923,6 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool
c = c->next;
item_h += child_h;
}

if (!c && !p_mod->get_shift() && !p_mod->get_control() && !p_mod->get_command() && !click_handled && p_button != BUTTON_RIGHT)
emit_signal("nothing_selected");
}
}

Expand Down Expand Up @@ -2602,6 +2599,12 @@ void Tree::_gui_input(Ref<InputEvent> p_event) {
if (drag_touching) {
set_physics_process(true);
}

if (b->get_button_index() == BUTTON_LEFT)
{
if (get_item_at_position(b->get_position()) == NULL && !b->get_shift() && !b->get_control() && !b->get_command())
emit_signal("nothing_selected");
}
}

} break;
Expand Down Expand Up @@ -3046,6 +3049,25 @@ void Tree::set_select_mode(SelectMode p_mode) {
select_mode = p_mode;
}

void Tree::deselect_all() {

TreeItem* item = get_next_selected(get_root());
while (item) {
item->deselect(selected_col);
item = get_next_selected(get_root());
}

selected_item = NULL;
selected_col = -1;

update();
}

bool Tree::is_anything_selected() {

return (selected_item != NULL);
}

void Tree::clear() {

if (blocked > 0) {
Expand Down
2 changes: 2 additions & 0 deletions scene/gui/tree.h
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,8 @@ class Tree : public Control {
int get_selected_column() const;
int get_pressed_button() const;
void set_select_mode(SelectMode p_mode);
void deselect_all();
bool is_anything_selected();

void set_columns(int p_columns);
int get_columns() const;
Expand Down

0 comments on commit 3e0ce97

Please sign in to comment.