/
dOJer113
/
Insect
Обзор
Документация
Войти
/
dOJer113
/
Insect
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
server
ProgressOverlayWindow/ViewModels/ProgressOverlayViewModel.cs
233 строки
6 KB
aleks
lab 5
14 дек 2025, 19:32
14 дек 2025, 19:32
395af5a
Код
Авторство
О чём код?
using System; using ReactiveUI; namespace ProgressOverlayWindow.ViewModels; /// <summary> /// ViewModel для окна прогресса. /// </summary> public class ProgressOverlayViewModel : ReactiveObject { private string _title = "Операция"; private string _caption = "Подготовка..."; private string? _subtitle = "Ожидание запуска"; private double _currentProgress; private double _maxProgress = 1; private string _actionButtonText = "Отмена"; private bool _isCompleted; private bool _isCancellationAvailable = true; private string _footerHint = "Alt+F4 — отмена"; /// <summary> /// Событие запроса отмены. /// </summary> public event EventHandler? CancelRequested; /// <summary> /// Событие запроса закрытия. /// </summary> public event EventHandler? CloseRequested; /// <summary> /// Команда основной кнопки. /// </summary> public ActionCommand ActionButtonCommand { get; } /// <summary> /// Создает ViewModel окна прогресса. /// </summary> public ProgressOverlayViewModel() { ActionButtonCommand = new ActionCommand(HandleAction, () => _isCompleted || _isCancellationAvailable); } /// <summary> /// Заголовок окна. /// </summary> public string Title { get => _title; private set => this.RaiseAndSetIfChanged(ref _title, value); } /// <summary> /// Основная подпись. /// </summary> public string Caption { get => _caption; private set => this.RaiseAndSetIfChanged(ref _caption, value); } /// <summary> /// Дополнительный подзаголовок. /// </summary> public string? Subtitle { get => _subtitle; private set => this.RaiseAndSetIfChanged(ref _subtitle, value); } /// <summary> /// Текущее значение прогресса. /// </summary> public double CurrentProgress { get => _currentProgress; private set { this.RaiseAndSetIfChanged(ref _currentProgress, value); this.RaisePropertyChanged(nameof(ProgressSummary)); } } /// <summary> /// Максимальное значение прогресса. /// </summary> public double MaxProgress { get => _maxProgress; private set { this.RaiseAndSetIfChanged(ref _maxProgress, value); this.RaisePropertyChanged(nameof(ProgressSummary)); } } /// <summary> /// Сводка прогресса в текстовом виде. /// </summary> public string ProgressSummary => $"{CurrentProgress:N0} / {MaxProgress:N0}"; /// <summary> /// Текст на кнопке действия. /// </summary> public string ActionButtonText { get => _actionButtonText; private set => this.RaiseAndSetIfChanged(ref _actionButtonText, value); } /// <summary> /// Подсказка в нижней части окна. /// </summary> public string FooterHint { get => _footerHint; private set => this.RaiseAndSetIfChanged(ref _footerHint, value); } /// <summary> /// Признак завершения операции. /// </summary> public bool IsCompleted { get => _isCompleted; private set { this.RaiseAndSetIfChanged(ref _isCompleted, value); ActionButtonCommand.RaiseCanExecuteChanged(); this.RaisePropertyChanged(nameof(IsActionButtonEnabled)); } } /// <summary> /// Доступность отмены. /// </summary> public bool IsCancellationAvailable { get => _isCancellationAvailable; private set { this.RaiseAndSetIfChanged(ref _isCancellationAvailable, value); ActionButtonCommand.RaiseCanExecuteChanged(); this.RaisePropertyChanged(nameof(IsActionButtonEnabled)); } } /// <summary> /// Признак доступности кнопки действия. /// </summary> public bool IsActionButtonEnabled => IsCancellationAvailable || IsCompleted; /// <summary> /// Инициализирует визуальные элементы окна. /// </summary> public void Initialize(string parTitle, string parCaption, string? parSubtitle, double parMaxProgress) { Title = parTitle; Caption = parCaption; Subtitle = parSubtitle; MaxProgress = Math.Max(parMaxProgress, 1); CurrentProgress = 0; ActionButtonText = "Отмена"; IsCompleted = false; IsCancellationAvailable = true; } /// <summary> /// Обновляет значения прогресса и подпись. /// </summary> public void UpdateProgress(double parStep, string? parSubtitle) { CurrentProgress = Math.Min(MaxProgress, CurrentProgress + parStep); if (!string.IsNullOrWhiteSpace(parSubtitle)) { Subtitle = parSubtitle; } } /// <summary> /// Блокирует кнопку отмены. /// </summary> public void DisableCancellation() { IsCancellationAvailable = false; } /// <summary> /// Переключает окно в состояние завершения. /// </summary> public void SwitchToCompletionState() { IsCompleted = true; IsCancellationAvailable = true; ActionButtonText = "Закрыть"; FooterHint = "Готово"; } /// <summary> /// Возвращает кнопку в исходное состояние. /// </summary> public void ResetButtonState() { IsCompleted = false; IsCancellationAvailable = true; ActionButtonText = "Отмена"; FooterHint = "Alt+F4 — отмена"; } /// <summary> /// Обновляет текст подзаголовка. /// </summary> /// <param name="parSubtitle">Новый текст подзаголовка.</param> public void UpdateSubtitle(string parSubtitle) { Subtitle = parSubtitle; } private void HandleAction() { if (IsCompleted) { CloseRequested?.Invoke(this, EventArgs.Empty); return; } if (IsCancellationAvailable) { IsCancellationAvailable = false; CancelRequested?.Invoke(this, EventArgs.Empty); } } }