using System; namespace Artemis.Core { /// /// Represents progress on a plugin prerequisite action /// public class PrerequisiteActionProgress : CorePropertyChanged, IProgress<(long, long)> { private long _current; private DateTime _lastReport; private long _lastReportValue; private double _percentage; private double _progressPerSecond; private long _total; /// /// The current amount /// public long Current { get => _current; set => SetAndNotify(ref _current, value); } /// /// The total amount /// public long Total { get => _total; set => SetAndNotify(ref _total, value); } /// /// The percentage /// public double Percentage { get => _percentage; set => SetAndNotify(ref _percentage, value); } /// /// Gets or sets the progress per second /// public double ProgressPerSecond { get => _progressPerSecond; set => SetAndNotify(ref _progressPerSecond, value); } #region Implementation of IProgress /// public void Report((long, long) value) { (long newCurrent, long newTotal) = value; TimeSpan timePassed = DateTime.Now - _lastReport; if (timePassed >= TimeSpan.FromSeconds(1)) { ProgressPerSecond = Math.Max(0, Math.Round(1.0 / timePassed.TotalSeconds * (newCurrent - _lastReportValue), 2)); _lastReportValue = newCurrent; _lastReport = DateTime.Now; } Current = newCurrent; Total = newTotal; Percentage = Math.Round((double) Current / Total * 100.0, 2); OnProgressReported(); } #endregion #region Events /// /// Occurs when progress has been reported /// public event EventHandler? ProgressReported; /// /// Invokes the event /// protected virtual void OnProgressReported() { ProgressReported?.Invoke(this, EventArgs.Empty); } #endregion } }