From a346f14fb4457daa2539d940cf26d6cf5c11dce8 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Sun, 25 Feb 2024 14:12:21 -0500 Subject: [PATCH] Ladybird/AppKit: Implement the UI --- Ladybird/AppKit/UI/LadybirdWebView.mm | 37 ++++++++++++++++++++++++ Ladybird/AppKit/Utilities/Conversions.h | 2 ++ Ladybird/AppKit/Utilities/Conversions.mm | 6 ++++ 3 files changed, 45 insertions(+) diff --git a/Ladybird/AppKit/UI/LadybirdWebView.mm b/Ladybird/AppKit/UI/LadybirdWebView.mm index 5d7b5fc884..078700c3d4 100644 --- a/Ladybird/AppKit/UI/LadybirdWebView.mm +++ b/Ladybird/AppKit/UI/LadybirdWebView.mm @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -612,6 +613,42 @@ static void copy_data_to_clipboard(StringView data, NSPasteboardType pasteboard_ [panel makeKeyAndOrderFront:nil]; }; + m_web_view_bridge->on_request_file_picker = [self](auto allow_multiple_files) { + auto* panel = [NSOpenPanel openPanel]; + [panel setCanChooseFiles:YES]; + [panel setCanChooseDirectories:NO]; + + if (allow_multiple_files == Web::HTML::AllowMultipleFiles::Yes) { + [panel setAllowsMultipleSelection:YES]; + [panel setMessage:@"Select files"]; + } else { + [panel setAllowsMultipleSelection:NO]; + [panel setMessage:@"Select file"]; + } + + [panel beginSheetModalForWindow:[self window] + completionHandler:^(NSInteger result) { + Vector selected_files; + + auto create_selected_file = [&](NSString* ns_file_path) { + auto file_path = Ladybird::ns_string_to_byte_string(ns_file_path); + + if (auto file = Web::HTML::SelectedFile::from_file_path(file_path); file.is_error()) + warnln("Unable to open file {}: {}", file_path, file.error()); + else + selected_files.append(file.release_value()); + }; + + if (result == NSModalResponseOK) { + for (NSURL* url : [panel URLs]) { + create_selected_file([url path]); + } + } + + m_web_view_bridge->file_picker_closed(move(selected_files)); + }]; + }; + self.select_dropdown = [[NSMenu alloc] initWithTitle:@"Select Dropdown"]; [self.select_dropdown setDelegate:self]; diff --git a/Ladybird/AppKit/Utilities/Conversions.h b/Ladybird/AppKit/Utilities/Conversions.h index dffa347381..0823d53931 100644 --- a/Ladybird/AppKit/Utilities/Conversions.h +++ b/Ladybird/AppKit/Utilities/Conversions.h @@ -6,6 +6,7 @@ #pragma once +#include #include #include #include @@ -18,6 +19,7 @@ namespace Ladybird { String ns_string_to_string(NSString*); +ByteString ns_string_to_byte_string(NSString*); NSString* string_to_ns_string(StringView); NSData* string_to_ns_data(StringView); diff --git a/Ladybird/AppKit/Utilities/Conversions.mm b/Ladybird/AppKit/Utilities/Conversions.mm index 22f76d26ab..8f5f6026f1 100644 --- a/Ladybird/AppKit/Utilities/Conversions.mm +++ b/Ladybird/AppKit/Utilities/Conversions.mm @@ -14,6 +14,12 @@ String ns_string_to_string(NSString* string) return MUST(String::from_utf8({ utf8, strlen(utf8) })); } +ByteString ns_string_to_byte_string(NSString* string) +{ + auto const* utf8 = [string UTF8String]; + return ByteString(utf8, strlen(utf8)); +} + NSString* string_to_ns_string(StringView string) { return [[NSString alloc] initWithData:string_to_ns_data(string) encoding:NSUTF8StringEncoding];