using Pf2e.Scrapper.Processors.Definitions; namespace Pf2e.Scrapper.Helpers; internal class ProcessProgress : AbstractLogger { /// /// Прогресс обработки обработчиков . /// public ProgressItem Processors { get; } = new(); /// /// Прогресс работы конкретного обработчика . /// public ProgressItem Local { get; } = new(); /// /// Конструктор класса . /// public ProcessProgress() { Processors.Update += Update; Local.Update += Update; } /// /// Событие обновления /// private void Update() { ProgressUpdate?.Invoke(this); } public override void Message(LogLevel level, string message) { ProgressMessage?.Invoke(this, level, message); } public void Complete() { ProgressComplete?.Invoke(this); } public delegate void ProgressUpdateDelegate(ProcessProgress sender); public event ProgressUpdateDelegate? ProgressUpdate; public event ProgressUpdateDelegate? ProgressComplete; public delegate void ProgressMessageDelegate( ProcessProgress sender, LogLevel level, string message ); public event ProgressMessageDelegate? ProgressMessage; /// /// Класс прогресса. /// public class ProgressItem { /// /// Количество обрабатываемых процессов. /// public int Count { get => _count; set { _count = value; Update?.Invoke(); } } private int _count; /// /// Индекс текущего обрабатываемого процесса. /// public int Current { get => _current; set { _current = value; Update?.Invoke(); } } private int _current; /// /// Название текущего обрабатываемого процесса. /// public string Text { get => _text; set { _text = value; Update?.Invoke(); } } private string _text = ""; /// /// Значение прогресса. /// public double Percent => Count > 0 ? 1.0 * Current / Count : 1.0; /// /// Сброс прогресса до нуля и установка нового максимального значения. /// /// public void Reset(int max = 0) { _count = max; _current = 0; _text = ""; Update?.Invoke(); } /// /// Отмечает начало работы над процессом, описываемым строкой . /// /// Строка, описывающая процесс. public void Start(string text) { _text = text; Update?.Invoke(); } /// /// Отмечает конец работы над процессом и увеличивает значение прогресса. /// public void End() { _current++; Update?.Invoke(); } /// /// Отмечает прогресс завершённым. /// public void Complete() { _current = _count; _text = "Готово!"; Update?.Invoke(); } /// /// Получение строкового представления прогресса. /// /// Строковое представление прогресса. public override string ToString() { return $"{Text} [{Current} / {Count}; {Percent:P}]"; } /// /// Делегат события обновления. /// public delegate void UpdateDelegate(); /// /// Событие обновление. /// public event UpdateDelegate? Update; } }