1#if UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX
3using System.Collections.Generic;
5using System.Runtime.InteropServices;
6using System.Threading.Tasks;
10 public class StandaloneFileBrowserMac : IStandaloneFileBrowser<ItemWithStream>
12 private static Action<IList<ItemWithStream>> _openFileCb;
13 private static Action<IList<ItemWithStream>> _openFolderCb;
14 private static Action<ItemWithStream> _saveFileCb;
16 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
17 public delegate
void AsyncCallback(
string path);
19 [AOT.MonoPInvokeCallback(typeof(AsyncCallback))]
20 private static void openFileCb(
string result)
22 _openFileCb.Invoke(ParseResults(result));
25 [AOT.MonoPInvokeCallback(typeof(AsyncCallback))]
26 private static void openFolderCb(
string result)
28 _openFolderCb.Invoke(ParseResults(result));
31 [AOT.MonoPInvokeCallback(typeof(AsyncCallback))]
32 private static void saveFileCb(
string result)
34 _saveFileCb.Invoke(ParseResults(result)?[0]);
37 [DllImport(
"StandaloneFileBrowser")]
38 private static extern IntPtr
DialogOpenFilePanel(
string title,
string directory,
string extension,
bool multiselect);
39 [DllImport(
"StandaloneFileBrowser")]
40 private static extern void DialogOpenFilePanelAsync(
string title,
string directory,
string extension,
bool multiselect, AsyncCallback callback);
41 [DllImport(
"StandaloneFileBrowser")]
43 [DllImport(
"StandaloneFileBrowser")]
44 private static extern void DialogOpenFolderPanelAsync(
string title,
string directory,
bool multiselect, AsyncCallback callback);
45 [DllImport(
"StandaloneFileBrowser")]
46 private static extern IntPtr
DialogSaveFilePanel(
string title,
string directory,
string defaultName,
string extension);
47 [DllImport(
"StandaloneFileBrowser")]
48 private static extern void DialogSaveFilePanelAsync(
string title,
string directory,
string defaultName,
string extension, AsyncCallback callback);
50 public IList<ItemWithStream> OpenFilePanel(
string title,
string directory, ExtensionFilter[] extensions,
bool multiselect)
55 GetFilterFromFileExtensionList(extensions),
57 return ParseResults(paths);
60 public void OpenFilePanelAsync(
string title,
string directory, ExtensionFilter[] extensions,
bool multiselect, Action<IList<ItemWithStream>> cb)
66 GetFilterFromFileExtensionList(extensions),
71 public IList<ItemWithStream> OpenFolderPanel(
string title,
string directory,
bool multiselect)
77 return ParseResults(paths);
80 public void OpenFolderPanelAsync(
string title,
string directory,
bool multiselect, Action<IList<ItemWithStream>> cb)
90 public ItemWithStream SaveFilePanel(
string title,
string directory,
string defaultName, ExtensionFilter[] extensions)
96 GetFilterFromFileExtensionList(extensions)));
97 return new ItemWithStream
103 public void SaveFilePanelAsync(
string title,
string directory,
string defaultName, ExtensionFilter[] extensions, Action<ItemWithStream> cb)
110 GetFilterFromFileExtensionList(extensions),
114 private static string GetFilterFromFileExtensionList(ExtensionFilter[] extensions)
116 if (extensions ==
null)
121 var filterString =
"";
122 foreach (var filter
in extensions)
124 var hasFormat =
false;
125 filterString += filter.Name +
";";
126 foreach (var format
in filter.Extensions)
132 filterString += (format[0] ==
'.' ? format.Substring(1) : format);
137 filterString = filterString.Remove(filterString.Length - 1);
141 private static IList<ItemWithStream> ParseResults(
string paths)
145 var filenames = paths.Split((
char)28);
146 var result =
new ItemWithStream[filenames.Length];
147 for (var i = 0; i < filenames.Length; i++)
149 result[i] =
new ItemWithStream()
const char * DialogOpenFilePanel(const char *title, const char *directory, const char *filters, bool multiselect)
void DialogOpenFilePanelAsync(const char *title, const char *directory, const char *filters, bool multiselect, callbackFunc cb)
const char * DialogSaveFilePanel(const char *title, const char *directory, const char *defaultName, const char *filters)
void DialogSaveFilePanelAsync(const char *title, const char *directory, const char *defaultName, const char *filters, callbackFunc cb)
const char * DialogOpenFolderPanel(const char *title, const char *directory, bool multiselect)
void DialogOpenFolderPanelAsync(const char *title, const char *directory, bool multiselect, callbackFunc cb)