diff --git a/Wabbajack.CLI/Verbs/Changelog.cs b/Wabbajack.CLI/Verbs/Changelog.cs index 63549a01..04d8adac 100644 --- a/Wabbajack.CLI/Verbs/Changelog.cs +++ b/Wabbajack.CLI/Verbs/Changelog.cs @@ -1,7 +1,6 @@ using System; using System.Linq; using System.Text; -using System.Text.RegularExpressions; using System.Threading.Tasks; using Alphaleonis.Win32.Filesystem; using CommandLine; @@ -38,7 +37,7 @@ namespace Wabbajack.CLI.Verbs protected override async Task Run() { - var orignalPath = (AbsolutePath)Original; + var originalPath = (AbsolutePath)Original; var updatePath = (AbsolutePath)Update; if (Original == null) return ExitCode.BadArguments; @@ -49,7 +48,7 @@ namespace Wabbajack.CLI.Verbs try { - original = AInstaller.LoadFromFile(orignalPath); + original = AInstaller.LoadFromFile(originalPath); } catch (Exception e) { @@ -74,22 +73,8 @@ namespace Wabbajack.CLI.Verbs var downloadSizeChanges = original.DownloadSize - update.DownloadSize; var installSizeChanges = original.InstallSize - update.InstallSize; - var versionRegex = new Regex(@"\s([0-9](\.|\s)?){1,4}"); - var matchOriginal = versionRegex.Match(original.Name); - var matchUpdated = versionRegex.Match(update.Name); - - if (!matchOriginal.Success || !matchUpdated.Success) - { - return CLIUtils.Exit( - !matchOriginal.Success - ? "The name of the original modlist did not match the version check regex!" - : "The name of the updated modlist did not match the version check regex!", ExitCode.Error); - } - - var version = matchUpdated.Value.Trim(); - var mdText = - $"## {version}\n\n" + + $"## {update.Version}\n\n" + $"**Build at:** `{File.GetCreationTime(Update)}`\n\n" + "**Info**:\n\n" + $"- Download Size change: {downloadSizeChanges.ToFileSizeString()} (Total: {update.DownloadSize.ToFileSizeString()})\n" + @@ -153,20 +138,20 @@ namespace Wabbajack.CLI.Verbs if (IncludeLoadOrderChanges) { - var loadorder_txt = (RelativePath)"loadorder.txt"; + var loadorderTxt = (RelativePath)"loadorder.txt"; var originalLoadOrderFile = original.Directives .Where(d => d is InlineFile) - .Where(d => d.To.FileName == loadorder_txt) + .Where(d => d.To.FileName == loadorderTxt) .Cast() .First(); var updatedLoadOrderFile = update.Directives .Where(d => d is InlineFile) - .Where(d => d.To.FileName == loadorder_txt) + .Where(d => d.To.FileName == loadorderTxt) .Cast() .First(); - var originalLoadOrder = GetTextFileFromModlist(orignalPath, original, originalLoadOrderFile.SourceDataID).Result.Split("\n"); + var originalLoadOrder = GetTextFileFromModlist(originalPath, original, originalLoadOrderFile.SourceDataID).Result.Split("\n"); var updatedLoadOrder = GetTextFileFromModlist(updatePath, update, updatedLoadOrderFile.SourceDataID).Result.Split("\n"); var addedPlugins = updatedLoadOrder @@ -208,7 +193,7 @@ namespace Wabbajack.CLI.Verbs .Cast() .First(); - var originalModlist = GetTextFileFromModlist(orignalPath, original, originalModlistFile.SourceDataID).Result.Split("\n"); + var originalModlist = GetTextFileFromModlist(originalPath, original, originalModlistFile.SourceDataID).Result.Split("\n"); var updatedModlist = GetTextFileFromModlist(updatePath, update, updatedModlistFile.SourceDataID).Result.Split("\n"); var removedMods = originalModlist @@ -294,7 +279,7 @@ namespace Wabbajack.CLI.Verbs if (hasToc) { - markdown.Insert(tocLine, $"- [{version}](#{ToTocLink(version)})"); + markdown.Insert(tocLine, $"- [{update.Version}](#{ToTocLink(update.Version.ToString())})"); line++; } @@ -307,7 +292,7 @@ namespace Wabbajack.CLI.Verbs } var text = "# Changelog\n\n" + - $"- [{version}](#{ToTocLink(version)})\n\n" + + $"- [{update.Version}](#{ToTocLink(update.Version.ToString())})\n\n" + $"{mdText}"; File.WriteAllText(output, text); diff --git a/Wabbajack.Common/Consts.cs b/Wabbajack.Common/Consts.cs index 7e5afe20..1b2e0c01 100644 --- a/Wabbajack.Common/Consts.cs +++ b/Wabbajack.Common/Consts.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; +using System.Text.RegularExpressions; using Alphaleonis.Win32.Filesystem; using Wabbajack.Common.IO; diff --git a/Wabbajack.Lib/ACompiler.cs b/Wabbajack.Lib/ACompiler.cs index a45eb9a4..b3c7118d 100644 --- a/Wabbajack.Lib/ACompiler.cs +++ b/Wabbajack.Lib/ACompiler.cs @@ -16,6 +16,7 @@ namespace Wabbajack.Lib public abstract class ACompiler : ABatchProcessor { public string? ModListName, ModListAuthor, ModListDescription, ModListWebsite, ModlistReadme; + public Version? ModlistVersion; public AbsolutePath ModListImage; protected Version? WabbajackVersion; diff --git a/Wabbajack.Lib/Data.cs b/Wabbajack.Lib/Data.cs index bd01830f..2c6a63cb 100644 --- a/Wabbajack.Lib/Data.cs +++ b/Wabbajack.Lib/Data.cs @@ -95,6 +95,11 @@ namespace Wabbajack.Lib /// public Uri? Website; + /// + /// Current Version of the Modlist + /// + public Version Version = new Version(1, 0, 0, 0); + /// /// The size of all the archives once they're downloaded /// diff --git a/Wabbajack.Lib/Manifest.cs b/Wabbajack.Lib/Manifest.cs index 1aa4d846..bfb527d0 100644 --- a/Wabbajack.Lib/Manifest.cs +++ b/Wabbajack.Lib/Manifest.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using Wabbajack.Common; using Wabbajack.Common.Serialization.Json; @@ -9,6 +10,7 @@ namespace Wabbajack.Lib public class Manifest { public string Name; + public Version Version; public string Author; public string Description; @@ -28,6 +30,7 @@ namespace Wabbajack.Lib public Manifest(ModList modlist) { Name = modlist.Name; + Version = modlist.Version; Author = modlist.Author; Description = modlist.Description; diff --git a/Wabbajack/Settings.cs b/Wabbajack/Settings.cs index f51dbbc6..5c206107 100644 --- a/Wabbajack/Settings.cs +++ b/Wabbajack/Settings.cs @@ -119,6 +119,7 @@ namespace Wabbajack public class CompilationModlistSettings { public string ModListName { get; set; } + public string Version { get; set; } public string Author { get; set; } public string Description { get; set; } public string Website { get; set; } diff --git a/Wabbajack/View Models/Compilers/MO2CompilerVM.cs b/Wabbajack/View Models/Compilers/MO2CompilerVM.cs index 1020646e..69bb833f 100644 --- a/Wabbajack/View Models/Compilers/MO2CompilerVM.cs +++ b/Wabbajack/View Models/Compilers/MO2CompilerVM.cs @@ -188,6 +188,7 @@ namespace Wabbajack ModListWebsite = ModlistSettings.Website, ModlistReadme = ModlistSettings.Readme, MO2DownloadsFolder = DownloadLocation.TargetPath, + ModlistVersion = ModlistSettings.Version }) { Parent.MWVM.Settings.Performance.AttachToBatchProcessor(ActiveCompilation); diff --git a/Wabbajack/View Models/Compilers/ModlistSettingsEditorVM.cs b/Wabbajack/View Models/Compilers/ModlistSettingsEditorVM.cs index 0c8da20b..623bed28 100644 --- a/Wabbajack/View Models/Compilers/ModlistSettingsEditorVM.cs +++ b/Wabbajack/View Models/Compilers/ModlistSettingsEditorVM.cs @@ -5,6 +5,7 @@ using DynamicData; using Microsoft.WindowsAPICodePack.Dialogs; using ReactiveUI; using ReactiveUI.Fody.Helpers; +using Wabbajack.Common; using Wabbajack.Lib; namespace Wabbajack @@ -16,6 +17,12 @@ namespace Wabbajack [Reactive] public string ModListName { get; set; } + [Reactive] + public string VersionText { get; set; } + + private ObservableAsPropertyHelper _version; + public Version Version => _version.Value; + [Reactive] public string AuthorText { get; set; } @@ -35,15 +42,29 @@ namespace Wabbajack public ModlistSettingsEditorVM(CompilationModlistSettings settings) { _settings = settings; - ImagePath = new FilePickerVM() + ImagePath = new FilePickerVM { ExistCheckOption = FilePickerVM.CheckOptions.IfPathNotEmpty, PathType = FilePickerVM.PathTypeOptions.File, }; ImagePath.Filters.Add(new CommonFileDialogFilter("Banner image", "*.png")); + _version = this.WhenAny(x => x.VersionText) + .Select(x => + { + if (string.IsNullOrWhiteSpace(x)) + return new Version(0, 0); + + return !Version.TryParse(x, out var version) ? new Version(0, 0) : version; + }).ObserveOnGuiThread() + .ToProperty(this, x => x.Version); + InError = this.WhenAny(x => x.ImagePath.ErrorState) .Select(err => err.Failed) + .CombineLatest( + this.WhenAny(x => x.VersionText) + .Select(x => Version.TryParse(x, out _)), + (image, version) => !image && !version) .Publish() .RefCount(); } @@ -59,10 +80,12 @@ namespace Wabbajack Readme = _settings.Readme; ImagePath.TargetPath = _settings.SplashScreen; Website = _settings.Website; + VersionText = _settings.Version; } public void Save() { + _settings.Version = VersionText; _settings.Author = AuthorText; _settings.ModListName = ModListName; _settings.Description = Description; diff --git a/Wabbajack/View Models/ModListVM.cs b/Wabbajack/View Models/ModListVM.cs index d95ffb47..accf12bb 100644 --- a/Wabbajack/View Models/ModListVM.cs +++ b/Wabbajack/View Models/ModListVM.cs @@ -21,6 +21,7 @@ namespace Wabbajack public string Description => SourceModList?.Description; public Uri Website => SourceModList?.Website; public ModManager ModManager => SourceModList?.ModManager ?? ModManager.MO2; + public Version Version => SourceModList?.Version; // Image isn't exposed as a direct property, but as an observable. // This acts as a caching mechanism, as interested parties will trigger it to be created, diff --git a/Wabbajack/Views/Compilers/CompilerView.xaml b/Wabbajack/Views/Compilers/CompilerView.xaml index f3b51d86..8121d81b 100644 --- a/Wabbajack/Views/Compilers/CompilerView.xaml +++ b/Wabbajack/Views/Compilers/CompilerView.xaml @@ -121,6 +121,8 @@ + + diff --git a/Wabbajack/Views/Compilers/CompilerView.xaml.cs b/Wabbajack/Views/Compilers/CompilerView.xaml.cs index 7824b559..5b5b4d2b 100644 --- a/Wabbajack/Views/Compilers/CompilerView.xaml.cs +++ b/Wabbajack/Views/Compilers/CompilerView.xaml.cs @@ -63,6 +63,8 @@ namespace Wabbajack .DisposeWith(dispose); this.BindStrict(this.ViewModel, x => x.CurrentModlistSettings.ModListName, x => x.ModListNameSetting.Text) .DisposeWith(dispose); + this.BindStrict(ViewModel, x => x.CurrentModlistSettings.VersionText, x => x.VersionSetting.Text) + .DisposeWith(dispose); this.BindStrict(this.ViewModel, x => x.CurrentModlistSettings.AuthorText, x => x.AuthorNameSetting.Text) .DisposeWith(dispose); this.BindStrict(this.ViewModel, x => x.CurrentModlistSettings.Description, x => x.DescriptionSetting.Text) diff --git a/Wabbajack/Views/ManifestView.xaml b/Wabbajack/Views/ManifestView.xaml index a650488d..282839ec 100644 --- a/Wabbajack/Views/ManifestView.xaml +++ b/Wabbajack/Views/ManifestView.xaml @@ -24,7 +24,8 @@ - + + diff --git a/Wabbajack/Views/ManifestView.xaml.cs b/Wabbajack/Views/ManifestView.xaml.cs index f7775036..07a102e9 100644 --- a/Wabbajack/Views/ManifestView.xaml.cs +++ b/Wabbajack/Views/ManifestView.xaml.cs @@ -20,8 +20,7 @@ namespace Wabbajack Modlist = modlist; var manifest = new Manifest(modlist); - if(ViewModel == null) - ViewModel = new ManifestVM(manifest); + ViewModel ??= new ManifestVM(manifest); InitializeComponent(); @@ -29,6 +28,8 @@ namespace Wabbajack { this.OneWayBind(ViewModel, x => x.Name, x => x.Name.Text) .DisposeWith(disposable); + this.OneWayBind(ViewModel, x => x.Manifest.Version, x => x.Version.Text) + .DisposeWith(disposable); this.OneWayBind(ViewModel, x => x.Author, x => x.Author.Text) .DisposeWith(disposable); this.OneWayBind(ViewModel, x => x.Description, x => x.Description.Text) diff --git a/Wabbajack/Views/TextViewer.xaml b/Wabbajack/Views/TextViewer.xaml deleted file mode 100644 index 19c3714a..00000000 --- a/Wabbajack/Views/TextViewer.xaml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - diff --git a/Wabbajack/Views/TextViewer.xaml.cs b/Wabbajack/Views/TextViewer.xaml.cs deleted file mode 100644 index 0677212b..00000000 --- a/Wabbajack/Views/TextViewer.xaml.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Wabbajack -{ - public partial class TextViewer - { - public TextViewer(string text, string title) - { - InitializeComponent(); - TextBlock.Text = text; - Title = title; - } - } -}