diff --git a/ModpackUpdater.Apps.Client/Form1.Designer.cs b/ModpackUpdater.Apps.Client/Form1.Designer.cs index 2ebff1b..886d3cc 100644 --- a/ModpackUpdater.Apps.Client/Form1.Designer.cs +++ b/ModpackUpdater.Apps.Client/Form1.Designer.cs @@ -41,7 +41,9 @@ namespace ModpackUpdater.Apps.Client RadLabel_Status = new Telerik.WinControls.UI.RadLabel(); RadTextBox_MinecraftProfileFolder = new Telerik.WinControls.UI.RadTextBox(); RadTextBox_ModpackConfig = new Telerik.WinControls.UI.RadTextBox(); - RadButton_Install = new Telerik.WinControls.UI.RadButton(); + RadButton_Install = new Telerik.WinControls.UI.RadSplitButton(); + radMenuItem_Install = new Telerik.WinControls.UI.RadMenuItem(); + radMenuItem_Repair = new Telerik.WinControls.UI.RadMenuItem(); RadButton_CheckForUpdates = new Telerik.WinControls.UI.RadButton(); RadButton_PasteModpackConfig = new Telerik.WinControls.UI.RadButton(); RadButton_SearchMinecraftProfileFolder = new Telerik.WinControls.UI.RadButton(); @@ -137,6 +139,7 @@ namespace ModpackUpdater.Apps.Client RadButton_Install.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; tableLayoutPanel1.SetColumnSpan(RadButton_Install, 2); RadButton_Install.ImageAlignment = ContentAlignment.MiddleRight; + RadButton_Install.Items.AddRange(new Telerik.WinControls.RadItem[] { radMenuItem_Install, radMenuItem_Repair }); RadButton_Install.Location = new Point(325, 213); RadButton_Install.Name = "RadButton_Install"; RadButton_Install.Size = new Size(94, 24); @@ -146,14 +149,26 @@ namespace ModpackUpdater.Apps.Client RadButton_Install.TextImageRelation = TextImageRelation.ImageBeforeText; RadButton_Install.Click += ButtonX_StartUpdate_Click; // + // radMenuItem_Install + // + radMenuItem_Install.Name = "radMenuItem_Install"; + radMenuItem_Install.Text = "Install"; + radMenuItem_Install.Click += RadMenuItem_Install_Click; + // + // radMenuItem_Repair + // + radMenuItem_Repair.Name = "radMenuItem_Repair"; + radMenuItem_Repair.Text = "Repair"; + radMenuItem_Repair.Click += RadMenuItem_Repair_Click; + // // RadButton_CheckForUpdates // RadButton_CheckForUpdates.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - tableLayoutPanel1.SetColumnSpan(RadButton_CheckForUpdates, 3); + tableLayoutPanel1.SetColumnSpan(RadButton_CheckForUpdates, 4); RadButton_CheckForUpdates.ImageAlignment = ContentAlignment.MiddleRight; - RadButton_CheckForUpdates.Location = new Point(175, 213); + RadButton_CheckForUpdates.Location = new Point(153, 213); RadButton_CheckForUpdates.Name = "RadButton_CheckForUpdates"; - RadButton_CheckForUpdates.Size = new Size(144, 24); + RadButton_CheckForUpdates.Size = new Size(166, 24); RadButton_CheckForUpdates.TabIndex = 0; RadButton_CheckForUpdates.Text = "Check for Updates"; RadButton_CheckForUpdates.TextAlignment = ContentAlignment.MiddleLeft; @@ -200,7 +215,6 @@ namespace ModpackUpdater.Apps.Client tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F)); tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F)); tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F)); - tableLayoutPanel1.Controls.Add(RadButton_CheckForUpdates, 2, 7); tableLayoutPanel1.Controls.Add(RadLabel1, 0, 0); tableLayoutPanel1.Controls.Add(RadLabel2, 0, 2); tableLayoutPanel1.Controls.Add(RadTextBox_MinecraftProfileFolder, 1, 0); @@ -214,6 +228,7 @@ namespace ModpackUpdater.Apps.Client tableLayoutPanel1.Controls.Add(radButton_PasteInstallKey, 5, 5); tableLayoutPanel1.Controls.Add(RadButton_PasteModpackConfig, 5, 3); tableLayoutPanel1.Controls.Add(radButton_RefreshConfig, 4, 3); + tableLayoutPanel1.Controls.Add(RadButton_CheckForUpdates, 1, 7); tableLayoutPanel1.Dock = DockStyle.Fill; tableLayoutPanel1.Location = new Point(0, 0); tableLayoutPanel1.Name = "tableLayoutPanel1"; @@ -321,7 +336,7 @@ namespace ModpackUpdater.Apps.Client internal Telerik.WinControls.UI.RadLabel RadLabel_Status; internal Telerik.WinControls.UI.RadTextBox RadTextBox_MinecraftProfileFolder; internal Telerik.WinControls.UI.RadTextBox RadTextBox_ModpackConfig; - internal Telerik.WinControls.UI.RadButton RadButton_Install; + internal Telerik.WinControls.UI.RadSplitButton RadButton_Install; internal Telerik.WinControls.UI.RadButton RadButton_CheckForUpdates; internal Telerik.WinControls.UI.RadButton RadButton_SearchMinecraftProfileFolder; internal Telerik.WinControls.UI.RadButton RadButton_PasteModpackConfig; @@ -330,5 +345,7 @@ namespace ModpackUpdater.Apps.Client internal Telerik.WinControls.UI.RadLabel radLabel4; internal Telerik.WinControls.UI.RadTextBox radTextBox_InstallKey; internal Telerik.WinControls.UI.RadButton radButton_PasteInstallKey; + private Telerik.WinControls.UI.RadMenuItem radMenuItem_Repair; + private Telerik.WinControls.UI.RadMenuItem radMenuItem_Install; } } \ No newline at end of file diff --git a/ModpackUpdater.Apps.Client/Form1.cs b/ModpackUpdater.Apps.Client/Form1.cs index 80ed7bc..549ed88 100644 --- a/ModpackUpdater.Apps.Client/Form1.cs +++ b/ModpackUpdater.Apps.Client/Form1.cs @@ -33,13 +33,16 @@ public partial class Form1 InitializeComponent(); Text = $"{Text} (v{Assembly.GetExecutingAssembly().GetAppVersion()})"; + RadButton_Install.DefaultItem = radMenuItem_Install; - RadButton_Install.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.software_installer, SymbolSize.Small); RadButton_CheckForUpdates.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.update_done, SymbolSize.Small); radButton_RefreshConfig.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.refresh, SymbolSize.Small); RadButton_SearchMinecraftProfileFolder.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.opened_folder, SymbolSize.Small); radButton_PasteInstallKey.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.paste, SymbolSize.Small); RadButton_PasteModpackConfig.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.paste, SymbolSize.Small); + RadButton_Install.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.software_installer, SymbolSize.Small); + radMenuItem_Install.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.software_installer, SymbolSize.Small); + radMenuItem_Repair.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.wrench, SymbolSize.Small); } private void LoadMinecraftProfile(string folderPath) @@ -142,7 +145,7 @@ public partial class Form1 return true; } - private async Task ExecuteUpdate(bool doInstall) + private async Task ExecuteUpdate(bool doInstall, bool repair) { var updater = new ModpackInstaller(updateConfig, modpackInfo) { @@ -173,18 +176,21 @@ public partial class Form1 } // Check only if not pressed "install", not really needed otherwise. - if (lastUpdateCheckResult is null || !doInstall) + if (lastUpdateCheckResult is null || !doInstall || repair) { SetStatus(LangRes.StatusText_CheckingForUpdates, AppGlobals.Symbols.GetSvgImage(AppSymbols.update_done, SymbolSize.Small)); // Check for extras once again updateOptions.IncludeExtras = features.IsEnabled(ModpackFeatures.FeatureAllowExtas, new AllowExtrasFeatureContext(modpackInfo)); + // Force re-install on repair + updateOptions.IgnoreInstalledVersion = repair; + try { lastUpdateCheckResult = await updater.Check(updateOptions); } - catch(Exception) + catch (Exception) { error(); if (Debugger.IsAttached) @@ -201,7 +207,7 @@ public partial class Form1 error(); return; } - + // No updates available if (!lastUpdateCheckResult.HasUpdates) { @@ -277,15 +283,28 @@ public partial class Form1 private async void ButtonX_CheckForUpdates_Click(object sender, EventArgs e) { ClearStatus(); - await ExecuteUpdate(false); + await ExecuteUpdate(false, false); } private async void ButtonX_StartUpdate_Click(object sender, EventArgs e) + { + } + + private async void RadMenuItem_Install_Click(object sender, EventArgs e) { if (!currentUpdating) { ClearStatus(); - await ExecuteUpdate(true); + await ExecuteUpdate(true, false); + } + } + + private async void RadMenuItem_Repair_Click(object sender, EventArgs e) + { + if (!currentUpdating) + { + ClearStatus(); + await ExecuteUpdate(true, true); } } diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index 02bdf98..06e08e2 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -64,10 +64,13 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf } installInfos = await DownloadInstallInfos(); - result.CurrentVersion = modpackInfo.Version ?? new Version("0.0.0.0"); + if (options.IgnoreInstalledVersion || modpackInfo.Version == null) + result.CurrentVersion = new Version("0.0.0.0"); + else + result.CurrentVersion = modpackInfo.Version; // Check install actions - if (!exists) + if (!exists || options.IgnoreInstalledVersion) { result.IsInstalled = false; diff --git a/ModpackUpdater.Manager/UpdateCheckOptions.cs b/ModpackUpdater.Manager/UpdateCheckOptions.cs index e27697d..66c3dcc 100644 --- a/ModpackUpdater.Manager/UpdateCheckOptions.cs +++ b/ModpackUpdater.Manager/UpdateCheckOptions.cs @@ -7,4 +7,5 @@ public class UpdateCheckOptions public bool AllowUpdaterAfterInstall { get; set; } = true; public Side Side { get; set; } = Side.Client; public bool IncludeExtras { get; set; } + public bool IgnoreInstalledVersion { get; set; } }