#if UNITY_WSA && !UNITY_EDITOR && ENABLE_WINMD_SUPPORT //|| CT_DEVELOP using UnityEngine; using System; using System.Runtime.InteropServices.WindowsRuntime; namespace Crosstales.FB.Wrapper { /// File browser implementation for WSA (UWP). public class FileBrowserWSA : BaseFileBrowser { #region Variables private static FileBrowserWSAImpl fbWsa; private string allFilesText; private byte[] readData; #endregion #region Constructor /// /// Constructor for a WSA file browser. /// 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(); 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(); 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 cb) { cb?.Invoke(OpenFiles(title, directory, defaultName, multiselect, extensions)); } public override void OpenFoldersAsync(string title, string directory, bool multiselect, Action cb) { cb?.Invoke(OpenFolders(title, directory, multiselect)); } public override void SaveFileAsync(string title, string directory, string defaultName, ExtensionFilter[] extensions, Action 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 getExtensionsFromExtensionFilters(ExtensionFilter[] extensions) { System.Collections.Generic.List list = new System.Collections.Generic.List(); 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)