private async Task ImportInstanceAsync() { var ofd = new OpenSingleFileDialog { FilterName = "Factorio", FileName = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "factorio.exe" : "factorio" }; var path = await ofd.ShowAsync(App.Current.MainWindow); if (!(path is null)) { var file = new FileInfo(path); if (file.Exists) { var dir = file.Directory?.Parent?.Parent; if (dir is null) { // Invalid file selected } else { var(success, instance) = await Factorio.TryLoadAsync(dir); if (success) { var managed = Program.Manager.AddInstance(instance !); if (!Program.Settings.TryGet(SettingName.ExternalInstances, out List <string>?instPaths) || (instPaths is null)) { instPaths = new List <string>(); } instPaths.Add(dir.FullName); Program.Settings.Set(SettingName.ExternalInstances, instPaths); await Program.Settings.SaveAsync(); var vm = new FactorioInstanceViewModel(Program.Manager, managed); _instances.Add(vm); } else { // Loading failed } } } } }
public unsafe Task <string?> ShowDialogAsync(OpenSingleFileDialog dialog, Window parent) { var hWnd = parent?.PlatformImpl?.Handle?.Handle ?? IntPtr.Zero; return(Task.Factory.StartNew(() => { Guid clsid = UnmanagedMethods.ShellIds.OpenFileDialog; Guid iid = UnmanagedMethods.ShellIds.IFileDialog; UnmanagedMethods.CoCreateInstance(ref clsid, IntPtr.Zero, 1, ref iid, out var unk); var frm = (UnmanagedMethods.IFileDialog)unk; frm.GetOptions(out uint options); options |= (uint)DefaultDialogOptions; frm.SetOptions(options); frm.SetTitle(dialog.Title ?? string.Empty); var filters = new[] { new UnmanagedMethods.COMDLG_FILTERSPEC { pszName = dialog.FilterName ?? string.Empty, pszSpec = dialog.FileName ?? "*.*" } }; frm.SetFileTypes((uint)filters.Length, filters); frm.SetFileTypeIndex(0); if (dialog.Directory != null) { Guid riid = UnmanagedMethods.ShellIds.IShellItem; if (UnmanagedMethods.SHCreateItemFromParsingName(dialog.Directory, IntPtr.Zero, ref riid, out var directoryShellItem) == (uint)UnmanagedMethods.HRESULT.S_OK) { frm.SetFolder(directoryShellItem); frm.SetDefaultFolder(directoryShellItem); } } if (frm.Show(hWnd) == (uint)UnmanagedMethods.HRESULT.S_OK) { if (frm.GetResult(out var shellItem) == (uint)UnmanagedMethods.HRESULT.S_OK) { return GetAbsoluteFilePath(shellItem); } } return null; })); }