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;
}
}