Skip to content

Commit 9c5648a

Browse files
committed
Fix GTK folder selection with filters.
1 parent 4af2709 commit 9c5648a

File tree

1 file changed

+27
-23
lines changed

1 file changed

+27
-23
lines changed

druid-shell/src/platform/gtk/dialog.rs

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -54,33 +54,37 @@ pub(crate) fn get_file_dialog_path(
5454

5555
dialog.set_select_multiple(options.multi_selection);
5656

57-
let mut found_default_filter = false;
58-
if let Some(file_types) = &options.allowed_types {
59-
for f in file_types {
60-
let filter = file_filter(f);
61-
dialog.add_filter(&filter);
62-
63-
if let Some(default) = &options.default_type {
64-
if default == f {
65-
// Note that we're providing the same FileFilter object to
66-
// add_filter and set_filter, because gtk checks them for
67-
// identity, not structural equality.
68-
dialog.set_filter(&filter);
69-
found_default_filter = true;
57+
// Don't set the filters when showing the folder selection dialog,
58+
// because then folder traversing won't work.
59+
if action != FileChooserAction::SelectFolder {
60+
let mut found_default_filter = false;
61+
if let Some(file_types) = &options.allowed_types {
62+
for f in file_types {
63+
let filter = file_filter(f);
64+
dialog.add_filter(&filter);
65+
66+
if let Some(default) = &options.default_type {
67+
if default == f {
68+
// Note that we're providing the same FileFilter object to
69+
// add_filter and set_filter, because gtk checks them for
70+
// identity, not structural equality.
71+
dialog.set_filter(&filter);
72+
found_default_filter = true;
73+
}
7074
}
7175
}
7276
}
73-
}
7477

75-
if let Some(default_file_type) = &options.default_type {
76-
if options.allowed_types.is_some() && !found_default_filter {
77-
// It's ok to set a default file filter without providing a list of
78-
// allowed filters, but it's not ok (or at least, doesn't work in gtk)
79-
// to provide a default filter that isn't in the (present) list
80-
// of allowed filters.
81-
log::warn!("default file type not found in allowed types");
82-
} else if !found_default_filter {
83-
dialog.set_filter(&file_filter(default_file_type));
78+
if let Some(default_file_type) = &options.default_type {
79+
if options.allowed_types.is_some() && !found_default_filter {
80+
// It's ok to set a default file filter without providing a list of
81+
// allowed filters, but it's not ok (or at least, doesn't work in gtk)
82+
// to provide a default filter that isn't in the (present) list
83+
// of allowed filters.
84+
log::warn!("default file type not found in allowed types");
85+
} else if !found_default_filter {
86+
dialog.set_filter(&file_filter(default_file_type));
87+
}
8488
}
8589
}
8690

0 commit comments

Comments
 (0)