123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- #if UNITY_STANDALONE_WIN
- using System;
- using System.IO;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
- using Ookii.Dialogs;
- namespace SFB {
- // For fullscreen support
- // - WindowWrapper class and GetActiveWindow() are required for modal file dialog.
- // - "PlayerSettings/Visible In Background" should be enabled, otherwise when file dialog opened app window minimizes automatically.
- public class WindowWrapper : IWin32Window {
- private IntPtr _hwnd;
- public WindowWrapper(IntPtr handle) { _hwnd = handle; }
- public IntPtr Handle { get { return _hwnd; } }
- }
- public class StandaloneFileBrowserWindows : IStandaloneFileBrowser {
- [DllImport("user32.dll")]
- private static extern IntPtr GetActiveWindow();
- public string[] OpenFilePanel(string title, string directory, ExtensionFilter[] extensions, bool multiselect) {
- var fd = new VistaOpenFileDialog();
- fd.Title = title;
- if (extensions != null) {
- fd.Filter = GetFilterFromFileExtensionList(extensions);
- fd.FilterIndex = 1;
- }
- else {
- fd.Filter = string.Empty;
- }
- fd.Multiselect = multiselect;
- if (!string.IsNullOrEmpty(directory)) {
- fd.FileName = GetDirectoryPath(directory);
- }
- var res = fd.ShowDialog(new WindowWrapper(GetActiveWindow()));
- var filenames = res == DialogResult.OK ? fd.FileNames : new string[0];
- fd.Dispose();
- return filenames;
- }
- public void OpenFilePanelAsync(string title, string directory, ExtensionFilter[] extensions, bool multiselect, Action<string[]> cb) {
- cb.Invoke(OpenFilePanel(title, directory, extensions, multiselect));
- }
- public string[] OpenFolderPanel(string title, string directory, bool multiselect) {
- var fd = new VistaFolderBrowserDialog();
- fd.Description = title;
- if (!string.IsNullOrEmpty(directory)) {
- fd.SelectedPath = GetDirectoryPath(directory);
- }
- var res = fd.ShowDialog(new WindowWrapper(GetActiveWindow()));
- var filenames = res == DialogResult.OK ? new []{ fd.SelectedPath } : new string[0];
- fd.Dispose();
- return filenames;
- }
- public void OpenFolderPanelAsync(string title, string directory, bool multiselect, Action<string[]> cb) {
- cb.Invoke(OpenFolderPanel(title, directory, multiselect));
- }
- public string SaveFilePanel(string title, string directory, string defaultName, ExtensionFilter[] extensions) {
- var fd = new VistaSaveFileDialog();
- fd.Title = title;
- var finalFilename = "";
- if (!string.IsNullOrEmpty(directory)) {
- finalFilename = GetDirectoryPath(directory);
- }
- if (!string.IsNullOrEmpty(defaultName)) {
- finalFilename += defaultName;
- }
- fd.FileName = finalFilename;
- if (extensions != null) {
- fd.Filter = GetFilterFromFileExtensionList(extensions);
- fd.FilterIndex = 1;
- fd.DefaultExt = extensions[0].Extensions[0];
- fd.AddExtension = true;
- }
- else {
- fd.DefaultExt = string.Empty;
- fd.Filter = string.Empty;
- fd.AddExtension = false;
- }
- var res = fd.ShowDialog(new WindowWrapper(GetActiveWindow()));
- var filename = res == DialogResult.OK ? fd.FileName : "";
- fd.Dispose();
- return filename;
- }
- public void SaveFilePanelAsync(string title, string directory, string defaultName, ExtensionFilter[] extensions, Action<string> cb) {
- cb.Invoke(SaveFilePanel(title, directory, defaultName, extensions));
- }
- // .NET Framework FileDialog Filter format
- // https://msdn.microsoft.com/en-us/library/microsoft.win32.filedialog.filter
- private static string GetFilterFromFileExtensionList(ExtensionFilter[] extensions) {
- var filterString = "";
- foreach (var filter in extensions) {
- filterString += filter.Name + "(";
- foreach (var ext in filter.Extensions) {
- filterString += "*." + ext + ",";
- }
- filterString = filterString.Remove(filterString.Length - 1);
- filterString += ") |";
- foreach (var ext in filter.Extensions) {
- filterString += "*." + ext + "; ";
- }
- filterString += "|";
- }
- filterString = filterString.Remove(filterString.Length - 1);
- return filterString;
- }
- private static string GetDirectoryPath(string directory) {
- var directoryPath = Path.GetFullPath(directory);
- if (!directoryPath.EndsWith("\\")) {
- directoryPath += "\\";
- }
- if (Path.GetPathRoot(directoryPath) == directoryPath) {
- return directory;
- }
- return Path.GetDirectoryName(directoryPath) + Path.DirectorySeparatorChar;
- }
- }
- }
- #endif
|