Skip to content

Commit 0fe406c

Browse files
committed
Merge pull request #106679 from KoBeWi/disable_files_in_file_dialog
Allow customizing FileDialog's features
2 parents 986cc40 + 4b1d5b5 commit 0fe406c

File tree

3 files changed

+171
-18
lines changed

3 files changed

+171
-18
lines changed

doc/classes/FileDialog.xml

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,21 @@
9696
[b]Note:[/b] This method does nothing on native file dialogs.
9797
</description>
9898
</method>
99+
<method name="is_customization_flag_enabled" qualifiers="const">
100+
<return type="bool" />
101+
<param index="0" name="flag" type="int" enum="FileDialog.Customization" />
102+
<description>
103+
Returns [code]true[/code] if the provided [param flag] is enabled.
104+
</description>
105+
</method>
106+
<method name="set_customization_flag_enabled">
107+
<return type="void" />
108+
<param index="0" name="flag" type="int" enum="FileDialog.Customization" />
109+
<param index="1" name="enabled" type="bool" />
110+
<description>
111+
Toggles the specified customization [param flag], allowing to customize features available in this [FileDialog]. See [enum Customization] for options.
112+
</description>
113+
</method>
99114
<method name="set_option_default">
100115
<return type="void" />
101116
<param index="0" name="option" type="int" />
@@ -140,9 +155,18 @@
140155
<member name="display_mode" type="int" setter="set_display_mode" getter="get_display_mode" enum="FileDialog.DisplayMode" default="0">
141156
Display mode of the dialog's file list.
142157
</member>
158+
<member name="favorites_enabled" type="bool" setter="set_customization_flag_enabled" getter="is_customization_flag_enabled" default="true">
159+
If [code]true[/code], shows the toggle favorite button and favorite list on the left side of the dialog.
160+
</member>
161+
<member name="file_filter_toggle_enabled" type="bool" setter="set_customization_flag_enabled" getter="is_customization_flag_enabled" default="true">
162+
If [code]true[/code], shows the toggle file filter button.
163+
</member>
143164
<member name="file_mode" type="int" setter="set_file_mode" getter="get_file_mode" enum="FileDialog.FileMode" default="4">
144165
The dialog's open or save mode, which affects the selection behavior.
145166
</member>
167+
<member name="file_sort_options_enabled" type="bool" setter="set_customization_flag_enabled" getter="is_customization_flag_enabled" default="true">
168+
If [code]true[/code], shows the file sorting options button.
169+
</member>
146170
<member name="filename_filter" type="String" setter="set_filename_filter" getter="get_filename_filter" default="&quot;&quot;">
147171
The filter for file names (case-insensitive). When set to a non-empty string, only files that contains the substring will be shown. [member filename_filter] can be edited by the user with the filter button at the top of the file dialog.
148172
See also [member filters], which should be used to restrict the file types that can be selected instead of [member filename_filter] which is meant to be set by the user.
@@ -151,12 +175,24 @@
151175
The available file type filters. Each filter string in the array should be formatted like this: [code]*.png,*.jpg,*.jpeg;Image Files;image/png,image/jpeg[/code]. The description text of the filter is optional and can be omitted. Both file extensions and MIME type should be always set.
152176
[b]Note:[/b] Embedded file dialog and Windows file dialog support only file extensions, while Android, Linux, and macOS file dialogs also support MIME types.
153177
</member>
178+
<member name="folder_creation_enabled" type="bool" setter="set_customization_flag_enabled" getter="is_customization_flag_enabled" default="true">
179+
If [code]true[/code], shows the button for creating new directories (when using [constant FILE_MODE_OPEN_DIR], [constant FILE_MODE_OPEN_ANY], or [constant FILE_MODE_SAVE_FILE]).
180+
</member>
181+
<member name="hidden_files_toggle_enabled" type="bool" setter="set_customization_flag_enabled" getter="is_customization_flag_enabled" default="true">
182+
If [code]true[/code], shows the toggle hidden files button.
183+
</member>
184+
<member name="layout_toggle_enabled" type="bool" setter="set_customization_flag_enabled" getter="is_customization_flag_enabled" default="true">
185+
If [code]true[/code], shows the layout switch buttons (list/thumbnails).
186+
</member>
154187
<member name="mode_overrides_title" type="bool" setter="set_mode_overrides_title" getter="is_mode_overriding_title" default="true">
155188
If [code]true[/code], changing the [member file_mode] property will set the window title accordingly (e.g. setting [member file_mode] to [constant FILE_MODE_OPEN_FILE] will change the window title to "Open a File").
156189
</member>
157190
<member name="option_count" type="int" setter="set_option_count" getter="get_option_count" default="0">
158191
The number of additional [OptionButton]s and [CheckBox]es in the dialog.
159192
</member>
193+
<member name="recent_list_enabled" type="bool" setter="set_customization_flag_enabled" getter="is_customization_flag_enabled" default="true">
194+
If [code]true[/code], shows the recent directories list on the left side of the dialog.
195+
</member>
160196
<member name="root_subfolder" type="String" setter="set_root_subfolder" getter="get_root_subfolder" default="&quot;&quot;">
161197
If non-empty, the given sub-folder will be "root" of this [FileDialog], i.e. user won't be able to go to its parent directory.
162198
[b]Note:[/b] This property is ignored by native file dialogs.
@@ -232,6 +268,34 @@
232268
<constant name="DISPLAY_LIST" value="1" enum="DisplayMode">
233269
The dialog displays files as a list of filenames.
234270
</constant>
271+
<constant name="CUSTOMIZATION_HIDDEN_FILES" value="0" enum="Customization">
272+
Toggles visibility of the favorite button, and the favorite list on the left side of the dialog.
273+
Equivalent to [member hidden_files_toggle_enabled].
274+
</constant>
275+
<constant name="CUSTOMIZATION_CREATE_FOLDER" value="1" enum="Customization">
276+
If enabled, shows the button for creating new directories (when using [constant FILE_MODE_OPEN_DIR], [constant FILE_MODE_OPEN_ANY], or [constant FILE_MODE_SAVE_FILE]).
277+
Equivalent to [member folder_creation_enabled].
278+
</constant>
279+
<constant name="CUSTOMIZATION_FILE_FILTER" value="2" enum="Customization">
280+
If enabled, shows the toggle file filter button.
281+
Equivalent to [member file_filter_toggle_enabled].
282+
</constant>
283+
<constant name="CUSTOMIZATION_FILE_SORT" value="3" enum="Customization">
284+
If enabled, shows the file sorting options button.
285+
Equivalent to [member file_sort_options_enabled].
286+
</constant>
287+
<constant name="CUSTOMIZATION_FAVORITES" value="4" enum="Customization">
288+
If enabled, shows the toggle favorite button and favorite list on the left side of the dialog.
289+
Equivalent to [member favorites_enabled].
290+
</constant>
291+
<constant name="CUSTOMIZATION_RECENT" value="5" enum="Customization">
292+
If enabled, shows the recent directories list on the left side of the dialog.
293+
Equivalent to [member recent_list_enabled].
294+
</constant>
295+
<constant name="CUSTOMIZATION_LAYOUT" value="6" enum="Customization">
296+
If enabled, shows the layout switch buttons (list/thumbnails).
297+
Equivalent to [member layout_toggle_enabled].
298+
</constant>
235299
</constants>
236300
<theme_items>
237301
<theme_item name="file_disabled_color" data_type="color" type="Color" default="Color(1, 1, 1, 0.25)">

