StandaloneFileBrowserLinux.cs 4.6 KB

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