EditorTool3D/Assets/TriLib/TriLibStandaloneFileBrowser/StandaloneFileBrowser/StandaloneFileBrowserIOS.cs

154 lines
5.6 KiB
C#

#if UNITY_IOS && !UNITY_EDITOR
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
namespace TriLibCore.SFB
{
public class StandaloneFileBrowserIOS : IStandaloneFileBrowser<ItemWithStream>
{
private static Action<IList<ItemWithStream>> _openFileCb;
private static Action<IList<ItemWithStream>> _openFolderCb;
private static Action<ItemWithStream> _saveFileCb;
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void AsyncCallback(string path);
[AOT.MonoPInvokeCallback(typeof(AsyncCallback))]
private static void openFileCb(string result)
{
_openFileCb.Invoke(ParseResults(result));
}
[AOT.MonoPInvokeCallback(typeof(AsyncCallback))]
private static void openFolderCb(string result)
{
_openFolderCb.Invoke(ParseResults(result));
}
[AOT.MonoPInvokeCallback(typeof(AsyncCallback))]
private static void saveFileCb(string result)
{
_saveFileCb.Invoke(ParseResults(result)?[0]);
}
[DllImport("__Internal")]
private static extern IntPtr DialogOpenFilePanel(string title, string directory, string extension, bool multiselect);
[DllImport("__Internal")]
private static extern void DialogOpenFilePanelAsync(string title, string directory, string extension, bool multiselect, AsyncCallback callback);
[DllImport("__Internal")]
private static extern IntPtr DialogOpenFolderPanel(string title, string directory, bool multiselect);
[DllImport("__Internal")]
private static extern void DialogOpenFolderPanelAsync(string title, string directory, bool multiselect, AsyncCallback callback);
[DllImport("__Internal")]
private static extern IntPtr DialogSaveFilePanel(string title, string directory, string defaultName, string extension);
[DllImport("__Internal")]
private static extern void DialogSaveFilePanelAsync(string title, string directory, string defaultName, string extension, AsyncCallback callback);
public IList<ItemWithStream> OpenFilePanel(string title, string directory, ExtensionFilter[] extensions, bool multiselect)
{
OpenFilePanelAsync(title, directory, extensions, multiselect, null);
return null;
}
public void OpenFilePanelAsync(string title, string directory, ExtensionFilter[] extensions, bool multiselect, Action<IList<ItemWithStream>> cb)
{
_openFileCb = cb;
DialogOpenFilePanelAsync(
title,
directory,
GetFilterFromFileExtensionList(extensions),
multiselect,
openFileCb);
}
public IList<ItemWithStream> OpenFolderPanel(string title, string directory, bool multiselect)
{
var paths = Marshal.PtrToStringAnsi(DialogOpenFolderPanel(
title,
directory,
multiselect));
return ParseResults(paths);
}
public void OpenFolderPanelAsync(string title, string directory, bool multiselect, Action<IList<ItemWithStream>> cb)
{
_openFolderCb = cb;
DialogOpenFolderPanelAsync(
title,
directory,
multiselect,
openFolderCb);
}
public ItemWithStream SaveFilePanel(string title, string directory, string defaultName, ExtensionFilter[] extensions)
{
var path = Marshal.PtrToStringAnsi(DialogSaveFilePanel(
title,
directory,
defaultName,
GetFilterFromFileExtensionList(extensions)));
return new ItemWithStream()
{
Name = path
};
}
public void SaveFilePanelAsync(string title, string directory, string defaultName, ExtensionFilter[] extensions,Action<ItemWithStream> cb)
{
_saveFileCb = cb;
DialogSaveFilePanelAsync(
title,
directory,
defaultName,
GetFilterFromFileExtensionList(extensions),
saveFileCb);
}
private static string GetFilterFromFileExtensionList(ExtensionFilter[] extensions)
{
if (extensions == null)
{
return "";
}
var filterString = "";
foreach (var filter in extensions)
{
filterString += filter.Name + ";";
foreach (var ext in filter.Extensions)
{
filterString += ext + ",";
}
filterString = filterString.Remove(filterString.Length - 1);
filterString += "|";
}
filterString = filterString.Remove(filterString.Length - 1);
return filterString;
}
private static IList<ItemWithStream> ParseResults(string paths)
{
if (paths != null)
{
var filenames = paths.Split((char)28);
var result = new ItemWithStream[filenames.Length];
for (var i = 0; i < filenames.Length; i++)
{
result[i] = new ItemWithStream()
{
Name = filenames[i]//,
//Stream = File.OpenRead(filenames[i])
};
}
return result;
}
return null;
}
}
}
#endif