Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

File Dialogs adjustments (v2) #13343

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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