From ad37a15a927a308541e460b6e06dc70d4985bd36 Mon Sep 17 00:00:00 2001 From: "waffle.lord" Date: Thu, 9 Nov 2023 10:32:36 -0500 Subject: [PATCH] implement re-evaluation requests on prechecks --- SPTInstaller/Controllers/InstallController.cs | 20 +++++++++++++++++++ SPTInstaller/Interfaces/IPreCheck.cs | 1 + SPTInstaller/Models/PreCheckBase.cs | 9 +++++++++ SPTInstaller/ViewModels/PreChecksViewModel.cs | 15 ++++++++++++++ 4 files changed, 45 insertions(+) diff --git a/SPTInstaller/Controllers/InstallController.cs b/SPTInstaller/Controllers/InstallController.cs index e2b4b15..54cdfab 100644 --- a/SPTInstaller/Controllers/InstallController.cs +++ b/SPTInstaller/Controllers/InstallController.cs @@ -11,8 +11,10 @@ namespace SPTInstaller.Controllers; public class InstallController { + public event EventHandler RecheckRequested = delegate { }; public event EventHandler TaskChanged = delegate { }; + private bool _installRunning = false; private IPreCheck[] _preChecks { get; set; } private IProgressableTask[] _tasks { get; set; } @@ -20,6 +22,22 @@ public class InstallController { _tasks = tasks; _preChecks = preChecks; + + _preChecks.ForEach(x => x.ReeevaluationRequested += (s, e) => + { + if (s is IPreCheck preCheck) + { + Log.Information($"{preCheck.Name}: requested re-evaluation"); + + if (_installRunning) + { + Log.Warning("Install is running, re-evaluation denied (how did you do this?)"); + return; + } + + RecheckRequested?.Invoke(this, null); + } + }); } public async Task RunPreChecks() @@ -51,6 +69,8 @@ public class InstallController public async Task RunTasks() { + _installRunning = true; + Log.Information("-<>--<>- Running Installer Tasks -<>--<>-"); foreach (var task in _tasks) diff --git a/SPTInstaller/Interfaces/IPreCheck.cs b/SPTInstaller/Interfaces/IPreCheck.cs index 53e9c0d..c132312 100644 --- a/SPTInstaller/Interfaces/IPreCheck.cs +++ b/SPTInstaller/Interfaces/IPreCheck.cs @@ -10,6 +10,7 @@ public interface IPreCheck public bool IsRequired { get; } public string PreCheckDetails { get; } public StatusSpinner.SpinnerState State { get; set; } + public event EventHandler ReeevaluationRequested; public Task RunCheck(); } \ No newline at end of file diff --git a/SPTInstaller/Models/PreCheckBase.cs b/SPTInstaller/Models/PreCheckBase.cs index 0e1fe0c..6003e2c 100644 --- a/SPTInstaller/Models/PreCheckBase.cs +++ b/SPTInstaller/Models/PreCheckBase.cs @@ -8,6 +8,7 @@ namespace SPTInstaller.Models; public abstract class PreCheckBase : ReactiveObject, IPreCheck { + public event EventHandler ReeevaluationRequested = delegate { }; private string _id; public string Id { @@ -84,6 +85,14 @@ public abstract class PreCheckBase : ReactiveObject, IPreCheck (_, _) => StatusSpinner.SpinnerState.Error }; + /// + /// Request pre-checks to be re-evaluated + /// + public void RequestReevaluation() + { + ReeevaluationRequested?.Invoke(this, null); + } + public async Task RunCheck() { State = StatusSpinner.SpinnerState.Running; diff --git a/SPTInstaller/ViewModels/PreChecksViewModel.cs b/SPTInstaller/ViewModels/PreChecksViewModel.cs index 1cbeee0..d87575f 100644 --- a/SPTInstaller/ViewModels/PreChecksViewModel.cs +++ b/SPTInstaller/ViewModels/PreChecksViewModel.cs @@ -79,11 +79,25 @@ public class PreChecksViewModel : ViewModelBase set => this.RaiseAndSetIfChanged(ref _installButtonCheckState, value); } + private void ReCheckRequested(object? sender, EventArgs e) + { + Task.Run(async () => + { + if (sender is InstallController installer) + { + var result = await installer.RunPreChecks(); + AllowInstall = result.Succeeded; + } + }); + } + public PreChecksViewModel(IScreen host) : base(host) { var data = ServiceHelper.Get(); var installer = ServiceHelper.Get(); + installer.RecheckRequested += ReCheckRequested; + InstallButtonText = "Please wait ..."; InstallButtonCheckState = StatusSpinner.SpinnerState.Pending; @@ -158,6 +172,7 @@ public class PreChecksViewModel : ViewModelBase { UpdateInfo.ShowCard = false; Log.Logger.Information("Opening Detailed PreCheck View"); + installer.RecheckRequested -= ReCheckRequested; NavigateTo(new DetailedPreChecksViewModel(HostScreen)); });