Tanoda
StandaloneFileBrowserIOS.cs
Go to the documentation of this file.
1#if UNITY_IOS && !UNITY_EDITOR
2using System;
3using System.Collections.Generic;
4using System.IO;
5using System.Runtime.InteropServices;
6using System.Threading.Tasks;
7
8namespace TriLibCore.SFB
9{
10 public class StandaloneFileBrowserIOS : IStandaloneFileBrowser<ItemWithStream>
11 {
12 private static Action<IList<ItemWithStream>> _openFileCb;
13 private static Action<IList<ItemWithStream>> _openFolderCb;
14 private static Action<ItemWithStream> _saveFileCb;
15
16 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
17 public delegate void AsyncCallback(string path);
18
19 [AOT.MonoPInvokeCallback(typeof(AsyncCallback))]
20 private static void openFileCb(string result)
21 {
22 _openFileCb.Invoke(ParseResults(result));
23 }
24
25 [AOT.MonoPInvokeCallback(typeof(AsyncCallback))]
26 private static void openFolderCb(string result)
27 {
28 _openFolderCb.Invoke(ParseResults(result));
29 }
30
31 [AOT.MonoPInvokeCallback(typeof(AsyncCallback))]
32 private static void saveFileCb(string result)
33 {
34 _saveFileCb.Invoke(ParseResults(result)?[0]);
35 }
36
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")]
42 private static extern IntPtr DialogOpenFolderPanel(string title, string directory, bool multiselect);
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);
49
50 public IList<ItemWithStream> OpenFilePanel(string title, string directory, ExtensionFilter[] extensions, bool multiselect)
51 {
52 OpenFilePanelAsync(title, directory, extensions, multiselect, null);
53 return null;
54 }
55
56 public void OpenFilePanelAsync(string title, string directory, ExtensionFilter[] extensions, bool multiselect, Action<IList<ItemWithStream>> cb)
57 {
58 _openFileCb = cb;
60 title,
61 directory,
62 GetFilterFromFileExtensionList(extensions),
63 multiselect,
64 openFileCb);
65 }
66
67 public IList<ItemWithStream> OpenFolderPanel(string title, string directory, bool multiselect)
68 {
69 var paths = Marshal.PtrToStringAnsi(DialogOpenFolderPanel(
70 title,
71 directory,
72 multiselect));
73 return ParseResults(paths);
74 }
75
76 public void OpenFolderPanelAsync(string title, string directory, bool multiselect, Action<IList<ItemWithStream>> cb)
77 {
78 _openFolderCb = cb;
80 title,
81 directory,
82 multiselect,
83 openFolderCb);
84 }
85
86 public ItemWithStream SaveFilePanel(string title, string directory, string defaultName, ExtensionFilter[] extensions)
87 {
88 var path = Marshal.PtrToStringAnsi(DialogSaveFilePanel(
89 title,
90 directory,
91 defaultName,
92 GetFilterFromFileExtensionList(extensions)));
93 return new ItemWithStream()
94 {
95 Name = path
96 };
97 }
98
99 public void SaveFilePanelAsync(string title, string directory, string defaultName, ExtensionFilter[] extensions,Action<ItemWithStream> cb)
100 {
101 _saveFileCb = cb;
103 title,
104 directory,
105 defaultName,
106 GetFilterFromFileExtensionList(extensions),
107 saveFileCb);
108 }
109
110 private static string GetFilterFromFileExtensionList(ExtensionFilter[] extensions)
111 {
112 if (extensions == null)
113 {
114 return "";
115 }
116
117 var filterString = "";
118 foreach (var filter in extensions)
119 {
120 filterString += filter.Name + ";";
121
122 foreach (var ext in filter.Extensions)
123 {
124 filterString += ext + ",";
125 }
126
127 filterString = filterString.Remove(filterString.Length - 1);
128 filterString += "|";
129 }
130 filterString = filterString.Remove(filterString.Length - 1);
131 return filterString;
132 }
133
134 private static IList<ItemWithStream> ParseResults(string paths)
135 {
136 if (paths != null)
137 {
138 var filenames = paths.Split((char)28);
139 var result = new ItemWithStream[filenames.Length];
140 for (var i = 0; i < filenames.Length; i++)
141 {
142 result[i] = new ItemWithStream()
143 {
144 Name = filenames[i]//,
145 //Stream = File.OpenRead(filenames[i])
146 };
147 }
148 return result;
149 }
150 return null;
151 }
152 }
153}
154#endif
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)