Tanoda
StandaloneFileBrowserMac.cs
Go to the documentation of this file.
1#if UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX
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 StandaloneFileBrowserMac : 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("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")]
42 private static extern IntPtr DialogOpenFolderPanel(string title, string directory, bool multiselect);
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);
49
50 public IList<ItemWithStream> OpenFilePanel(string title, string directory, ExtensionFilter[] extensions, bool multiselect)
51 {
52 var paths = Marshal.PtrToStringAnsi(DialogOpenFilePanel(
53 title,
54 directory,
55 GetFilterFromFileExtensionList(extensions),
56 multiselect));
57 return ParseResults(paths);
58 }
59
60 public void OpenFilePanelAsync(string title, string directory, ExtensionFilter[] extensions, bool multiselect, Action<IList<ItemWithStream>> cb)
61 {
62 _openFileCb = cb;
64 title,
65 directory,
66 GetFilterFromFileExtensionList(extensions),
67 multiselect,
68 openFileCb);
69 }
70
71 public IList<ItemWithStream> OpenFolderPanel(string title, string directory, bool multiselect)
72 {
73 var paths = Marshal.PtrToStringAnsi(DialogOpenFolderPanel(
74 title,
75 directory,
76 multiselect));
77 return ParseResults(paths);
78 }
79
80 public void OpenFolderPanelAsync(string title, string directory, bool multiselect, Action<IList<ItemWithStream>> cb)
81 {
82 _openFolderCb = cb;
84 title,
85 directory,
86 multiselect,
87 openFolderCb);
88 }
89
90 public ItemWithStream SaveFilePanel(string title, string directory, string defaultName, ExtensionFilter[] extensions)
91 {
92 var filename = Marshal.PtrToStringAnsi(DialogSaveFilePanel(
93 title,
94 directory,
95 defaultName,
96 GetFilterFromFileExtensionList(extensions)));
97 return new ItemWithStream
98 {
99 Name = filename
100 };
101 }
102
103 public void SaveFilePanelAsync(string title, string directory, string defaultName, ExtensionFilter[] extensions, Action<ItemWithStream> cb)
104 {
105 _saveFileCb = cb;
107 title,
108 directory,
109 defaultName,
110 GetFilterFromFileExtensionList(extensions),
111 saveFileCb);
112 }
113
114 private static string GetFilterFromFileExtensionList(ExtensionFilter[] extensions)
115 {
116 if (extensions == null)
117 {
118 return "";
119 }
120
121 var filterString = "";
122 foreach (var filter in extensions)
123 {
124 var hasFormat = false;
125 filterString += filter.Name + ";";
126 foreach (var format in filter.Extensions)
127 {
128 if (hasFormat)
129 {
130 filterString += ",";
131 }
132 filterString += (format[0] == '.' ? format.Substring(1) : format);
133 hasFormat = true;
134 }
135 filterString += "|";
136 }
137 filterString = filterString.Remove(filterString.Length - 1);
138 return filterString;
139 }
140
141 private static IList<ItemWithStream> ParseResults(string paths)
142 {
143 if (paths != null)
144 {
145 var filenames = paths.Split((char)28);
146 var result = new ItemWithStream[filenames.Length];
147 for (var i = 0; i < filenames.Length; i++)
148 {
149 result[i] = new ItemWithStream()
150 {
151 Name = filenames[i]//,
152 //Stream = File.OpenRead(filenames[i])
153 };
154 }
155 return result;
156 }
157 return null;
158 }
159 }
160}
161#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)