StandaloneFileBrowserMac.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #if UNITY_STANDALONE_OSX
  2. using System;
  3. using System.Runtime.InteropServices;
  4. namespace SFB {
  5. public class StandaloneFileBrowserMac : IStandaloneFileBrowser {
  6. private static Action<string[]> _openFileCb;
  7. private static Action<string[]> _openFolderCb;
  8. private static Action<string> _saveFileCb;
  9. [UnmanagedFunctionPointer(CallingConvention.StdCall)]
  10. public delegate void AsyncCallback(string path);
  11. [AOT.MonoPInvokeCallback(typeof(AsyncCallback))]
  12. private static void openFileCb(string result) {
  13. _openFileCb.Invoke(result.Split((char)28));
  14. }
  15. [AOT.MonoPInvokeCallback(typeof(AsyncCallback))]
  16. private static void openFolderCb(string result) {
  17. _openFolderCb.Invoke(result.Split((char)28));
  18. }
  19. [AOT.MonoPInvokeCallback(typeof(AsyncCallback))]
  20. private static void saveFileCb(string result) {
  21. _saveFileCb.Invoke(result);
  22. }
  23. [DllImport("StandaloneFileBrowser")]
  24. private static extern IntPtr DialogOpenFilePanel(string title, string directory, string extension, bool multiselect);
  25. [DllImport("StandaloneFileBrowser")]
  26. private static extern void DialogOpenFilePanelAsync(string title, string directory, string extension, bool multiselect, AsyncCallback callback);
  27. [DllImport("StandaloneFileBrowser")]
  28. private static extern IntPtr DialogOpenFolderPanel(string title, string directory, bool multiselect);
  29. [DllImport("StandaloneFileBrowser")]
  30. private static extern void DialogOpenFolderPanelAsync(string title, string directory, bool multiselect, AsyncCallback callback);
  31. [DllImport("StandaloneFileBrowser")]
  32. private static extern IntPtr DialogSaveFilePanel(string title, string directory, string defaultName, string extension);
  33. [DllImport("StandaloneFileBrowser")]
  34. private static extern void DialogSaveFilePanelAsync(string title, string directory, string defaultName, string extension, AsyncCallback callback);
  35. public string[] OpenFilePanel(string title, string directory, ExtensionFilter[] extensions, bool multiselect) {
  36. var paths = Marshal.PtrToStringAnsi(DialogOpenFilePanel(
  37. title,
  38. directory,
  39. GetFilterFromFileExtensionList(extensions),
  40. multiselect));
  41. return paths.Split((char)28);
  42. }
  43. public void OpenFilePanelAsync(string title, string directory, ExtensionFilter[] extensions, bool multiselect, Action<string[]> cb) {
  44. _openFileCb = cb;
  45. DialogOpenFilePanelAsync(
  46. title,
  47. directory,
  48. GetFilterFromFileExtensionList(extensions),
  49. multiselect,
  50. openFileCb);
  51. }
  52. public string[] OpenFolderPanel(string title, string directory, bool multiselect) {
  53. var paths = Marshal.PtrToStringAnsi(DialogOpenFolderPanel(
  54. title,
  55. directory,
  56. multiselect));
  57. return paths.Split((char)28);
  58. }
  59. public void OpenFolderPanelAsync(string title, string directory, bool multiselect, Action<string[]> cb) {
  60. _openFolderCb = cb;
  61. DialogOpenFolderPanelAsync(
  62. title,
  63. directory,
  64. multiselect,
  65. openFolderCb);
  66. }
  67. public string SaveFilePanel(string title, string directory, string defaultName, ExtensionFilter[] extensions) {
  68. return Marshal.PtrToStringAnsi(DialogSaveFilePanel(
  69. title,
  70. directory,
  71. defaultName,
  72. GetFilterFromFileExtensionList(extensions)));
  73. }
  74. public void SaveFilePanelAsync(string title, string directory, string defaultName, ExtensionFilter[] extensions, Action<string> cb) {
  75. _saveFileCb = cb;
  76. DialogSaveFilePanelAsync(
  77. title,
  78. directory,
  79. defaultName,
  80. GetFilterFromFileExtensionList(extensions),
  81. saveFileCb);
  82. }
  83. private static string GetFilterFromFileExtensionList(ExtensionFilter[] extensions) {
  84. if (extensions == null) {
  85. return "";
  86. }
  87. var filterString = "";
  88. foreach (var filter in extensions) {
  89. filterString += filter.Name + ";";
  90. foreach (var ext in filter.Extensions) {
  91. filterString += ext + ",";
  92. }
  93. filterString = filterString.Remove(filterString.Length - 1);
  94. filterString += "|";
  95. }
  96. filterString = filterString.Remove(filterString.Length - 1);
  97. return filterString;
  98. }
  99. }
  100. }
  101. #endif