/
githubmirror
/
Files
Обзор
Документация
Войти
/
githubmirror
/
Files
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Files.App/ViewModels/UserControls/StatusCenterViewModel.cs
188 строк
4 KB
yair100
Code Quality: Moved taskbar progress updates to StatusCenterViewModel (#18237)
12 мар 2026, 17:44
Не верифицирован
12 мар 2026, 17:44
424b2e4
Код
Авторство
О чём код?
// Copyright (c) Files Community // Licensed under the MIT License. namespace Files.App.ViewModels.UserControls { public sealed partial class StatusCenterViewModel : ObservableObject { private readonly Files.App.Storage.TaskbarManager _taskbar = Files.App.Storage.TaskbarManager.Default; public ObservableCollection<StatusCenterItem> StatusCenterItems { get; } = []; private int _AverageOperationProgressValue = 0; public int AverageOperationProgressValue { get => _AverageOperationProgressValue; private set => SetProperty(ref _AverageOperationProgressValue, value); } public int InProgressItemCount { get { int count = 0; foreach (var item in StatusCenterItems) { if (item.IsInProgress) count++; } return count; } } public bool HasAnyItemInProgress { get { if (InProgressItemCount > 0) ShowProgressRing = true; return InProgressItemCount > 0; } } public bool HasAnyItem => StatusCenterItems.Any(); private bool _ShowProgressRing = false; public bool ShowProgressRing { get => _ShowProgressRing; private set => SetProperty(ref _ShowProgressRing, value); } public int InfoBadgeState { get { var anyFailure = StatusCenterItems.Any(i => i.FileSystemOperationReturnResult != ReturnResult.InProgress && i.FileSystemOperationReturnResult != ReturnResult.Success); return (anyFailure, HasAnyItemInProgress) switch { (false, false) => 0, // All successful (false, true) => 1, // In progress (true, true) => 2, // In progress with an error (true, false) => 3 // Completed with an error }; } } public int InfoBadgeValue => InProgressItemCount > 0 ? InProgressItemCount : -1; public event EventHandler<StatusCenterItem>? NewItemAdded; public StatusCenterViewModel() { StatusCenterItems.CollectionChanged += (s, e) => OnPropertyChanged(nameof(HasAnyItem)); } public void OnStatusCenterFlyoutOpened() { ShowProgressRing = HasAnyItemInProgress || InfoBadgeState == 3; } public StatusCenterItem AddItem( string headerResource, string subHeaderResource, ReturnResult status, FileOperationType operation, IEnumerable<string>? source, IEnumerable<string>? destination, bool canProvideProgress = true, long itemsCount = 0, long totalSize = 0, CancellationTokenSource cancellationTokenSource = null) { var banner = new StatusCenterItem( headerResource, subHeaderResource, status, operation, source, destination, canProvideProgress, itemsCount, totalSize, cancellationTokenSource); StatusCenterItems.Insert(0, banner); NewItemAdded?.Invoke(this, banner); NotifyChanges(); return banner; } public bool RemoveItem(StatusCenterItem card) { if (!StatusCenterItems.Contains(card)) return false; StatusCenterItems.Remove(card); NotifyChanges(); return true; } public void RemoveAllCompletedItems() { for (var i = StatusCenterItems.Count - 1; i >= 0; i--) { if (!StatusCenterItems[i].IsInProgress) StatusCenterItems.RemoveAt(i); } NotifyChanges(); } public void NotifyChanges() { OnPropertyChanged(nameof(InProgressItemCount)); OnPropertyChanged(nameof(HasAnyItemInProgress)); OnPropertyChanged(nameof(HasAnyItem)); OnPropertyChanged(nameof(InfoBadgeState)); OnPropertyChanged(nameof(InfoBadgeValue)); UpdateAverageProgressValue(); UpdateTaskbarProgress(); } public void UpdateAverageProgressValue() { if (HasAnyItemInProgress) AverageOperationProgressValue = (int)StatusCenterItems.Where((item) => item.IsInProgress).Average(x => x.ProgressPercentage); else AverageOperationProgressValue = 0; } private void UpdateTaskbarProgress() { try { var hwnd = new Windows.Win32.Foundation.HWND(MainWindow.Instance.WindowHandle); if (HasAnyItemInProgress) { _taskbar.SetProgressState(hwnd, Windows.Win32.UI.Shell.TBPFLAG.TBPF_NORMAL); _taskbar.SetProgressValue(hwnd, (ulong)Math.Clamp(AverageOperationProgressValue, 0, 100), 100); } else { _taskbar.SetProgressState(hwnd, Windows.Win32.UI.Shell.TBPFLAG.TBPF_NOPROGRESS); } } catch { // Ignore taskbar update failures to avoid interrupting status updates. } } } }