diff --git a/Wabbajack.App.Wpf/View Models/MainWindowVM.cs b/Wabbajack.App.Wpf/View Models/MainWindowVM.cs index 2274dfab..3ac56faa 100644 --- a/Wabbajack.App.Wpf/View Models/MainWindowVM.cs +++ b/Wabbajack.App.Wpf/View Models/MainWindowVM.cs @@ -132,12 +132,13 @@ namespace Wabbajack try { var assembly = Assembly.GetExecutingAssembly(); - var location = assembly.Location; - if (string.IsNullOrWhiteSpace(location)) - location = Process.GetCurrentProcess().MainModule?.FileName ?? throw new Exception("Assembly location is unavailable!"); + var assemblyLocation = assembly.Location; + var processLocation = Process.GetCurrentProcess().MainModule?.FileName ?? throw new Exception("Process location is unavailable!"); - _logger.LogInformation("App Location: {Location}", assembly.Location); - var fvi = FileVersionInfo.GetVersionInfo(location); + _logger.LogInformation("Assembly Location: {AssemblyLocation}", assemblyLocation); + _logger.LogInformation("Process Location: {ProcessLocation}", processLocation); + + var fvi = FileVersionInfo.GetVersionInfo(string.IsNullOrWhiteSpace(assemblyLocation) ? processLocation : assemblyLocation); Consts.CurrentMinimumWabbajackVersion = Version.Parse(fvi.FileVersion); VersionDisplay = $"v{fvi.FileVersion}"; AppName = "WABBAJACK " + VersionDisplay; @@ -151,7 +152,7 @@ namespace Wabbajack { var applicationRegistrationService = _serviceProvider.GetRequiredService(); - var applicationInfo = new ApplicationInfo("Wabbajack", "Wabbajack", "Wabbajack", location); + var applicationInfo = new ApplicationInfo("Wabbajack", "Wabbajack", "Wabbajack", processLocation); applicationInfo.SupportedExtensions.Add("wabbajack"); applicationRegistrationService.RegisterApplication(applicationInfo); } diff --git a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml index c1fb0b94..b88638c3 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml +++ b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml @@ -165,7 +165,11 @@ - + + + @@ -179,7 +183,11 @@ - + + + diff --git a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs index da3702f7..b5abf0f2 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs @@ -219,6 +219,7 @@ namespace Wabbajack .DisposeWith(disposables); AddInclude.Command = ReactiveCommand.CreateFromTask(async () => await AddIncludeCommand()); + AddIncludeFiles.Command = ReactiveCommand.CreateFromTask(async () => await AddIncludeFilesCommand()); ViewModel.WhenAnyValue(vm => vm.Ignore) .WhereNotNull() @@ -227,6 +228,7 @@ namespace Wabbajack .DisposeWith(disposables); AddIgnore.Command = ReactiveCommand.CreateFromTask(async () => await AddIgnoreCommand()); + AddIgnoreFiles.Command = ReactiveCommand.CreateFromTask(async () => await AddIgnoreFilesCommand()); }); @@ -258,16 +260,19 @@ namespace Wabbajack EnsurePathExists = true, EnsureReadOnly = false, EnsureValidNames = true, - Multiselect = false, + Multiselect = true, ShowPlacesList = true, }; if (dlg.ShowDialog() != CommonFileDialogResult.Ok) return; - var selectedPath = dlg.FileNames.First().ToAbsolutePath(); + foreach (var fileName in dlg.FileNames) + { + var selectedPath = fileName.ToAbsolutePath(); - if (!selectedPath.InFolder(ViewModel.Source)) return; - - ViewModel.AddAlwaysEnabled(selectedPath.RelativeTo(ViewModel.Source)); + if (!selectedPath.InFolder(ViewModel.Source)) continue; + + ViewModel.AddAlwaysEnabled(selectedPath.RelativeTo(ViewModel.Source)); + } } public async Task AddOtherProfileCommand() @@ -295,16 +300,19 @@ namespace Wabbajack EnsurePathExists = true, EnsureReadOnly = false, EnsureValidNames = true, - Multiselect = false, + Multiselect = true, ShowPlacesList = true, }; if (dlg.ShowDialog() != CommonFileDialogResult.Ok) return; - var selectedPath = dlg.FileNames.First().ToAbsolutePath(); - - if (!selectedPath.InFolder(ViewModel.Source.Combine("profiles"))) return; - - ViewModel.AddOtherProfile(selectedPath.FileName.ToString()); + foreach (var filename in dlg.FileNames) + { + var selectedPath = filename.ToAbsolutePath(); + + if (!selectedPath.InFolder(ViewModel.Source.Combine("profiles"))) continue; + + ViewModel.AddOtherProfile(selectedPath.FileName.ToString()); + } } public Task AddNoMatchIncludeCommand() @@ -321,16 +329,20 @@ namespace Wabbajack EnsurePathExists = true, EnsureReadOnly = false, EnsureValidNames = true, - Multiselect = false, + Multiselect = true, ShowPlacesList = true, }; if (dlg.ShowDialog() != CommonFileDialogResult.Ok) return Task.CompletedTask; - var selectedPath = dlg.FileNames.First().ToAbsolutePath(); + foreach (var filename in dlg.FileNames) + { + var selectedPath = filename.ToAbsolutePath(); - if (!selectedPath.InFolder(ViewModel.Source)) return Task.CompletedTask; + if (!selectedPath.InFolder(ViewModel.Source)) continue; + + ViewModel.AddNoMatchInclude(selectedPath.RelativeTo(ViewModel!.Source)); + } - ViewModel.AddNoMatchInclude(selectedPath.RelativeTo(ViewModel!.Source)); return Task.CompletedTask; } @@ -338,7 +350,7 @@ namespace Wabbajack { var dlg = new CommonOpenFileDialog { - Title = "Please select a file to include", + Title = "Please select folders to include", IsFolderPicker = true, InitialDirectory = ViewModel!.Source.ToString(), AddToMostRecentlyUsedList = false, @@ -348,23 +360,55 @@ namespace Wabbajack EnsurePathExists = true, EnsureReadOnly = false, EnsureValidNames = true, - Multiselect = false, + Multiselect = true, ShowPlacesList = true, }; if (dlg.ShowDialog() != CommonFileDialogResult.Ok) return; - var selectedPath = dlg.FileNames.First().ToAbsolutePath(); + foreach (var filename in dlg.FileNames) + { + var selectedPath = filename.ToAbsolutePath(); - if (!selectedPath.InFolder(ViewModel.Source)) return; + if (!selectedPath.InFolder(ViewModel.Source)) continue; - ViewModel.AddInclude(selectedPath.RelativeTo(ViewModel!.Source)); + ViewModel.AddInclude(selectedPath.RelativeTo(ViewModel!.Source)); + } + } + + public async Task AddIncludeFilesCommand() + { + var dlg = new CommonOpenFileDialog + { + Title = "Please select files to include", + IsFolderPicker = false, + InitialDirectory = ViewModel!.Source.ToString(), + AddToMostRecentlyUsedList = false, + AllowNonFileSystemItems = false, + DefaultDirectory = ViewModel!.Source.ToString(), + EnsureFileExists = true, + EnsurePathExists = true, + EnsureReadOnly = false, + EnsureValidNames = true, + Multiselect = true, + ShowPlacesList = true, + }; + + if (dlg.ShowDialog() != CommonFileDialogResult.Ok) return; + foreach (var filename in dlg.FileNames) + { + var selectedPath = filename.ToAbsolutePath(); + + if (!selectedPath.InFolder(ViewModel.Source)) continue; + + ViewModel.AddInclude(selectedPath.RelativeTo(ViewModel!.Source)); + } } public async Task AddIgnoreCommand() { var dlg = new CommonOpenFileDialog { - Title = "Please select a file to ignore", + Title = "Please select folders to ignore", IsFolderPicker = true, InitialDirectory = ViewModel!.Source.ToString(), AddToMostRecentlyUsedList = false, @@ -374,16 +418,48 @@ namespace Wabbajack EnsurePathExists = true, EnsureReadOnly = false, EnsureValidNames = true, - Multiselect = false, + Multiselect = true, ShowPlacesList = true, }; if (dlg.ShowDialog() != CommonFileDialogResult.Ok) return; - var selectedPath = dlg.FileNames.First().ToAbsolutePath(); + foreach (var filename in dlg.FileNames) + { + var selectedPath = filename.ToAbsolutePath(); - if (!selectedPath.InFolder(ViewModel.Source)) return; + if (!selectedPath.InFolder(ViewModel.Source)) continue; - ViewModel.AddIgnore(selectedPath.RelativeTo(ViewModel!.Source)); + ViewModel.AddIgnore(selectedPath.RelativeTo(ViewModel!.Source)); + } + } + + public async Task AddIgnoreFilesCommand() + { + var dlg = new CommonOpenFileDialog + { + Title = "Please select files to ignore", + IsFolderPicker = false, + InitialDirectory = ViewModel!.Source.ToString(), + AddToMostRecentlyUsedList = false, + AllowNonFileSystemItems = false, + DefaultDirectory = ViewModel!.Source.ToString(), + EnsureFileExists = true, + EnsurePathExists = true, + EnsureReadOnly = false, + EnsureValidNames = true, + Multiselect = true, + ShowPlacesList = true, + }; + + if (dlg.ShowDialog() != CommonFileDialogResult.Ok) return; + foreach (var filename in dlg.FileNames) + { + var selectedPath = filename.ToAbsolutePath(); + + if (!selectedPath.InFolder(ViewModel.Source)) continue; + + ViewModel.AddIgnore(selectedPath.RelativeTo(ViewModel!.Source)); + } } } } diff --git a/Wabbajack.Compiler/CompilerSettings.cs b/Wabbajack.Compiler/CompilerSettings.cs index 8dddaa71..57c97eff 100644 --- a/Wabbajack.Compiler/CompilerSettings.cs +++ b/Wabbajack.Compiler/CompilerSettings.cs @@ -64,7 +64,7 @@ public class CompilerSettings public RelativePath[] Include { get; set; } = Array.Empty(); /// - /// These files are inlined into the modlist + /// These files are ignored when compiling the modlist /// public RelativePath[] Ignore { get; set; } = Array.Empty(); diff --git a/Wabbajack.DTOs/Game/GameRegistry.cs b/Wabbajack.DTOs/Game/GameRegistry.cs index 087522df..276356b0 100644 --- a/Wabbajack.DTOs/Game/GameRegistry.cs +++ b/Wabbajack.DTOs/Game/GameRegistry.cs @@ -107,6 +107,12 @@ public static class GameRegistry MO2Name = "Skyrim Special Edition", MO2ArchiveName = "skyrimse", SteamIDs = new[] {489830}, + GOGIDs = new[] + { + 1711230643,// The Elder Scrolls V: Skyrim Special Edition AKA Base Game + 1801825368,// The Elder Scrolls V: Skyrim Anniversary Edition AKA The Store Bundle + 1162721350 // Upgrade DLC + }, RequiredFiles = new[] { "SkyrimSE.exe".ToRelativePath()