From 92f15d33eee60d9dd735dc4456c516c07981c69b Mon Sep 17 00:00:00 2001 From: kobewi Date: Tue, 22 Apr 2025 15:32:34 +0200 Subject: [PATCH] Improve FileDialog options --- scene/gui/file_dialog.cpp | 37 +++++++++++++++++++++++++------------ scene/gui/file_dialog.h | 4 +++- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp index b69ad9c5fce..7a1b5b455ad 100644 --- a/scene/gui/file_dialog.cpp +++ b/scene/gui/file_dialog.cpp @@ -35,6 +35,7 @@ #include "core/os/keyboard.h" #include "scene/gui/box_container.h" #include "scene/gui/check_box.h" +#include "scene/gui/flow_container.h" #include "scene/gui/grid_container.h" #include "scene/gui/label.h" #include "scene/gui/line_edit.h" @@ -1386,32 +1387,39 @@ void FileDialog::_update_option_controls() { } options_dirty = false; - while (grid_options->get_child_count() > 0) { - Node *child = grid_options->get_child(0); - grid_options->remove_child(child); + while (flow_checkbox_options->get_child_count() > 0) { + Node *child = flow_checkbox_options->get_child(0); + flow_checkbox_options->remove_child(child); + child->queue_free(); + } + while (grid_select_options->get_child_count() > 0) { + Node *child = grid_select_options->get_child(0); + grid_select_options->remove_child(child); child->queue_free(); } selected_options.clear(); for (const FileDialog::Option &opt : options) { - Label *lbl = memnew(Label); - lbl->set_text(opt.name); - grid_options->add_child(lbl); if (opt.values.is_empty()) { CheckBox *cb = memnew(CheckBox); + cb->set_text(opt.name); cb->set_accessibility_name(opt.name); cb->set_pressed(opt.default_idx); - grid_options->add_child(cb); + flow_checkbox_options->add_child(cb); cb->connect(SceneStringName(toggled), callable_mp(this, &FileDialog::_option_changed_checkbox_toggled).bind(opt.name)); selected_options[opt.name] = (bool)opt.default_idx; } else { + Label *lbl = memnew(Label); + lbl->set_text(opt.name); + grid_select_options->add_child(lbl); + OptionButton *ob = memnew(OptionButton); for (const String &val : opt.values) { ob->add_item(val); } ob->set_accessibility_name(opt.name); ob->select(opt.default_idx); - grid_options->add_child(ob); + grid_select_options->add_child(ob); ob->connect(SceneStringName(item_selected), callable_mp(this, &FileDialog::_option_changed_item_selected).bind(opt.name)); selected_options[opt.name] = opt.default_idx; } @@ -1836,10 +1844,15 @@ FileDialog::FileDialog() { file_box->add_child(filter); filter->connect(SceneStringName(item_selected), callable_mp(this, &FileDialog::_filter_selected)); - grid_options = memnew(GridContainer); - grid_options->set_h_size_flags(Control::SIZE_SHRINK_CENTER); - grid_options->set_columns(2); - main_vbox->add_child(grid_options); + flow_checkbox_options = memnew(HFlowContainer); + flow_checkbox_options->set_h_size_flags(Control::SIZE_EXPAND_FILL); + flow_checkbox_options->set_alignment(FlowContainer::ALIGNMENT_CENTER); + main_vbox->add_child(flow_checkbox_options); + + grid_select_options = memnew(GridContainer); + grid_select_options->set_h_size_flags(Control::SIZE_SHRINK_CENTER); + grid_select_options->set_columns(2); + main_vbox->add_child(grid_select_options); confirm_save = memnew(ConfirmationDialog); add_child(confirm_save, false, INTERNAL_MODE_FRONT); diff --git a/scene/gui/file_dialog.h b/scene/gui/file_dialog.h index c9dfb9c9143..2858cb3f959 100644 --- a/scene/gui/file_dialog.h +++ b/scene/gui/file_dialog.h @@ -34,6 +34,7 @@ #include "scene/property_list_helper.h" class DirAccess; +class FlowContainer; class GridContainer; class HBoxContainer; class LineEdit; @@ -138,7 +139,8 @@ private: LineEdit *filename_edit = nullptr; OptionButton *filter = nullptr; - GridContainer *grid_options = nullptr; + FlowContainer *flow_checkbox_options = nullptr; + GridContainer *grid_select_options = nullptr; ConfirmationDialog *make_dir_dialog = nullptr; LineEdit *new_dir_name = nullptr;