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

Use processed filter list for native dialogs. #99266

Merged
merged 1 commit into from
Nov 15, 2024
Merged
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
31 changes: 24 additions & 7 deletions editor/gui/editor_file_dialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ void EditorFileDialog::_native_popup() {
} else if (access == ACCESS_USERDATA) {
root = OS::get_singleton()->get_user_data_dir();
}
DisplayServer::get_singleton()->file_dialog_with_options_show(get_translated_title(), ProjectSettings::get_singleton()->globalize_path(dir->get_text()), root, file->get_text().get_file(), show_hidden_files, DisplayServer::FileDialogMode(mode), filters, _get_options(), callable_mp(this, &EditorFileDialog::_native_dialog_cb));
DisplayServer::get_singleton()->file_dialog_with_options_show(get_translated_title(), ProjectSettings::get_singleton()->globalize_path(dir->get_text()), root, file->get_text().get_file(), show_hidden_files, DisplayServer::FileDialogMode(mode), processed_filters, _get_options(), callable_mp(this, &EditorFileDialog::_native_dialog_cb));
}

void EditorFileDialog::popup(const Rect2i &p_rect) {
Expand Down Expand Up @@ -1148,37 +1148,54 @@ void EditorFileDialog::_filter_selected(int) {

void EditorFileDialog::update_filters() {
filter->clear();
processed_filters.clear();

if (filters.size() > 1) {
String all_filters;
String all_filters_full;

const int max_filters = 5;

for (int i = 0; i < MIN(max_filters, filters.size()); i++) {
String flt = filters[i].get_slice(";", 0).strip_edges();
String flt = filters[i].get_slicec(';', 0).strip_edges();
if (i > 0) {
all_filters += ", ";
}
all_filters += flt;
}
for (int i = 0; i < filters.size(); i++) {
String flt = filters[i].get_slicec(';', 0).strip_edges();
if (i > 0) {
all_filters_full += ",";
}
all_filters_full += flt;
}

if (max_filters < filters.size()) {
all_filters += ", ...";
}

filter->add_item(TTR("All Recognized") + " (" + all_filters + ")");
String f = TTR("All Recognized") + " (" + all_filters + ")";
filter->add_item(f);
processed_filters.push_back(all_filters_full + ";" + f);
}
for (int i = 0; i < filters.size(); i++) {
String flt = filters[i].get_slice(";", 0).strip_edges();
String flt = filters[i].get_slicec(';', 0).strip_edges();
String desc = filters[i].get_slice(";", 1).strip_edges();
if (desc.length()) {
filter->add_item(desc + " (" + flt + ")");
String f = desc + " (" + flt + ")";
filter->add_item(f);
processed_filters.push_back(flt + ";" + f);
} else {
filter->add_item("(" + flt + ")");
String f = "(" + flt + ")";
filter->add_item(f);
processed_filters.push_back(flt + ";" + f);
}
}

filter->add_item(TTR("All Files (*)"));
String f = TTR("All Files (*)");
filter->add_item(f);
processed_filters.push_back("*.*;" + f);
}

void EditorFileDialog::clear_filters() {
Expand Down
1 change: 1 addition & 0 deletions editor/gui/editor_file_dialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ class EditorFileDialog : public ConfirmationDialog {
void _push_history();

Vector<String> filters;
Vector<String> processed_filters;

bool previews_enabled = true;
bool preview_waiting = false;
Expand Down
4 changes: 2 additions & 2 deletions platform/linuxbsd/freedesktop_portal_desktop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -394,7 +394,7 @@ Error FreeDesktopPortalDesktop::file_dialog_show(DisplayServer::WindowID p_windo
} else {
if (flt == "*.*") {
filter_exts.push_back("*");
filter_names.push_back(RTR("All Files"));
filter_names.push_back(RTR("All Files") + " (*)");
} else {
filter_exts.push_back(flt);
filter_names.push_back(flt);
Expand All @@ -405,7 +405,7 @@ Error FreeDesktopPortalDesktop::file_dialog_show(DisplayServer::WindowID p_windo
}
if (filter_names.is_empty()) {
filter_exts.push_back("*");
filter_names.push_back(RTR("All Files"));
filter_names.push_back(RTR("All Files") + " (*)");
}

DBusError err;
Expand Down
2 changes: 1 addition & 1 deletion platform/macos/godot_open_save_delegate.mm
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ - (void)makeAccessoryView:(NSSavePanel *)p_panel filters:(const Vector<String> &
}

if ([type_filters count] > 0) {
NSString *name_str = [NSString stringWithUTF8String:((tokens.size() == 1) ? tokens[0] : vformat("%s (%s)", tokens[1].strip_edges(), tokens[0].strip_edges())).utf8().get_data()];
NSString *name_str = [NSString stringWithUTF8String:((tokens.size() == 1) ? tokens[0] : tokens[1].strip_edges()).utf8().get_data()];
[new_allowed_types addObject:type_filters];
[popup addItemWithTitle:name_str];
}
Expand Down
2 changes: 1 addition & 1 deletion platform/windows/display_server_windows.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -505,7 +505,7 @@ void DisplayServerWindows::_thread_fd_monitor(void *p_ud) {
}
if (filter_names.is_empty()) {
filter_exts.push_back(String("*.*").utf16());
filter_names.push_back(RTR("All Files").utf16());
filter_names.push_back((RTR("All Files") + " (*)").utf16());
}

Vector<COMDLG_FILTERSPEC> filters;
Expand Down
33 changes: 25 additions & 8 deletions scene/gui/file_dialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,9 @@ void FileDialog::_native_popup() {
root = OS::get_singleton()->get_user_data_dir();
}
if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_NATIVE_DIALOG_FILE_EXTRA)) {
DisplayServer::get_singleton()->file_dialog_with_options_show(get_translated_title(), ProjectSettings::get_singleton()->globalize_path(dir->get_text()), root, file->get_text().get_file(), show_hidden_files, DisplayServer::FileDialogMode(mode), filters, _get_options(), callable_mp(this, &FileDialog::_native_dialog_cb_with_options));
DisplayServer::get_singleton()->file_dialog_with_options_show(get_translated_title(), ProjectSettings::get_singleton()->globalize_path(dir->get_text()), root, file->get_text().get_file(), show_hidden_files, DisplayServer::FileDialogMode(mode), processed_filters, _get_options(), callable_mp(this, &FileDialog::_native_dialog_cb_with_options));
} else {
DisplayServer::get_singleton()->file_dialog_show(get_translated_title(), ProjectSettings::get_singleton()->globalize_path(dir->get_text()), file->get_text().get_file(), show_hidden_files, DisplayServer::FileDialogMode(mode), filters, callable_mp(this, &FileDialog::_native_dialog_cb));
DisplayServer::get_singleton()->file_dialog_show(get_translated_title(), ProjectSettings::get_singleton()->globalize_path(dir->get_text()), file->get_text().get_file(), show_hidden_files, DisplayServer::FileDialogMode(mode), processed_filters, callable_mp(this, &FileDialog::_native_dialog_cb));
}
}

Expand Down Expand Up @@ -851,37 +851,54 @@ void FileDialog::_filename_filter_selected() {

void FileDialog::update_filters() {
filter->clear();
processed_filters.clear();

if (filters.size() > 1) {
String all_filters;
String all_filters_full;

const int max_filters = 5;

for (int i = 0; i < MIN(max_filters, filters.size()); i++) {
String flt = filters[i].get_slice(";", 0).strip_edges();
String flt = filters[i].get_slicec(';', 0).strip_edges();
if (i > 0) {
all_filters += ", ";
}
all_filters += flt;
}
for (int i = 0; i < filters.size(); i++) {
String flt = filters[i].get_slicec(';', 0).strip_edges();
if (i > 0) {
all_filters_full += ",";
}
all_filters_full += flt;
}

if (max_filters < filters.size()) {
all_filters += ", ...";
}

filter->add_item(atr(ETR("All Recognized")) + " (" + all_filters + ")");
String f = atr(ETR("All Recognized")) + " (" + all_filters + ")";
filter->add_item(f);
processed_filters.push_back(all_filters_full + ";" + f);
}
for (int i = 0; i < filters.size(); i++) {
String flt = filters[i].get_slice(";", 0).strip_edges();
String flt = filters[i].get_slicec(';', 0).strip_edges();
String desc = filters[i].get_slice(";", 1).strip_edges();
if (desc.length()) {
filter->add_item(String(tr(desc)) + " (" + flt + ")");
String f = atr(desc) + " (" + flt + ")";
filter->add_item(f);
processed_filters.push_back(flt + ";" + f);
} else {
filter->add_item("(" + flt + ")");
String f = "(" + flt + ")";
filter->add_item(f);
processed_filters.push_back(flt + ";" + f);
}
}

filter->add_item(atr(ETR("All Files")) + " (*)");
String f = atr(ETR("All Files")) + " (*)";
filter->add_item(f);
processed_filters.push_back("*.*;" + f);
}

void FileDialog::clear_filename_filter() {
Expand Down
1 change: 1 addition & 0 deletions scene/gui/file_dialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ class FileDialog : public ConfirmationDialog {
Button *show_filename_filter_button = nullptr;

Vector<String> filters;
Vector<String> processed_filters;
String file_name_filter;
bool show_filename_filter = false;

Expand Down