diff --git a/src/Avalonia.Native.OSX/SystemDialogs.mm b/src/Avalonia.Native.OSX/SystemDialogs.mm index 66f1cf4419..ff5c1bcd47 100644 --- a/src/Avalonia.Native.OSX/SystemDialogs.mm +++ b/src/Avalonia.Native.OSX/SystemDialogs.mm @@ -6,9 +6,75 @@ class SystemDialogs : public ComSingleObject 0) + { + void* strings[urls.count]; + + for(int i = 0; i < urls.count; i++) + { + auto url = [urls objectAtIndex:i]; + + auto string = [url absoluteString]; + string = [string substringFromIndex:7]; + + strings[i] = (void*)[string UTF8String]; + } + + events->OnCompleted((int)urls.count, &strings[0]); + + [panel orderOut:panel]; + + if(parentWindowHandle != nullptr) + { + auto windowBase = dynamic_cast(parentWindowHandle); + [windowBase->Window makeKeyAndOrderFront:windowBase->Window]; + } + + return; + } + } + + events->OnCompleted(0, nullptr); + + }; + + if(parentWindowHandle != nullptr) + { + auto windowBase = dynamic_cast(parentWindowHandle); + + [panel beginSheetModalForWindow:windowBase->Window completionHandler:handler]; + } + else + { + [panel beginWithCompletionHandler: handler]; + } + } } virtual void OpenFileDialog (IAvnWindow* parentWindowHandle, @@ -16,36 +82,90 @@ class SystemDialogs : public ComSingleObject(parentWindowHandle); + auto panel = [NSOpenPanel openPanel]; - [panel beginSheetModalForWindow:windowBase->Window completionHandler:^(NSModalResponse result) { - if(result == NSFileHandlingPanelOKButton) + panel.allowsMultipleSelection = allowMultiple; + + if(title != nullptr) + { + panel.title = [NSString stringWithUTF8String:title]; + } + + if(initialDirectory != nullptr) + { + auto directoryString = [NSString stringWithUTF8String:initialDirectory]; + panel.directoryURL = [NSURL fileURLWithPath:directoryString]; + } + + if(initialFile != nullptr) + { + panel.nameFieldStringValue = [NSString stringWithUTF8String:initialFile]; + } + + if(filters != nullptr) + { + auto filtersString = [NSString stringWithUTF8String:filters]; + + if(filtersString.length > 0) { + auto allowedTypes = [filtersString componentsSeparatedByString:@";"]; + panel.allowedFileTypes = allowedTypes; } - - events->OnCompleted(0, nullptr); - }]; - } - else - { - [panel beginWithCompletionHandler:^(NSModalResponse result) { + } + + auto handler = ^(NSModalResponse result) { if(result == NSFileHandlingPanelOKButton) { + auto urls = [panel URLs]; + if(urls.count > 0) + { + void* strings[urls.count]; + + for(int i = 0; i < urls.count; i++) + { + auto url = [urls objectAtIndex:i]; + + auto string = [url absoluteString]; + string = [string substringFromIndex:7]; + + strings[i] = (void*)[string UTF8String]; + } + + events->OnCompleted((int)urls.count, &strings[0]); + + [panel orderOut:panel]; + + if(parentWindowHandle != nullptr) + { + auto windowBase = dynamic_cast(parentWindowHandle); + [windowBase->Window makeKeyAndOrderFront:windowBase->Window]; + } + + return; + } } events->OnCompleted(0, nullptr); - }]; + + }; + + if(parentWindowHandle != nullptr) + { + auto windowBase = dynamic_cast(parentWindowHandle); + + [panel beginSheetModalForWindow:windowBase->Window completionHandler:handler]; + } + else + { + [panel beginWithCompletionHandler: handler]; + } } } diff --git a/src/headers/avalonia-native.h b/src/headers/avalonia-native.h index 92997c1d82..4775859395 100644 --- a/src/headers/avalonia-native.h +++ b/src/headers/avalonia-native.h @@ -163,14 +163,14 @@ AVNCOM(IAvnSystemDialogs, 0d) : virtual IUnknown bool allowMultiple, const char* title, const char* initialDirectory, - const char* intialFile, + const char* initialFile, const char* filters) = 0; virtual void SaveFileDialog (IAvnWindow* parentWindowHandle, IAvnSystemDialogEvents* events, const char* title, const char* initialDirectory, - const char* intialFile, + const char* initialFile, const char* filters) = 0; };