diff --git a/Knossos.NET/ViewModels/GlobalSettingsViewModel.cs b/Knossos.NET/ViewModels/GlobalSettingsViewModel.cs index 3347211a..14c4604b 100644 --- a/Knossos.NET/ViewModels/GlobalSettingsViewModel.cs +++ b/Knossos.NET/ViewModels/GlobalSettingsViewModel.cs @@ -1488,7 +1488,7 @@ internal async void InstallFS2Command() if (MainWindow.instance != null) { var dialog = new Fs2InstallerView(); - dialog.DataContext = new Fs2InstallerViewModel(); + dialog.DataContext = new Fs2InstallerViewModel(dialog); await dialog.ShowDialog(MainWindow.instance); } diff --git a/Knossos.NET/ViewModels/ModListViewModel.cs b/Knossos.NET/ViewModels/ModListViewModel.cs index 5fe61d9e..5c54f4ea 100644 --- a/Knossos.NET/ViewModels/ModListViewModel.cs +++ b/Knossos.NET/ViewModels/ModListViewModel.cs @@ -344,7 +344,7 @@ internal async void InstallFS2Command() if (MainWindow.instance != null) { var dialog = new Fs2InstallerView(); - dialog.DataContext = new Fs2InstallerViewModel(); + dialog.DataContext = new Fs2InstallerViewModel(dialog); await dialog.ShowDialog(MainWindow.instance); diff --git a/Knossos.NET/ViewModels/NebulaModListViewModel.cs b/Knossos.NET/ViewModels/NebulaModListViewModel.cs index 825fd80b..3ee3a4d6 100644 --- a/Knossos.NET/ViewModels/NebulaModListViewModel.cs +++ b/Knossos.NET/ViewModels/NebulaModListViewModel.cs @@ -397,7 +397,7 @@ internal async void InstallFS2Command() if (MainWindow.instance != null) { var dialog = new Fs2InstallerView(); - dialog.DataContext = new Fs2InstallerViewModel(); + dialog.DataContext = new Fs2InstallerViewModel(dialog); await dialog.ShowDialog(MainWindow.instance); Fs2Present = Knossos.retailFs2RootFound; diff --git a/Knossos.NET/ViewModels/Templates/DevModFsoSettingsViewModel.cs b/Knossos.NET/ViewModels/Templates/DevModFsoSettingsViewModel.cs index dcfc0218..0df97e23 100644 --- a/Knossos.NET/ViewModels/Templates/DevModFsoSettingsViewModel.cs +++ b/Knossos.NET/ViewModels/Templates/DevModFsoSettingsViewModel.cs @@ -35,13 +35,13 @@ private void LoadFsoPicker() { if (editor.ActiveVersion.modSettings.customBuildId == null) { - FsoPicker = new FsoBuildPickerViewModel(null); + FsoPicker = new FsoBuildPickerViewModel(null,null); } else { if (editor.ActiveVersion.modSettings.customBuildExec != null) { - FsoPicker = new FsoBuildPickerViewModel(new FsoBuild(editor.ActiveVersion.modSettings.customBuildExec)); + FsoPicker = new FsoBuildPickerViewModel(new FsoBuild(editor.ActiveVersion.modSettings.customBuildExec), null); } else { @@ -51,18 +51,18 @@ private void LoadFsoPicker() var theBuild = matchingBuilds.FirstOrDefault(build => build.version == editor.ActiveVersion.modSettings.customBuildVersion); if (theBuild != null) { - FsoPicker = new FsoBuildPickerViewModel(theBuild); + FsoPicker = new FsoBuildPickerViewModel(theBuild, null); } else { Log.Add(Log.LogSeverity.Warning, "DevModFsoSettingsViewModel.Constructor()", "Missing user-saved build version for mod: " + editor.ActiveVersion.tile + " - " + editor.ActiveVersion.version + " requested build id: " + editor.ActiveVersion.modSettings.customBuildId + " and version: " + editor.ActiveVersion.modSettings.customBuildVersion); - FsoPicker = new FsoBuildPickerViewModel(null); + FsoPicker = new FsoBuildPickerViewModel(null, null); } } else { Log.Add(Log.LogSeverity.Warning, "DevModFsoSettingsViewModel.Constructor()", "Missing user-saved build id for mod: " + editor.ActiveVersion.tile + " - " + editor.ActiveVersion.version + " requested build id: " + editor.ActiveVersion.modSettings.customBuildId); - FsoPicker = new FsoBuildPickerViewModel(null); + FsoPicker = new FsoBuildPickerViewModel(null, null); } } } diff --git a/Knossos.NET/ViewModels/Templates/FsoBuildPickerViewModel.cs b/Knossos.NET/ViewModels/Templates/FsoBuildPickerViewModel.cs index 96709ce6..3fc17aeb 100644 --- a/Knossos.NET/ViewModels/Templates/FsoBuildPickerViewModel.cs +++ b/Knossos.NET/ViewModels/Templates/FsoBuildPickerViewModel.cs @@ -16,6 +16,7 @@ namespace Knossos.NET.ViewModels public partial class FsoBuildPickerViewModel : ViewModelBase { private bool directSeparatorAdded = false; + private Window? window = null; [ObservableProperty] internal ObservableCollection buildItems = new ObservableCollection(); @@ -89,9 +90,15 @@ public FsoBuildPickerViewModel() { } - public FsoBuildPickerViewModel(FsoBuild? preSelected) + public FsoBuildPickerViewModel(Window window) + { + this.window = window; + } + + public FsoBuildPickerViewModel(FsoBuild? preSelected, Window? window) { FillBuildsItems(preSelected); + this.window = window; } /* @@ -292,7 +299,8 @@ internal async void OpenFileCommand() FilePickerOpenOptions options = new FilePickerOpenOptions(); options.AllowMultiple = false; options.Title = "Select the FSO executable file"; - var result = await MainWindow.instance.StorageProvider.OpenFilePickerAsync(options); + var topmostWindow = window == null ? MainWindow.instance! : window; + var result = await topmostWindow.StorageProvider.OpenFilePickerAsync(options); if (result != null && result.Count > 0) { diff --git a/Knossos.NET/ViewModels/Windows/Fs2InstallerViewModel.cs b/Knossos.NET/ViewModels/Windows/Fs2InstallerViewModel.cs index 0f3b00ac..66fb0669 100644 --- a/Knossos.NET/ViewModels/Windows/Fs2InstallerViewModel.cs +++ b/Knossos.NET/ViewModels/Windows/Fs2InstallerViewModel.cs @@ -11,6 +11,7 @@ using System.Threading.Tasks; using System.IO; using Avalonia.Platform.Storage; +using Avalonia.Controls; namespace Knossos.NET.ViewModels { @@ -54,6 +55,7 @@ public partial class Fs2InstallerViewModel : ViewModelBase [ObservableProperty] internal bool innoExtractIsAvailable = false; private string? gogExe = null; + private Window? window; public Fs2InstallerViewModel() { @@ -63,6 +65,15 @@ public Fs2InstallerViewModel() } } + public Fs2InstallerViewModel(Window window) + { + if (KnUtils.IsWindows || KnUtils.IsMacOS || KnUtils.IsLinux && (KnUtils.CpuArch == "X64" || KnUtils.CpuArch == "X86" || KnUtils.CpuArch == "Arm64" || KnUtils.CpuArch == "RiscV64")) + { + InnoExtractIsAvailable = true; + } + this.window = window; + } + /// /// The main install process /// @@ -336,7 +347,8 @@ internal async void LoadGoGExeCommand() FilePickerOpenOptions options = new FilePickerOpenOptions(); options.AllowMultiple = false; options.Title = "Select your Freespace 2 gog .exe installer file"; - var result = await MainWindow.instance!.StorageProvider.OpenFilePickerAsync(options); + var topmostWindow = window == null ? MainWindow.instance! : window; + var result = await topmostWindow.StorageProvider.OpenFilePickerAsync(options); if (result != null && result.Count > 0) { @@ -458,7 +470,8 @@ internal async void LoadFolderCommand() FolderPickerOpenOptions options = new FolderPickerOpenOptions(); options.AllowMultiple = false; options.Title = "Select your Freespace 2 retail folder"; - var result = await MainWindow.instance!.StorageProvider.OpenFolderPickerAsync(options); + var topmostWindow = window == null ? MainWindow.instance! : window; + var result = await topmostWindow.StorageProvider.OpenFolderPickerAsync(options); if (result != null && result.Count > 0) { diff --git a/Knossos.NET/ViewModels/Windows/ModSettingsViewModel.cs b/Knossos.NET/ViewModels/Windows/ModSettingsViewModel.cs index 5b28def8..d6570302 100644 --- a/Knossos.NET/ViewModels/Windows/ModSettingsViewModel.cs +++ b/Knossos.NET/ViewModels/Windows/ModSettingsViewModel.cs @@ -11,6 +11,7 @@ using System.IO; using VP.NET; using System.Diagnostics; +using Avalonia.Controls; namespace Knossos.NET.ViewModels { @@ -21,6 +22,7 @@ public partial class ModSettingsViewModel : ViewModelBase { private Mod? modJson; private ModCardViewModel? modCardViewModel; + private Window? window = null; internal ObservableCollection DepItems { get; set; } = new ObservableCollection(); @@ -61,6 +63,12 @@ public ModSettingsViewModel() fsoPicker = new FsoBuildPickerViewModel(); } + public ModSettingsViewModel(Window window) + { + fsoPicker = new FsoBuildPickerViewModel(window); + this.window = window; + } + /// /// Open Mod Settings of a certain, installed, Mod. /// If modcard is passed it will force a status icons update on Save() @@ -103,13 +111,13 @@ public ModSettingsViewModel(Mod modJson, ModCardViewModel? modCard=null) if(modJson.modSettings.customBuildId == null) { - fsoPicker = new FsoBuildPickerViewModel(null); + fsoPicker = new FsoBuildPickerViewModel(null, window); } else { if (modJson.modSettings.customBuildExec != null) { - fsoPicker = new FsoBuildPickerViewModel(new FsoBuild(modJson.modSettings.customBuildExec)); + fsoPicker = new FsoBuildPickerViewModel(new FsoBuild(modJson.modSettings.customBuildExec), window); } else { @@ -119,20 +127,20 @@ public ModSettingsViewModel(Mod modJson, ModCardViewModel? modCard=null) var theBuild = matchingBuilds.FirstOrDefault(build => build.version == modJson.modSettings.customBuildVersion); if (theBuild != null) { - fsoPicker = new FsoBuildPickerViewModel(theBuild); + fsoPicker = new FsoBuildPickerViewModel(theBuild, window); } else { Log.Add(Log.LogSeverity.Warning, "ModSettingsViewModel.Constructor()", "Missing user-saved build version for mod: " + modJson.title + " - " + modJson.version + " requested build id: " + modJson.modSettings.customBuildId + " and version: " + modJson.modSettings.customBuildVersion); BuildMissingWarning = "Missing user-saved build version for mod: " + modJson.title + " - " + modJson.version + " requested build id: " + modJson.modSettings.customBuildId + " and version: " + modJson.modSettings.customBuildVersion; - fsoPicker = new FsoBuildPickerViewModel(null); + fsoPicker = new FsoBuildPickerViewModel(null, window); } } else { Log.Add(Log.LogSeverity.Warning, "ModSettingsViewModel.Constructor()", "Missing user-saved build id for mod: " + modJson.title + " - " + modJson.version + " requested build id: " + modJson.modSettings.customBuildId); BuildMissingWarning = "Missing user-saved build id for mod: " + modJson.title + " - " + modJson.version + " requested build id: " + modJson.modSettings.customBuildId; - fsoPicker = new FsoBuildPickerViewModel(null); + fsoPicker = new FsoBuildPickerViewModel(null, window); } } } @@ -413,7 +421,7 @@ internal void ResetSettingsCommand() { CustomDependencies = false; BuildMissingWarning = string.Empty; - FsoPicker = new FsoBuildPickerViewModel(null); + FsoPicker = new FsoBuildPickerViewModel(null, window); FsoFlags = null; ConfigureBuild(true); DepItems.Clear();