1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 16:07:47 +00:00

FileSystemAccessServer: Implement FileTypeFilter to open_file()

This is the same functionality as in FilePicker. It allows the
specification of what file types are allowed.
This commit is contained in:
huttongrabiel 2023-03-17 11:53:43 -07:00 committed by Sam Atkins
parent 106ad6bb13
commit 6a5c561a41
5 changed files with 10 additions and 7 deletions

View file

@ -74,7 +74,7 @@ Result Client::request_file(GUI::Window* parent_window, DeprecatedString const&
return handle_promise(id); return handle_promise(id);
} }
Result Client::open_file(GUI::Window* parent_window, DeprecatedString const& window_title, StringView path, Core::File::OpenMode requested_access) Result Client::open_file(GUI::Window* parent_window, DeprecatedString const& window_title, StringView path, Core::File::OpenMode requested_access, Optional<Vector<GUI::FileTypeFilter>> const& allowed_file_types)
{ {
auto const id = get_new_id(); auto const id = get_new_id();
m_promises.set(id, PromiseAndWindow { { Core::Promise<Result>::construct() }, parent_window }); m_promises.set(id, PromiseAndWindow { { Core::Promise<Result>::construct() }, parent_window });
@ -89,7 +89,7 @@ Result Client::open_file(GUI::Window* parent_window, DeprecatedString const& win
GUI::ConnectionToWindowServer::the().remove_window_stealing_for_client(child_window_server_client_id, parent_window_id); GUI::ConnectionToWindowServer::the().remove_window_stealing_for_client(child_window_server_client_id, parent_window_id);
}); });
async_prompt_open_file(id, parent_window_server_client_id, parent_window_id, window_title, path, requested_access); async_prompt_open_file(id, parent_window_server_client_id, parent_window_id, window_title, path, requested_access, allowed_file_types);
return handle_promise(id); return handle_promise(id);
} }

View file

@ -14,6 +14,7 @@
#include <LibCore/File.h> #include <LibCore/File.h>
#include <LibCore/Promise.h> #include <LibCore/Promise.h>
#include <LibCore/StandardPaths.h> #include <LibCore/StandardPaths.h>
#include <LibGUI/FileTypeFilter.h>
#include <LibGUI/Window.h> #include <LibGUI/Window.h>
#include <LibIPC/ConnectionToServer.h> #include <LibIPC/ConnectionToServer.h>
@ -47,7 +48,7 @@ class Client final
public: public:
Result request_file_read_only_approved(GUI::Window* parent_window, DeprecatedString const& path); Result request_file_read_only_approved(GUI::Window* parent_window, DeprecatedString const& path);
Result request_file(GUI::Window* parent_window, DeprecatedString const& path, Core::File::OpenMode requested_access); Result request_file(GUI::Window* parent_window, DeprecatedString const& path, Core::File::OpenMode requested_access);
Result open_file(GUI::Window* parent_window, DeprecatedString const& window_title = {}, StringView path = Core::StandardPaths::home_directory(), Core::File::OpenMode requested_access = Core::File::OpenMode::Read); Result open_file(GUI::Window* parent_window, DeprecatedString const& window_title = {}, StringView path = Core::StandardPaths::home_directory(), Core::File::OpenMode requested_access = Core::File::OpenMode::Read, Optional<Vector<GUI::FileTypeFilter>> const& = {});
Result save_file(GUI::Window* parent_window, DeprecatedString const& name, DeprecatedString const ext, Core::File::OpenMode requested_access = Core::File::OpenMode::Write | Core::File::OpenMode::Truncate); Result save_file(GUI::Window* parent_window, DeprecatedString const& name, DeprecatedString const ext, Core::File::OpenMode requested_access = Core::File::OpenMode::Write | Core::File::OpenMode::Truncate);
static Client& the(); static Client& the();

View file