scene/gui/file_dialog.cpp

Lines changed: 81 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,9 @@ void FileDialog::_notification(int p_what) {
260260
} break;
261261

262262
case NOTIFICATION_THEME_CHANGED: {
263+
favorite_list->set_custom_minimum_size(Vector2(128 * get_theme_default_base_scale(), 0));
264+
recent_list->set_custom_minimum_size(Vector2(128 * get_theme_default_base_scale(), 0));
265+
263266
if (main_vbox->is_layout_rtl()) {
264267
_setup_button(dir_prev, theme_cache.forward_folder);
265268
_setup_button(dir_next, theme_cache.back_folder);
@@ -1104,6 +1107,19 @@ void FileDialog::update_filters() {
11041107
processed_filters.push_back("*.*;" + f + ";application/octet-stream");
11051108
}
11061109

1110+
void FileDialog::update_customization() {
1111+
_update_make_dir_visible();
1112+
show_hidden->set_visible(customization_flags[CUSTOMIZATION_HIDDEN_FILES]);
1113+
layout_container->set_visible(customization_flags[CUSTOMIZATION_LAYOUT]);
1114+
layout_separator->set_visible(customization_flags[CUSTOMIZATION_FILE_FILTER] || customization_flags[CUSTOMIZATION_FILE_SORT]);
1115+
show_filename_filter_button->set_visible(customization_flags[CUSTOMIZATION_FILE_FILTER]);
1116+
file_sort_button->set_visible(customization_flags[CUSTOMIZATION_FILE_SORT]);
1117+
show_hidden_separator->set_visible(customization_flags[CUSTOMIZATION_HIDDEN_FILES] && (customization_flags[CUSTOMIZATION_LAYOUT] || customization_flags[CUSTOMIZATION_FILE_FILTER] || customization_flags[CUSTOMIZATION_FILE_SORT]));
1118+
favorite_button->set_visible(customization_flags[CUSTOMIZATION_FAVORITES]);
1119+
favorite_vbox->set_visible(customization_flags[CUSTOMIZATION_FAVORITES]);
1120+
recent_vbox->set_visible(customization_flags[CUSTOMIZATION_RECENT]);
1121+
}
1122+
11071123
void FileDialog::clear_filename_filter() {
11081124
set_filename_filter("");
11091125
update_filename_filter_gui();
@@ -1256,21 +1272,18 @@ void FileDialog::set_file_mode(FileMode p_mode) {
12561272
if (mode_overrides_title) {
12571273
set_title(ETR("Open a File"));
12581274
}
1259-
make_dir_button->hide();
12601275
break;
12611276
case FILE_MODE_OPEN_FILES:
12621277
set_default_ok_text(ETR("Open"));
12631278
if (mode_overrides_title) {
12641279
set_title(ETR("Open File(s)"));
12651280
}
1266-
make_dir_button->hide();
12671281
break;
12681282
case FILE_MODE_OPEN_DIR:
12691283
set_default_ok_text(ETR("Select Current Folder"));
12701284
if (mode_overrides_title) {
12711285
set_title(ETR("Open a Directory"));
12721286
}
1273-
make_dir_button->show();
12741287
break;
12751288
case FILE_MODE_OPEN_ANY:
12761289
set_default_ok_text(ETR("Open"));
@@ -1284,9 +1297,9 @@ void FileDialog::set_file_mode(FileMode p_mode) {
12841297
if (mode_overrides_title) {
12851298
set_title(ETR("Save a File"));
12861299
}
1287-
make_dir_button->show();
12881300
break;
12891301
}
1302+
_update_make_dir_visible();
12901303

12911304
if (mode == FILE_MODE_OPEN_FILES) {
12921305
file_list->set_select_mode(ItemList::SELECT_MULTI);
@@ -1322,6 +1335,20 @@ FileDialog::DisplayMode FileDialog::get_display_mode() const {
13221335
return display_mode;
13231336
}
13241337

1338+
void FileDialog::set_customization_flag_enabled(Customization p_flag, bool p_enabled) {
1339+
ERR_FAIL_INDEX(p_flag, CUSTOMIZATION_MAX);
1340+
if (customization_flags[p_flag] == p_enabled) {
1341+
return;
1342+
}
1343+
customization_flags[p_flag] = p_enabled;
1344+
update_customization();
1345+
}
1346+
1347+
bool FileDialog::is_customization_flag_enabled(Customization p_flag) const {
1348+
ERR_FAIL_INDEX_V(p_flag, CUSTOMIZATION_MAX, false);
1349+
return customization_flags[p_flag];
1350+
}
1351+
13251352
void FileDialog::set_access(Access p_access) {
13261353
ERR_FAIL_INDEX(p_access, 3);
13271354
if (access == p_access) {
@@ -1383,6 +1410,10 @@ void FileDialog::_setup_button(Button *p_button, const Ref<Texture2D> &p_icon) {
13831410
p_button->end_bulk_theme_override();
13841411
}
13851412

1413+
void FileDialog::_update_make_dir_visible() {
1414+
make_dir_container->set_visible(customization_flags[CUSTOMIZATION_CREATE_FOLDER] && mode != FILE_MODE_OPEN_FILE && mode != FILE_MODE_OPEN_FILES);
1415+
}
1416+
13861417
FileDialog::Access FileDialog::get_access() const {
13871418
return access;
13881419
}
@@ -1886,6 +1917,8 @@ void FileDialog::_bind_methods() {
18861917
ClassDB::bind_method(D_METHOD("is_showing_hidden_files"), &FileDialog::is_showing_hidden_files);
18871918
ClassDB::bind_method(D_METHOD("set_use_native_dialog", "native"), &FileDialog::set_use_native_dialog);
18881919
ClassDB::bind_method(D_METHOD("get_use_native_dialog"), &FileDialog::get_use_native_dialog);
1920+
ClassDB::bind_method(D_METHOD("set_customization_flag_enabled", "flag", "enabled"), &FileDialog::set_customization_flag_enabled);
1921+
ClassDB::bind_method(D_METHOD("is_customization_flag_enabled", "flag"), &FileDialog::is_customization_flag_enabled);
18891922
ClassDB::bind_method(D_METHOD("deselect_all"), &FileDialog::deselect_all);
18901923

18911924
ClassDB::bind_method(D_METHOD("invalidate"), &FileDialog::invalidate);
@@ -1897,9 +1930,20 @@ void FileDialog::_bind_methods() {
18971930
ADD_PROPERTY(PropertyInfo(Variant::STRING, "root_subfolder"), "set_root_subfolder", "get_root_subfolder");
18981931
ADD_PROPERTY(PropertyInfo(Variant::PACKED_STRING_ARRAY, "filters"), "set_filters", "get_filters");
18991932
ADD_PROPERTY(PropertyInfo(Variant::STRING, "filename_filter"), "set_filename_filter", "get_filename_filter");
1900-
ADD_ARRAY_COUNT("Options", "option_count", "set_option_count", "get_option_count", "option_");
19011933
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "show_hidden_files"), "set_show_hidden_files", "is_showing_hidden_files");
19021934
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_native_dialog"), "set_use_native_dialog", "get_use_native_dialog");
1935+
1936+
ADD_ARRAY_COUNT("Options", "option_count", "set_option_count", "get_option_count", "option_");
1937+
1938+
ADD_GROUP("Customization", "");
1939+
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "hidden_files_toggle_enabled"), "set_customization_flag_enabled", "is_customization_flag_enabled", CUSTOMIZATION_HIDDEN_FILES);
1940+
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "file_filter_toggle_enabled"), "set_customization_flag_enabled", "is_customization_flag_enabled", CUSTOMIZATION_FILE_FILTER);
1941+
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "file_sort_options_enabled"), "set_customization_flag_enabled", "is_customization_flag_enabled", CUSTOMIZATION_FILE_SORT);
1942+
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "folder_creation_enabled"), "set_customization_flag_enabled", "is_customization_flag_enabled", CUSTOMIZATION_CREATE_FOLDER);
1943+
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "favorites_enabled"), "set_customization_flag_enabled", "is_customization_flag_enabled", CUSTOMIZATION_FAVORITES);
1944+
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "recent_list_enabled"), "set_customization_flag_enabled", "is_customization_flag_enabled", CUSTOMIZATION_RECENT);
1945+
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "layout_toggle_enabled"), "set_customization_flag_enabled", "is_customization_flag_enabled", CUSTOMIZATION_LAYOUT);
1946+
19031947
ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_dir", PROPERTY_HINT_DIR, "", PROPERTY_USAGE_NONE), "set_current_dir", "get_current_dir");
19041948
ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_file", PROPERTY_HINT_FILE, "*", PROPERTY_USAGE_NONE), "set_current_file", "get_current_file");
19051949
ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_path", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_current_path", "get_current_path");
@@ -1922,8 +1966,15 @@ void FileDialog::_bind_methods() {
19221966
BIND_ENUM_CONSTANT(DISPLAY_THUMBNAILS);
19231967
BIND_ENUM_CONSTANT(DISPLAY_LIST);
19241968

1925-
BIND_THEME_ITEM(Theme::DATA_TYPE_CONSTANT, FileDialog, thumbnail_size);
1969+
BIND_ENUM_CONSTANT(CUSTOMIZATION_HIDDEN_FILES);
1970+
BIND_ENUM_CONSTANT(CUSTOMIZATION_CREATE_FOLDER);
1971+
BIND_ENUM_CONSTANT(CUSTOMIZATION_FILE_FILTER);
1972+
BIND_ENUM_CONSTANT(CUSTOMIZATION_FILE_SORT);
1973+
BIND_ENUM_CONSTANT(CUSTOMIZATION_FAVORITES);
1974+
BIND_ENUM_CONSTANT(CUSTOMIZATION_RECENT);
1975+
BIND_ENUM_CONSTANT(CUSTOMIZATION_LAYOUT);
19261976

1977+
BIND_THEME_ITEM(Theme::DATA_TYPE_CONSTANT, FileDialog, thumbnail_size);
19271978
BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, FileDialog, parent_folder);
19281979
BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, FileDialog, forward_folder);
19291980
BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, FileDialog, back_folder);
@@ -2030,6 +2081,10 @@ FileDialog::FileDialog() {
20302081
set_size(Size2(640, 360));
20312082
set_default_ok_text(ETR("Save")); // Default mode text.
20322083

2084+
for (int i = 0; i < CUSTOMIZATION_MAX; i++) {
2085+
customization_flags[i] = true;
2086+
}
2087+
20332088
show_hidden_files = default_show_hidden_files;
20342089
dir_access = DirAccess::create(DirAccess::ACCESS_RESOURCES);
20352090

@@ -2097,13 +2152,16 @@ FileDialog::FileDialog() {
20972152
top_toolbar->add_child(favorite_button);
20982153
favorite_button->connect(SceneStringName(pressed), callable_mp(this, &FileDialog::_favorite_pressed));
20992154

2100-
top_toolbar->add_child(memnew(VSeparator));
2155+
make_dir_container = memnew(HBoxContainer);
2156+
top_toolbar->add_child(make_dir_container);
2157+
2158+
make_dir_container->add_child(memnew(VSeparator));
21012159

21022160
make_dir_button = memnew(Button);
21032161
make_dir_button->set_theme_type_variation(SceneStringName(FlatButton));
21042162
make_dir_button->set_accessibility_name(ETR("Create New Folder"));
21052163
make_dir_button->set_tooltip_text(ETR("Create a new folder."));
2106-
top_toolbar->add_child(make_dir_button);
2164+
make_dir_container->add_child(make_dir_button);
21072165
make_dir_button->connect(SceneStringName(pressed), callable_mp(this, &FileDialog::_make_dir));
21082166

21092167
HSplitContainer *main_split = memnew(HSplitContainer);
@@ -2114,12 +2172,12 @@ FileDialog::FileDialog() {
21142172
VSplitContainer *fav_split = memnew(VSplitContainer);
21152173
main_split->add_child(fav_split);
21162174

2117-
VBoxContainer *fav_vbox = memnew(VBoxContainer);
2118-
fav_vbox->set_v_size_flags(Control::SIZE_EXPAND_FILL);
2119-
fav_split->add_child(fav_vbox);
2175+
favorite_vbox = memnew(VBoxContainer);
2176+
favorite_vbox->set_v_size_flags(Control::SIZE_EXPAND_FILL);
2177+
fav_split->add_child(favorite_vbox);
21202178

21212179
HBoxContainer *fav_hbox = memnew(HBoxContainer);
2122-
fav_vbox->add_child(fav_hbox);
2180+
favorite_vbox->add_child(fav_hbox);
21232181

21242182
{
21252183
Label *label = memnew(Label(ETR("Favorites:")));
@@ -2141,10 +2199,10 @@ FileDialog::FileDialog() {
21412199
favorite_list->set_v_size_flags(Control::SIZE_EXPAND_FILL);
21422200
favorite_list->set_auto_translate_mode(AUTO_TRANSLATE_MODE_DISABLED);
21432201
favorite_list->set_accessibility_name(ETR("Favorites"));
2144-
fav_vbox->add_child(favorite_list);
2202+
favorite_vbox->add_child(favorite_list);
21452203
favorite_list->connect(SceneStringName(item_selected), callable_mp(this, &FileDialog::_favorite_selected));
21462204

2147-
VBoxContainer *recent_vbox = memnew(VBoxContainer);
2205+
recent_vbox = memnew(VBoxContainer);
21482206
recent_vbox->set_v_size_flags(Control::SIZE_EXPAND_FILL);
21492207
fav_split->add_child(recent_vbox);
21502208

@@ -2183,7 +2241,11 @@ FileDialog::FileDialog() {
21832241
lower_toolbar->add_child(show_hidden);
21842242
show_hidden->connect(SceneStringName(toggled), callable_mp(this, &FileDialog::set_show_hidden_files));
21852243

2186-
lower_toolbar->add_child(memnew(VSeparator));
2244+
show_hidden_separator = memnew(VSeparator);
2245+
lower_toolbar->add_child(show_hidden_separator);
2246+
2247+
layout_container = memnew(HBoxContainer);
2248+
lower_toolbar->add_child(layout_container);
21872249

21882250
Ref<ButtonGroup> view_mode_group;
21892251
view_mode_group.instantiate();
@@ -2195,7 +2257,7 @@ FileDialog::FileDialog() {
21952257
thumbnail_mode_button->set_theme_type_variation(SceneStringName(FlatButton));
21962258
thumbnail_mode_button->set_accessibility_name(ETR("View as Thumbnails"));
21972259
thumbnail_mode_button->set_tooltip_text(ETR("View items as a grid of thumbnails."));
2198-
lower_toolbar->add_child(thumbnail_mode_button);
2260+
layout_container->add_child(thumbnail_mode_button);
21992261
thumbnail_mode_button->connect(SceneStringName(pressed), callable_mp(this, &FileDialog::set_display_mode).bind(DISPLAY_THUMBNAILS));
22002262

22012263
list_mode_button = memnew(Button);
@@ -2204,10 +2266,11 @@ FileDialog::FileDialog() {
22042266
list_mode_button->set_theme_type_variation(SceneStringName(FlatButton));
22052267
list_mode_button->set_accessibility_name(ETR("View as List"));
22062268
list_mode_button->set_tooltip_text(ETR("View items as a list."));
2207-
lower_toolbar->add_child(list_mode_button);
2269+
layout_container->add_child(list_mode_button);
22082270
list_mode_button->connect(SceneStringName(pressed), callable_mp(this, &FileDialog::set_display_mode).bind(DISPLAY_LIST));
22092271

2210-
lower_toolbar->add_child(memnew(VSeparator));
2272+
layout_separator = memnew(VSeparator);
2273+
layout_container->add_child(layout_separator);
22112274

22122275
show_filename_filter_button = memnew(Button);
22132276
show_filename_filter_button->set_theme_type_variation(SceneStringName(FlatButton));

0 commit comments

Comments
 (0)