Tanoda
StandaloneFileBrowserWinRT.cs
Go to the documentation of this file.
1#if UNITY_WSA && !UNITY_EDITOR
2using System;
3using System.Collections.Generic;
4using System.IO;
5using System.Threading.Tasks;
6using Windows.Storage;
7using TriLibCore;
8using UnityEngine;
9
10namespace TriLibCore.SFB
11{
12 public class StandaloneFileBrowserWinRT : IStandaloneFileBrowser<ItemWithStream>
13 {
14 public IList<ItemWithStream> OpenFilePanel(string title, string directory, ExtensionFilter[] extensions, bool multiselect)
15 {
16 return null;
17 }
18
19 public IList<ItemWithStream> OpenFolderPanel(string title, string directory, bool multiselect)
20 {
21 return null;
22 }
23
24 public ItemWithStream SaveFilePanel(string title, string directory, string defaultName, ExtensionFilter[] extensions)
25 {
26 return null;
27 }
28
29 public void OpenFilePanelAsync(string title, string directory, ExtensionFilter[] extensions, bool multiselect, Action<IList<ItemWithStream>> cb)
30 {
31 UnityEngine.WSA.Application.InvokeOnUIThread(async () =>
32 {
33 var filePicker = new Windows.Storage.Pickers.FileOpenPicker();
34 if (extensions != null)
35 {
36 var existingExtensions = new List<string>();
37 foreach (var extension in extensions)
38 {
39 foreach (var filter in extension.Extensions)
40 {
41 if (filter == "*" || filter == ".*" || filter == "*.*" || existingExtensions.Contains(filter)) {
42 continue;
43 }
44 filePicker.FileTypeFilter.Add("." + filter);
45 existingExtensions.Add(filter);
46 }
47 }
48 }
49 if (multiselect)
50 {
51 var files = await filePicker.PickMultipleFilesAsync();
52 var result = new ItemWithStream[files.Count];
53 for (var i = 0; i < files.Count; i++)
54 {
55 result[i] = new ItemWithStream()
56 {
57 Name = files[i].Name,
58 Stream = await ReadStorageFile(files[i])
59 };
60 }
61 await Task.Run(() => cb(result));
62 }
63 else
64 {
65 var file = await filePicker.PickSingleFileAsync();
66 var fileWithStream = new ItemWithStream()
67 {
68 Name = file.Name,
69 Stream = await ReadStorageFile(file)
70 };
71 await Task.Run(() => cb(new[] { fileWithStream }));
72 }
73 }, false);
74 }
75
76 public void OpenFolderPanelAsync(string title, string directory, bool multiselect, Action<IList<ItemWithStream>> cb)
77 {
78 UnityEngine.WSA.Application.InvokeOnUIThread(async () =>
79 {
80 var folderPicker = new Windows.Storage.Pickers.FolderPicker();
81 var folder = await folderPicker.PickSingleFolderAsync();
82 var folderWithStream = new ItemWithStream()
83 {
84 Name = folder.Name
85 };
86 await Task.Run(() => cb(new[] { folderWithStream }));
87 }, false);
88 }
89
90 public void SaveFilePanelAsync(string title, string directory, string defaultName, ExtensionFilter[] extensions, Action<ItemWithStream> cb)
91 {
92 UnityEngine.WSA.Application.InvokeOnUIThread(async () =>
93 {
94 var filePicker = new Windows.Storage.Pickers.FileSavePicker();
95 filePicker.SuggestedFileName = defaultName;
96 foreach (var extension in extensions)
97 {
98 filePicker.FileTypeChoices.Add(extension.Name, extension.Extensions);
99 }
100 var file = await filePicker.PickSaveFileAsync();
101 var fileWithStream = new ItemWithStream()
102 {
103 Name = file.Name
104 };
105 await Task.Run(() => cb(fileWithStream));
106 }, false);
107 }
108
109 private static async Task<Stream> ReadStorageFile(StorageFile storageFile)
110 {
111 return await storageFile.OpenStreamForReadAsync();
112 }
113 }
114}
115#endif