@ -112,14 +112,14 @@ void ConnectionFromClient::request_file(i32 request_id, i32 window_server_client
request_file_handler(request_id, window_server_client_id, parent_window_id, path, requested_access, ShouldPrompt::Yes); request_file_handler(request_id, window_server_client_id, parent_window_id, path, requested_access, ShouldPrompt::Yes);
} }
void ConnectionFromClient::prompt_open_file(i32 request_id, i32 window_server_client_id, i32 parent_window_id, DeprecatedString const& window_title, DeprecatedString const& path_to_view, Core::File::OpenMode requested_access) void ConnectionFromClient::prompt_open_file(i32 request_id, i32 window_server_client_id, i32 parent_window_id, DeprecatedString const& window_title, DeprecatedString const& path_to_view, Core::File::OpenMode requested_access, Optional<Vector<GUI::FileTypeFilter>> const& allowed_file_types)
{ {
auto relevant_permissions = requested_access & (Core::File::OpenMode::Read | Core::File::OpenMode::Write); auto relevant_permissions = requested_access & (Core::File::OpenMode::Read | Core::File::OpenMode::Write);
VERIFY(relevant_permissions != Core::File::OpenMode::NotOpen); VERIFY(relevant_permissions != Core::File::OpenMode::NotOpen);
auto main_window = create_dummy_child_window(window_server_client_id, parent_window_id); auto main_window = create_dummy_child_window(window_server_client_id, parent_window_id);
auto user_picked_file = GUI::FilePicker::get_open_filepath(main_window, window_title, path_to_view); auto user_picked_file = GUI::FilePicker::get_open_filepath(main_window, window_title, path_to_view, false, GUI::Dialog::ScreenPosition::CenterWithinParent, allowed_file_types);
prompt_helper(request_id, user_picked_file, requested_access); prompt_helper(request_id, user_picked_file, requested_access);
} }

View file

@ -10,6 +10,7 @@
#include <FileSystemAccessServer/FileSystemAccessClientEndpoint.h> #include <FileSystemAccessServer/FileSystemAccessClientEndpoint.h>
#include <FileSystemAccessServer/FileSystemAccessServerEndpoint.h> #include <FileSystemAccessServer/FileSystemAccessServerEndpoint.h>
#include <LibCore/Forward.h> #include <LibCore/Forward.h>
#include <LibGUI/FileTypeFilter.h>
#include <LibGUI/Forward.h> #include <LibGUI/Forward.h>
#include <LibIPC/ConnectionFromClient.h> #include <LibIPC/ConnectionFromClient.h>
@ -29,7 +30,7 @@ private:
virtual void request_file_read_only_approved(i32, i32, i32, DeprecatedString const&) override; virtual void request_file_read_only_approved(i32, i32, i32, DeprecatedString const&) override;
virtual void request_file(i32, i32, i32, DeprecatedString const&, Core::File::OpenMode) override; virtual void request_file(i32, i32, i32, DeprecatedString const&, Core::File::OpenMode) override;
virtual void prompt_open_file(i32, i32, i32, DeprecatedString const&, DeprecatedString const&, Core::File::OpenMode) override; virtual void prompt_open_file(i32, i32, i32, DeprecatedString const&, DeprecatedString const&, Core::File::OpenMode, Optional<Vector<GUI::FileTypeFilter>> const&) override;
virtual void prompt_save_file(i32, i32, i32, DeprecatedString const&, DeprecatedString const&, DeprecatedString const&, Core::File::OpenMode) override; virtual void prompt_save_file(i32, i32, i32, DeprecatedString const&, DeprecatedString const&, DeprecatedString const&, Core::File::OpenMode) override;
void prompt_helper(i32, Optional<DeprecatedString> const&, Core::File::OpenMode); void prompt_helper(i32, Optional<DeprecatedString> const&, Core::File::OpenMode);

View file

@ -1,10 +1,11 @@
#include <AK/URL.h> #include <AK/URL.h>
#include <LibGUI/FileTypeFilter.h>
endpoint FileSystemAccessServer endpoint FileSystemAccessServer
{ {
request_file_read_only_approved(i32 request_id, i32 window_server_client_id, i32 window_id, DeprecatedString path) =| request_file_read_only_approved(i32 request_id, i32 window_server_client_id, i32 window_id, DeprecatedString path) =|
request_file(i32 request_id, i32 window_server_client_id, i32 window_id, DeprecatedString path, Core::File::OpenMode requested_access) =| request_file(i32 request_id, i32 window_server_client_id, i32 window_id, DeprecatedString path, Core::File::OpenMode requested_access) =|
prompt_open_file(i32 request_id, i32 window_server_client_id, i32 window_id, DeprecatedString window_title, DeprecatedString path_to_view, Core::File::OpenMode requested_access) =| prompt_open_file(i32 request_id, i32 window_server_client_id, i32 window_id, DeprecatedString window_title, DeprecatedString path_to_view, Core::File::OpenMode requested_access, Optional<Vector<GUI::FileTypeFilter>> allowed_file_types) =|
prompt_save_file(i32 request_id, i32 window_server_client_id, i32 window_id, DeprecatedString title, DeprecatedString ext, DeprecatedString path_to_view, Core::File::OpenMode requested_access) =| prompt_save_file(i32 request_id, i32 window_server_client_id, i32 window_id, DeprecatedString title, DeprecatedString ext, DeprecatedString path_to_view, Core::File::OpenMode requested_access) =|
expose_window_server_client_id() => (i32 client_id) expose_window_server_client_id() => (i32 client_id)