1#if UNITY_STANDALONE_LINUX || UNITY_EDITOR_LINUX
3using System.Collections.Generic;
5using System.Runtime.InteropServices;
6using System.Threading.Tasks;
10 public class StandaloneFileBrowserLinux : 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 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")]
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);
52 public StandaloneFileBrowserLinux()
57 public IList<ItemWithStream> OpenFilePanel(
string title,
string directory, ExtensionFilter[] extensions,
bool multiselect)
62 GetFilterFromFileExtensionList(extensions),
64 return ParseResults(paths);
67 public void OpenFilePanelAsync(
string title,
string directory, ExtensionFilter[] extensions,
bool multiselect, Action<IList<ItemWithStream>> cb)
73 GetFilterFromFileExtensionList(extensions),
78 public IList<ItemWithStream> OpenFolderPanel(
string title,
string directory,
bool multiselect)
84 return ParseResults(paths);
87 public void OpenFolderPanelAsync(
string title,
string directory,
bool multiselect, Action<IList<ItemWithStream>> cb)
97 public ItemWithStream SaveFilePanel(
string title,
string directory,
string defaultName, ExtensionFilter[] extensions)
103 GetFilterFromFileExtensionList(extensions)));
104 return new ItemWithStream
110 public void SaveFilePanelAsync(
string title,
string directory,
string defaultName, ExtensionFilter[] extensions, Action<ItemWithStream> cb)
117 GetFilterFromFileExtensionList(extensions),
121 private static string GetFilterFromFileExtensionList(ExtensionFilter[] extensions)
123 if (extensions ==
null)
127 var filterString =
"";
128 foreach (var filter
in extensions)
130 filterString += filter.Name +
";";
131 foreach (var ext
in filter.Extensions)
133 filterString += ext +
",";
135 filterString = filterString.Remove(filterString.Length - 1);
138 filterString = filterString.Remove(filterString.Length - 1);
142 private static IList<ItemWithStream> ParseResults(
string paths)
146 var filenames = paths.Split((
char)28);
147 var result =
new ItemWithStream[filenames.Length];
148 for (var i = 0; i < filenames.Length; i++)
150 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)