Singularity/Assets/Plugins/crosstales/FileBrowser/Scripts/Wrapper/FileBrowserEditor.cs
2024-05-06 11:45:45 -07:00

150 lines
5.3 KiB
C#

#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
using System;
namespace Crosstales.FB.Wrapper
{
public class FileBrowserEditor : BaseFileBrowser
{
#region Implemented methods
public override bool canOpenFile => true;
public override bool canOpenFolder => true;
public override bool canSaveFile => true;
public override bool canOpenMultipleFiles => false;
public override bool canOpenMultipleFolders => false;
public override bool isPlatformSupported => Crosstales.FB.Util.Helper.isWindowsPlatform || Crosstales.FB.Util.Helper.isMacOSPlatform || Crosstales.FB.Util.Helper.isLinuxPlatform || Crosstales.FB.Util.Helper.isWSABasedPlatform;
public override bool isWorkingInEditor => true;
public override string[] OpenFiles(string title, string directory, string defaultName, bool multiselect, params ExtensionFilter[] extensions)
{
if (Crosstales.FB.Util.Helper.isMacOSEditor && extensions?.Length > 1)
Debug.LogWarning("Multiple 'extensions' are not supported in the Editor.");
if (multiselect)
Debug.LogWarning("'multiselect' for files is not supported in the Editor.");
if (!string.IsNullOrEmpty(defaultName))
Debug.LogWarning("'defaultName' is not supported in the Editor.");
//resetOpenFiles();
string path = string.Empty;
path = extensions == null ? EditorUtility.OpenFilePanel(title, directory, string.Empty) : EditorUtility.OpenFilePanelWithFilters(title, directory, getFilterFromFileExtensionList(extensions));
if (string.IsNullOrEmpty(path))
{
CurrentOpenFiles = System.Array.Empty<string>();
CurrentOpenSingleFile = string.Empty;
return null;
}
CurrentOpenSingleFile = Crosstales.Common.Util.FileHelper.ValidateFile(path);
CurrentOpenFiles = new[] { CurrentOpenSingleFile };
return CurrentOpenFiles;
}
public override string[] OpenFolders(string title, string directory, bool multiselect)
{
if (multiselect)
Debug.LogWarning("'multiselect' for folders is not supported in the Editor.");
//resetOpenFolders();
string path = EditorUtility.OpenFolderPanel(title, directory, string.Empty);
if (string.IsNullOrEmpty(path))
{
CurrentOpenFolders = System.Array.Empty<string>();
CurrentOpenSingleFolder = string.Empty;
return null;
}
CurrentOpenSingleFolder = Crosstales.Common.Util.FileHelper.ValidatePath(path);
CurrentOpenFolders = new[] { CurrentOpenSingleFolder };
return CurrentOpenFolders;
}
public override string SaveFile(string title, string directory, string defaultName, params ExtensionFilter[] extensions)
{
//resetSaveFile();
string ext = extensions?.Length > 0 ? extensions[0].Extensions[0].Equals("*") ? string.Empty : extensions[0].Extensions[0] : string.Empty;
string name = string.IsNullOrEmpty(ext) ? defaultName : $"{defaultName}.{ext}";
if (extensions?.Length > 1)
Debug.LogWarning($"Multiple 'extensions' are not supported in the Editor! Using only the first entry '{ext}'.");
string path = EditorUtility.SaveFilePanel(title, directory, name, ext);
if (string.IsNullOrEmpty(path))
{
CurrentSaveFile = string.Empty;
return null;
}
CurrentSaveFile = Crosstales.Common.Util.FileHelper.ValidateFile(path);
return CurrentSaveFile;
}
public override void OpenFilesAsync(string title, string directory, string defaultName, bool multiselect, ExtensionFilter[] extensions, Action<string[]> cb)
{
Debug.LogWarning("'OpenFilesAsync' is running synchronously in the Editor.");
cb?.Invoke(OpenFiles(title, directory, defaultName, multiselect, extensions));
}
public override void OpenFoldersAsync(string title, string directory, bool multiselect, Action<string[]> cb)
{
Debug.LogWarning("'OpenFoldersAsync' is running synchronously in the Editor.");
cb?.Invoke(OpenFolders(title, directory, multiselect));
}
public override void SaveFileAsync(string title, string directory, string defaultName, ExtensionFilter[] extensions, Action<string> cb)
{
Debug.LogWarning("'SaveFileAsync' is running synchronously in the Editor.");
cb?.Invoke(SaveFile(title, directory, defaultName, extensions));
}
#endregion
#region Private methods
private static string[] getFilterFromFileExtensionList(ExtensionFilter[] extensions)
{
if (extensions?.Length > 0)
{
string[] filters = new string[extensions.Length * 2];
for (int ii = 0; ii < extensions.Length; ii++)
{
filters[ii * 2] = extensions[ii].Name;
filters[ii * 2 + 1] = string.Join(",", extensions[ii].Extensions);
}
if (Crosstales.FB.Util.Config.DEBUG)
Debug.Log($"getFilterFromFileExtensionList: {filters.CTDump()}");
return filters;
}
return Array.Empty<string>();
}
#endregion
}
}
#endif
// © 2017-2023 crosstales LLC (https://www.crosstales.com)