This commit is contained in:
2025-11-17 15:02:47 +01:00
parent d80f5c47b1
commit 7e2a103dbe
17 changed files with 182 additions and 78 deletions

View File

@@ -1,4 +1,5 @@
using System.Text;
using Avalonia.Media;
using ModpackUpdater.Apps.Manager.Api.Model;
using ModpackUpdater.Apps.Manager.LangRes;
using ModpackUpdater.Apps.Manager.Ui;
@@ -14,16 +15,26 @@ namespace ModpackUpdater.Apps.Manager.Features;
internal static class SharedFunctions
{
public static async Task<bool> CheckActionHealthy(IMainApi api, params MainWindowGridRow[] rows)
private static readonly IImage? imageSourceSuccess = AppGlobals.Symbols.GetImageSource(AppSymbols.done);
private static readonly IImage? imageSourceWorking = AppGlobals.Symbols.GetImageSource(AppSymbols.hourglass);
private static readonly IImage? imageSourceFailed = AppGlobals.Symbols.GetImageSource(AppSymbols.close);
public static async Task CheckActionHealthy(IMainApi api, params MainWindowGridRow[] rows)
{
var rowsCount = rows.Length;
var failed = false;
var msg = default(string);
var factory = new ModpackFactory();
api.Model.Progress.Value = 0;
api.Model.Progress.MaxValue = rowsCount;
api.Model.Progress.Visible = true;
for (var i = 0; i < rows.Length; i++)
for (var i = 0; i < rowsCount; i++)
{
var row = rows[i];
if (row.SourceType == SourceType.DirectLink)
continue;
row.StateImage = imageSourceWorking;
try
{
@@ -32,18 +43,17 @@ internal static class SharedFunctions
}
catch (Exception ex)
{
msg = ex.Message;
// Ignore
}
if (api.HasClosed)
return;
row.IsValid = !failed;
// rwb.Text = $"{i} / {rowsCount}";
row.StateImage = failed ? imageSourceFailed : imageSourceSuccess;
api.Model.Progress.Value = i;
}
if (rowsCount == 1 && failed && !string.IsNullOrWhiteSpace(msg))
_ = MessageBoxManager.GetMessageBoxStandard(string.Empty, msg).ShowAsPopupAsync(api.MainWindow);
return true;
api.Model.Progress.Visible = false;
}
public static async Task<bool> CollectUpdates(IMainApi api, params InstallAction[] actions)
@@ -53,7 +63,7 @@ internal static class SharedFunctions
// Collect updates
var result = await AvaloniaFlyoutBase.Show(new UpdatesCollectorView(api.Model.CurrentWorkspace, actions), api.MainWindow);
if (result.Result is not ModUpdates resultUpdates)
if (api.HasClosed || result.Result is not ModUpdates resultUpdates)
return false;
// Collect versions with changes
@@ -86,33 +96,55 @@ internal static class SharedFunctions
return true;
}
public static async Task FindNewDirectLinks(params MainWindowGridRow[] rows)
public static async Task FindNewDirectLinks(IMainApi api, params MainWindowGridRow[] rows)
{
var factory = new ModpackFactory();
foreach (var row in rows)
api.Model.Progress.Value = 0;
api.Model.Progress.MaxValue = rows.Length;
api.Model.Progress.Visible = true;
for (var i = 0; i < rows.Length; i++)
{
var row = rows[i];
if (row.SourceType == SourceType.DirectLink)
continue;
row.StateImage = imageSourceWorking;
try
{
row.SourceUrl = await factory.ResolveSourceUrl(row.Action);
row.StateImage = imageSourceSuccess;
}
catch (Exception)
{
// Fail silently
row.StateImage = imageSourceFailed;
}
if (api.HasClosed)
return;
api.Model.Progress.Value = i;
}
api.Model.Progress.Visible = false;
}
public static void ClearDirectLinks(params MainWindowGridRow[] rows)
public static void ClearDirectLinks(IMainApi api, params MainWindowGridRow[] rows)
{
foreach (var row in rows)
api.Model.Progress.Value = 0;
api.Model.Progress.MaxValue = rows.Length;
api.Model.Progress.Visible = true;
for (var i = 0; i < rows.Length; i++)
{
var row = rows[i];
if (row.SourceType != SourceType.DirectLink)
row.SourceUrl = null;
row.StateImage = null;
api.Model.Progress.Value = i;
}
api.Model.Progress.Visible = false;
}
public static string GenerateChangelog(InstallInfos installInfos, UpdateInfo updateInfos)