Пример #1
0
        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
                        }
                    }
                }
            }
        }
Пример #2
0
        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;
            }));
        }