Use processed filter list for native dialogs.

This commit is contained in:
Pāvels Nadtočajevs 2024-11-15 08:43:07 +02:00
parent 673f396677
commit f5fad7592f
7 changed files with 55 additions and 19 deletions

View File

@ -65,7 +65,7 @@ void EditorFileDialog::_native_popup() {
} else if (access == ACCESS_USERDATA) { } else if (access == ACCESS_USERDATA) {
root = OS::get_singleton()->get_user_data_dir(); 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) { void EditorFileDialog::popup(const Rect2i &p_rect) {
@ -1148,37 +1148,54 @@ void EditorFileDialog::_filter_selected(int) {
void EditorFileDialog::update_filters() { void EditorFileDialog::update_filters() {
filter->clear(); filter->clear();
processed_filters.clear();
if (filters.size() > 1) { if (filters.size() > 1) {
String all_filters; String all_filters;
String all_filters_full;
const int max_filters = 5; const int max_filters = 5;
for (int i = 0; i < MIN(max_filters, filters.size()); i++) { 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) { if (i > 0) {
all_filters += ", "; all_filters += ", ";
} }
all_filters += flt; 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()) { if (max_filters < filters.size()) {
all_filters += ", ..."; 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++) { 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(); String desc = filters[i].get_slice(";", 1).strip_edges();
if (desc.length()) { if (desc.length()) {
filter->add_item(desc + " (" + flt + ")"); String f = desc + " (" + flt + ")";
filter->add_item(f);
processed_filters.push_back(flt + ";" + f);
} else { } 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() { void EditorFileDialog::clear_filters() {

View File

@ -145,6 +145,7 @@ private:
void _push_history(); void _push_history();
Vector<String> filters; Vector<String> filters;
Vector<String> processed_filters;
bool previews_enabled = true; bool previews_enabled = true;
bool preview_waiting = false; bool preview_waiting = false;

View File

@ -394,7 +394,7 @@ Error FreeDesktopPortalDesktop::file_dialog_show(DisplayServer::WindowID p_windo
} else { } else {
if (flt == "*.*") { if (flt == "*.*") {
filter_exts.push_back("*"); filter_exts.push_back("*");
filter_names.push_back(RTR("All Files")); filter_names.push_back(RTR("All Files") + " (*)");
} else { } else {
filter_exts.push_back(flt); filter_exts.push_back(flt);
filter_names.push_back(flt); filter_names.push_back(flt);
@ -405,7 +405,7 @@ Error FreeDesktopPortalDesktop::file_dialog_show(DisplayServer::WindowID p_windo
} }
if (filter_names.is_empty()) { if (filter_names.is_empty()) {
filter_exts.push_back("*"); filter_exts.push_back("*");
filter_names.push_back(RTR("All Files")); filter_names.push_back(RTR("All Files") + " (*)");
} }
DBusError err; DBusError err;

View File

@ -130,7 +130,7 @@
} }
if ([type_filters count] > 0) { 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]; [new_allowed_types addObject:type_filters];
[popup addItemWithTitle:name_str]; [popup addItemWithTitle:name_str];
} }

View File

@ -505,7 +505,7 @@ void DisplayServerWindows::_thread_fd_monitor(void *p_ud) {
} }
if (filter_names.is_empty()) { if (filter_names.is_empty()) {
filter_exts.push_back(String("*.*").utf16()); 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; Vector<COMDLG_FILTERSPEC> filters;

View File

@ -68,9 +68,9 @@ void FileDialog::_native_popup() {
root = OS::get_singleton()->get_user_data_dir(); root = OS::get_singleton()->get_user_data_dir();
} }
if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_NATIVE_DIALOG_FILE_EXTRA)) { 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 { } 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));
} }
} }
@ -851,37 +851,54 @@ void FileDialog::_filename_filter_selected() {
void FileDialog::update_filters() { void FileDialog::update_filters() {
filter->clear(); filter->clear();
processed_filters.clear();
if (filters.size() > 1) { if (filters.size() > 1) {
String all_filters; String all_filters;
String all_filters_full;
const int max_filters = 5; const int max_filters = 5;
for (int i = 0; i < MIN(max_filters, filters.size()); i++) { 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) { if (i > 0) {
all_filters += ", "; all_filters += ", ";
} }
all_filters += flt; 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()) { if (max_filters < filters.size()) {
all_filters += ", ..."; 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++) { 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(); String desc = filters[i].get_slice(";", 1).strip_edges();
if (desc.length()) { 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 { } 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() { void FileDialog::clear_filename_filter() {

View File

@ -101,6 +101,7 @@ private:
Button *show_filename_filter_button = nullptr; Button *show_filename_filter_button = nullptr;
Vector<String> filters; Vector<String> filters;
Vector<String> processed_filters;
String file_name_filter; String file_name_filter;
bool show_filename_filter = false; bool show_filename_filter = false;