From 764286676ff2a5e24f65ff5a8abf66b7060a6654 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Thu, 14 Mar 2024 19:19:11 -0400 Subject: [PATCH] Browser: Implement file type filtering --- Userland/Applications/Browser/Tab.cpp | 41 +++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/Userland/Applications/Browser/Tab.cpp b/Userland/Applications/Browser/Tab.cpp index 6db7c37851..882233ac98 100644 --- a/Userland/Applications/Browser/Tab.cpp +++ b/Userland/Applications/Browser/Tab.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -32,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -556,7 +558,7 @@ Tab::Tab(BrowserWindow& window) m_dialog = nullptr; }; - view().on_request_file_picker = [this](auto const&, auto allow_multiple_files) { + view().on_request_file_picker = [this](auto const& accepted_file_types, auto allow_multiple_files) { // FIXME: GUI::FilePicker does not allow selecting multiple files at once. (void)allow_multiple_files; @@ -570,7 +572,42 @@ Tab::Tab(BrowserWindow& window) selected_files.append(file.release_value()); }; - if (auto path = GUI::FilePicker::get_open_filepath(&window, "Select file"); path.has_value()) + Vector accepted_file_filters; + + for (auto const& filter : accepted_file_types.filters) { + filter.visit( + [&](Web::HTML::FileFilter::FileType type) { + switch (type) { + case Web::HTML::FileFilter::FileType::Audio: + accepted_file_filters.append(GUI::FileTypeFilter::audio_files()); + break; + case Web::HTML::FileFilter::FileType::Image: + accepted_file_filters.append(GUI::FileTypeFilter::image_files()); + break; + case Web::HTML::FileFilter::FileType::Video: + accepted_file_filters.append(GUI::FileTypeFilter::video_files()); + break; + } + }, + [&](Web::HTML::FileFilter::MimeType const& filter) { + if (auto mime_type = Core::get_mime_type_data(filter.value); mime_type.has_value()) { + Vector extensions; + extensions.ensure_capacity(mime_type->common_extensions.size()); + + for (auto extension : mime_type->common_extensions) + extensions.append(extension); + + accepted_file_filters.append({ mime_type->description, move(extensions) }); + } + }, + [&](Web::HTML::FileFilter::Extension const& filter) { + accepted_file_filters.empend(ByteString {}, Vector { filter.value.to_byte_string() }); + }); + } + + accepted_file_filters.size() > 1 ? accepted_file_filters.prepend(GUI::FileTypeFilter::all_files()) : accepted_file_filters.append(GUI::FileTypeFilter::all_files()); + + if (auto path = GUI::FilePicker::get_open_filepath(&window, "Select file", Core::StandardPaths::home_directory(), false, GUI::Dialog::ScreenPosition::CenterWithinParent, move(accepted_file_filters)); path.has_value()) create_selected_file(path.release_value()); view().file_picker_closed(std::move(selected_files));