From 9cb9c1fef11d1d25a9e1eff9b671b71b64a04469 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Sun, 23 Sep 2018 19:25:04 +0100 Subject: [PATCH] working dialog callbacks --- .../project.pbxproj | 4 ++ src/Avalonia.Native.OSX/SystemDialogs.mm | 36 +++++++++++++++ src/Avalonia.Native.OSX/common.h | 1 + src/Avalonia.Native.OSX/main.mm | 6 +++ src/Avalonia.Native/SystemDialogs.cs | 46 ++++++++++--------- 5 files changed, 71 insertions(+), 22 deletions(-) create mode 100644 src/Avalonia.Native.OSX/SystemDialogs.mm diff --git a/src/Avalonia.Native.OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj b/src/Avalonia.Native.OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj index 8338f55bde..2de6fac5ac 100644 --- a/src/Avalonia.Native.OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj +++ b/src/Avalonia.Native.OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 37C09D8821580FE4006A6758 /* SystemDialogs.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37C09D8721580FE4006A6758 /* SystemDialogs.mm */; }; AB00E4F72147CA920032A60A /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB00E4F62147CA920032A60A /* main.mm */; }; AB661C1E2148230F00291242 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB661C1D2148230F00291242 /* AppKit.framework */; }; AB661C202148286E00291242 /* window.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB661C1F2148286E00291242 /* window.mm */; }; @@ -15,6 +16,7 @@ /* Begin PBXFileReference section */ 379A4506214D0F6500CC143D /* headers */ = {isa = PBXFileReference; lastKnownFileType = folder; name = headers; path = ../headers; sourceTree = ""; }; + 37C09D8721580FE4006A6758 /* SystemDialogs.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = SystemDialogs.mm; sourceTree = ""; }; AB00E4F62147CA920032A60A /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; AB661C1D2148230F00291242 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; AB661C1F2148286E00291242 /* window.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = window.mm; sourceTree = ""; }; @@ -51,6 +53,7 @@ AB661C212148288600291242 /* common.h */, AB661C1F2148286E00291242 /* window.mm */, AB00E4F62147CA920032A60A /* main.mm */, + 37C09D8721580FE4006A6758 /* SystemDialogs.mm */, AB7A61F02147C815003C5833 /* Products */, AB661C1C2148230E00291242 /* Frameworks */, ); @@ -133,6 +136,7 @@ files = ( AB8F7D6B21482D7F0057DBA5 /* platformthreading.mm in Sources */, AB00E4F72147CA920032A60A /* main.mm in Sources */, + 37C09D8821580FE4006A6758 /* SystemDialogs.mm in Sources */, AB661C202148286E00291242 /* window.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/src/Avalonia.Native.OSX/SystemDialogs.mm b/src/Avalonia.Native.OSX/SystemDialogs.mm new file mode 100644 index 0000000000..7d77e4fa22 --- /dev/null +++ b/src/Avalonia.Native.OSX/SystemDialogs.mm @@ -0,0 +1,36 @@ +#include "common.h" + +class SystemDialogs : public ComSingleObject +{ + virtual void SelectFolderDialog (IAvnSystemDialogEvents* events, + const char* title, + const char* initialPath) + { + + } + + virtual void OpenFileDialog (IAvnSystemDialogEvents* events, + bool allowMultiple, + const char* title, + const char* initialDirectory, + const char* intialFile, + const char* filters) + { + events->OnCompleted(0, nullptr); + } + + virtual void SaveFileDialog (IAvnSystemDialogEvents* events, + const char* title, + const char* initialDirectory, + const char* intialFile, + const char* filters) + { + + } + +}; + +extern IAvnSystemDialogs* CreateSystemDialogs() +{ + return new SystemDialogs(); +} diff --git a/src/Avalonia.Native.OSX/common.h b/src/Avalonia.Native.OSX/common.h index 4ff72b8820..6b1a45969e 100644 --- a/src/Avalonia.Native.OSX/common.h +++ b/src/Avalonia.Native.OSX/common.h @@ -10,6 +10,7 @@ extern IAvnPlatformThreadingInterface* CreatePlatformThreading(); extern IAvnWindow* CreateAvnWindow(IAvnWindowEvents*events); extern IAvnPopup* CreateAvnPopup(IAvnWindowEvents*events); +extern IAvnSystemDialogs* CreateSystemDialogs(); extern NSPoint ToNSPoint (AvnPoint p); extern AvnPoint ToAvnPoint (NSPoint p); diff --git a/src/Avalonia.Native.OSX/main.mm b/src/Avalonia.Native.OSX/main.mm index 31c98edda8..23fc26d28e 100644 --- a/src/Avalonia.Native.OSX/main.mm +++ b/src/Avalonia.Native.OSX/main.mm @@ -94,6 +94,12 @@ public: *ppv = CreatePlatformThreading(); return S_OK; } + + virtual HRESULT CreateSystemDialogs(IAvnSystemDialogs** ppv) + { + *ppv = ::CreateSystemDialogs(); + return S_OK; + } }; extern "C" IAvaloniaNativeFactory* CreateAvaloniaNative() diff --git a/src/Avalonia.Native/SystemDialogs.cs b/src/Avalonia.Native/SystemDialogs.cs index 59d2731248..8a9464e79f 100644 --- a/src/Avalonia.Native/SystemDialogs.cs +++ b/src/Avalonia.Native/SystemDialogs.cs @@ -20,35 +20,37 @@ namespace Avalonia.Native public Task ShowFileDialogAsync(FileDialog dialog, IWindowImpl parent) { - var events = new SystemDialogEvents(); - - if(dialog is OpenFileDialog ofd) - { - _native.OpenFileDialog(events, ofd.AllowMultiple, - ofd.Title, - ofd.InitialDirectory, - ofd.InitialFileName, - string.Join(";", dialog.Filters.SelectMany(f => f.Extensions))); - } - else + using (var events = new SystemDialogEvents()) { - _native.SaveFileDialog(events, - dialog.Title, - dialog.InitialDirectory, - dialog.InitialFileName, - string.Join(";", dialog.Filters.SelectMany(f => f.Extensions))); - } + if (dialog is OpenFileDialog ofd) + { + _native.OpenFileDialog(events, ofd.AllowMultiple, + ofd.Title, + ofd.InitialDirectory, + ofd.InitialFileName, + string.Join(";", dialog.Filters.SelectMany(f => f.Extensions))); + } + else + { + _native.SaveFileDialog(events, + dialog.Title, + dialog.InitialDirectory, + dialog.InitialFileName, + string.Join(";", dialog.Filters.SelectMany(f => f.Extensions))); + } - return events.Task; + return events.Task; + } } public async Task ShowFolderDialogAsync(OpenFolderDialog dialog, IWindowImpl parent) { - var events = new SystemDialogEvents(); - - _native.SelectFolderDialog(events, dialog.Title, dialog.InitialDirectory); + using (var events = new SystemDialogEvents()) + { + _native.SelectFolderDialog(events, dialog.Title, dialog.InitialDirectory); - return (await events.Task).FirstOrDefault(); + return (await events.Task).FirstOrDefault(); + } } }