using Avalonia.Threading; using ReactiveUI; using SPTInstaller.Interfaces; using System; using System.Threading.Tasks; namespace SPTInstaller.Models { public abstract class InstallerTaskBase : ReactiveObject, IProgressableTask { private string _id; public string Id { get => _id; private set => this.RaiseAndSetIfChanged(ref _id, value); } private string _name; public string Name { get => _name; private set => this.RaiseAndSetIfChanged(ref _name, value); } private bool _isComleted; public bool IsCompleted { get => _isComleted; private set => this.RaiseAndSetIfChanged(ref _isComleted, value); } private bool _hasErrors; public bool HasErrors { get => _hasErrors; private set => this.RaiseAndSetIfChanged(ref _hasErrors, value); } private bool _isRunning; public bool IsRunning { get => _isRunning; private set => this.RaiseAndSetIfChanged(ref _isRunning, value); } private int _progress; public int Progress { get => _progress; private set => this.RaiseAndSetIfChanged(ref _progress, value); } private bool _showProgress; public bool ShowProgress { get => _showProgress; private set => this.RaiseAndSetIfChanged(ref _showProgress, value); } private string _statusMessage; public string StatusMessage { get => _statusMessage; private set => this.RaiseAndSetIfChanged(ref _statusMessage, value); } private string _statusDetails; public string StatusDetails { get => _statusDetails; private set => this.RaiseAndSetIfChanged(ref _statusDetails, value); } /// /// Update the status message and optionally a progress bar value /// /// /// /// If message is empty, it isn't updated. If progress is null, the progress bar will be hidden. Details is not touched with this method public void SetStatus(string message, int? progress = null) => SetStatus(message, "", progress); /// /// Update the status message, status details, and optionlly a progress bar value /// /// /// /// If message or details are empty, it isn't updated. If progress is null, the progress bar will be hidden public void SetStatus(string message, string details, int? progress = null) { StatusMessage = String.IsNullOrWhiteSpace(message) ? StatusMessage : message; StatusDetails = String.IsNullOrWhiteSpace(details) ? StatusDetails : details; ShowProgress = progress != null; if (progress != null) { Progress = progress.Value; } } public InstallerTaskBase(string name) { Name = name; Id = Guid.NewGuid().ToString(); } /// /// A method for the install controller to call. Do not use this within your task /// /// public async Task RunAsync() { IsRunning = true; var result = await TaskOperation(); IsRunning = false; if (!result.Succeeded) { // TODO: handle error state } IsCompleted = true; return result; } /// /// The task you want to run /// /// public abstract Task TaskOperation(); } }