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