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

242 lines
7.4 KiB
C#

#if UNITY_WSA && !UNITY_EDITOR && ENABLE_WINMD_SUPPORT //|| CT_DEVELOP
using UnityEngine;
using System;
using System.Runtime.InteropServices.WindowsRuntime;
namespace Crosstales.FB.Wrapper
{
/// <summary>File browser implementation for WSA (UWP).</summary>
public class FileBrowserWSA : BaseFileBrowser
{
#region Variables
private static FileBrowserWSAImpl fbWsa;
private string allFilesText;
private byte[] readData;
#endregion
#region Constructor
/// <summary>
/// Constructor for a WSA file browser.
/// </summary>
public FileBrowserWSA()
{
allFilesText = FileBrowser.Instance.TextAllFiles;
if (fbWsa == null)
{
if (Crosstales.FB.Util.Constants.DEV_DEBUG)
Debug.Log("Initializing WSA file browser...");
fbWsa = new FileBrowserWSAImpl();
//fbWsa.DEBUG = Crosstales.FB.Util.Config.DEBUG;
}
}
#endregion
#region Implemented methods
public override bool canOpenFile => true;
public override bool canOpenFolder => true;
public override bool canSaveFile => true;
public override bool canOpenMultipleFiles => FileBrowserWSAImpl.canOpenMultipleFiles;
public override bool canOpenMultipleFolders => FileBrowserWSAImpl.canOpenMultipleFolders;
public override bool isPlatformSupported => Crosstales.FB.Util.Helper.isWSABasedPlatform; // || Util.Helper.isWindowsEditor;
public override bool isWorkingInEditor => false;
public override string CurrentOpenSingleFile { get; set; }
public override string[] CurrentOpenFiles { get; set; }
public override string CurrentOpenSingleFolder { get; set; }
public override string[] CurrentOpenFolders { get; set; }
public override string CurrentSaveFile { get; set; }
public override byte[] CurrentOpenSingleFileData => readData;
public override string[] OpenFiles(string title, string directory, string defaultName, bool multiselect, params ExtensionFilter[] extensions)
{
if (Crosstales.FB.Util.Config.DEBUG && !string.IsNullOrEmpty(title))
Debug.LogWarning("'title' is not supported under WSA (UWP).");
if (!string.IsNullOrEmpty(directory))
Debug.LogWarning("'directory' is not supported under WSA (UWP).");
if (!string.IsNullOrEmpty(defaultName))
Debug.LogWarning("'defaultName' is not supported under WSA (UWP).");
//resetOpenFiles();
fbWsa.isBusy = true;
UnityEngine.WSA.Application.InvokeOnUIThread(() => { fbWsa.OpenFiles(getExtensionsFromExtensionFilters(extensions), multiselect); }, false);
do
{
//wait
} while (fbWsa.isBusy);
UnityEngine.WSA.Application.InvokeOnUIThread(readFile, false);
string[] paths = fbWsa.Selection.ToArray();
if (paths != null && paths.Length > 0)
{
CurrentOpenFiles = paths;
CurrentOpenSingleFile = paths[0];
}
else
{
CurrentOpenFiles = System.Array.Empty<string>();
CurrentOpenSingleFile = string.Empty;
}
return paths;
}
public override string[] OpenFolders(string title, string directory, bool multiselect)
{
if (Crosstales.FB.Util.Config.DEBUG && !string.IsNullOrEmpty(title))
Debug.LogWarning("'title' is not supported under WSA (UWP).");
if (!string.IsNullOrEmpty(directory))
Debug.LogWarning("'directory' is not supported under WSA (UWP).");
if (multiselect)
Debug.LogWarning("'multiselect' for folders is not supported under WSA (UWP).");
//resetOpenFolders();
fbWsa.isBusy = true;
UnityEngine.WSA.Application.InvokeOnUIThread(() => { fbWsa.OpenSingleFolder(); }, false);
do
{
//wait
} while (fbWsa.isBusy);
string[] paths = fbWsa.Selection.ToArray();
if (paths != null && paths.Length > 0)
{
CurrentOpenFolders = paths;
CurrentOpenSingleFolder = paths[0];
}
else
{
CurrentOpenFolders = System.Array.Empty<string>();
CurrentOpenSingleFolder = string.Empty;
}
return paths;
}
public override string SaveFile(string title, string directory, string defaultName, params ExtensionFilter[] extensions)
{
if (Crosstales.FB.Util.Config.DEBUG && !string.IsNullOrEmpty(title))
Debug.LogWarning("'title' is not supported under WSA (UWP).");
if (!string.IsNullOrEmpty(directory))
Debug.LogWarning("'directory' is not supported under WSA (UWP).");
//resetSaveFile();
fbWsa.isBusy = true;
UnityEngine.WSA.Application.InvokeOnUIThread(() => { fbWsa.SaveFile(defaultName, getExtensionsFromExtensionFilters(extensions)); }, false);
do
{
//wait
} while (fbWsa.isBusy);
UnityEngine.WSA.Application.InvokeOnUIThread(writeFile, false);
if (fbWsa.Selection.Count > 0)
{
CurrentSaveFile = fbWsa.Selection[0];
return CurrentSaveFile;
}
CurrentSaveFile = string.Empty;
return null;
}
public override void OpenFilesAsync(string title, string directory, string defaultName, bool multiselect, ExtensionFilter[] extensions, Action<string[]> cb)
{
cb?.Invoke(OpenFiles(title, directory, defaultName, multiselect, extensions));
}
public override void OpenFoldersAsync(string title, string directory, bool multiselect, Action<string[]> cb)
{
cb?.Invoke(OpenFolders(title, directory, multiselect));
}
public override void SaveFileAsync(string title, string directory, string defaultName, ExtensionFilter[] extensions, Action<string> cb)
{
cb?.Invoke(SaveFile(title, directory, defaultName, extensions));
}
#endregion
#region Private methods
private async void readFile()
{
if (FileBrowser.Instance.AlwaysReadFile)
{
var file = FileBrowserWSAImpl.LastOpenFile;
var buffer = await Windows.Storage.FileIO.ReadBufferAsync(file);
readData = buffer.ToArray();
}
}
private async void writeFile()
{
if (CurrentSaveFileData != null)
{
var file = FileBrowserWSAImpl.LastSaveFile;
await Windows.Storage.FileIO.WriteBytesAsync(file, CurrentSaveFileData);
}
}
private System.Collections.Generic.List<Extension> getExtensionsFromExtensionFilters(ExtensionFilter[] extensions)
{
System.Collections.Generic.List<Extension> list = new System.Collections.Generic.List<Extension>();
if (extensions?.Length > 0)
{
foreach (ExtensionFilter filter in extensions)
{
list.Add(new Extension(filter.Name, filter.Extensions));
//Debug.Log($"filter.Extensions: {filter.Extensions.CTDump()}");
}
}
else
{
list.Add(new Extension(allFilesText, "*"));
}
if (Crosstales.FB.Util.Config.DEBUG)
Debug.Log($"getExtensionsFromExtensionFilters: {list.CTDump()}");
return list;
}
#endregion
}
}
#endif
// © 2018-2023 crosstales LLC (https://www.crosstales.com)