1#if UNITY_IOS && !UNITY_EDITOR
3using System.Collections.Generic;
5using System.Runtime.InteropServices;
6using System.Threading.Tasks;
10 public class StandaloneFileBrowserIOS : 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(
"__Internal")]
38 private static extern IntPtr
DialogOpenFilePanel(
string title,
string directory,
string extension,
bool multiselect);
39 [DllImport(
"__Internal")]
40 private static extern void DialogOpenFilePanelAsync(
string title,
string directory,
string extension,
bool multiselect, AsyncCallback callback);
41 [DllImport(
"__Internal")]
43 [DllImport(
"__Internal")]
44 private static extern void DialogOpenFolderPanelAsync(
string title,
string directory,
bool multiselect, AsyncCallback callback);
45 [DllImport(
"__Internal")]
46 private static extern IntPtr
DialogSaveFilePanel(
string title,
string directory,
string defaultName,
string extension);
47 [DllImport(
"__Internal")]
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)
52 OpenFilePanelAsync(title, directory, extensions, multiselect,
null);
56 public void OpenFilePanelAsync(
string title,
string directory, ExtensionFilter[] extensions,
bool multiselect, Action<IList<ItemWithStream>> cb)
62 GetFilterFromFileExtensionList(extensions),
67 public IList<ItemWithStream> OpenFolderPanel(
string title,
string directory,
bool multiselect)
73 return ParseResults(paths);
76 public void OpenFolderPanelAsync(
string title,
string directory,
bool multiselect, Action<IList<ItemWithStream>> cb)
86 public ItemWithStream SaveFilePanel(
string title,
string directory,
string defaultName, ExtensionFilter[] extensions)
92 GetFilterFromFileExtensionList(extensions)));
93 return new ItemWithStream()
99 public void SaveFilePanelAsync(
string title,
string directory,
string defaultName, ExtensionFilter[] extensions,Action<ItemWithStream> cb)
106 GetFilterFromFileExtensionList(extensions),
110 private static string GetFilterFromFileExtensionList(ExtensionFilter[] extensions)
112 if (extensions ==
null)
117 var filterString =
"";
118 foreach (var filter
in extensions)
120 filterString += filter.Name +
";";
122 foreach (var ext
in filter.Extensions)
124 filterString += ext +
",";
127 filterString = filterString.Remove(filterString.Length - 1);
130 filterString = filterString.Remove(filterString.Length - 1);
134 private static IList<ItemWithStream> ParseResults(
string paths)
138 var filenames = paths.Split((
char)28);
139 var result =
new ItemWithStream[filenames.Length];
140 for (var i = 0; i < filenames.Length; i++)
142 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)