From a86ad2377445b7805f30aad5a4455a7281d3f549 Mon Sep 17 00:00:00 2001 From: Tomi Eckert Date: Wed, 17 Dec 2025 12:23:21 +0100 Subject: [PATCH] add loading progress to hours window --- Blueberry/HoursWindow.xaml.cs | 68 ++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/Blueberry/HoursWindow.xaml.cs b/Blueberry/HoursWindow.xaml.cs index a688e0a..57ba221 100644 --- a/Blueberry/HoursWindow.xaml.cs +++ b/Blueberry/HoursWindow.xaml.cs @@ -2,7 +2,6 @@ using Blueberry.Redmine.Dto; using System.Collections.Concurrent; using System.Collections.ObjectModel; -using System.Threading.Tasks; using System.Windows; using Wpf.Ui.Controls; @@ -28,11 +27,15 @@ namespace Blueberry _config = config; } - private async void FluentWindow_Loaded(object sender, System.Windows.RoutedEventArgs e) + private async void FluentWindow_Loaded(object sender, RoutedEventArgs e) { - var u = await _manager.GetUsersAsync(); + userComboBox.IsEnabled = + searchButton.IsEnabled = + dateButton.IsEnabled = false; + var u = await _manager.GetUsersAsync(progress: UpdateProgress()); var current = await _manager.GetCurrentUserAsync(); hoursProgress.Visibility = Visibility.Hidden; + hoursProgress.IsIndeterminate = true; _users.Clear(); _users.AddRange(u); userComboBox.Items.Clear(); @@ -40,14 +43,63 @@ namespace Blueberry userComboBox.Items.Add(user); userComboBox.SelectedItem = current; + userComboBox.IsEnabled = + searchButton.IsEnabled = + dateButton.IsEnabled = true; } - private void dateButton_Click(object sender, System.Windows.RoutedEventArgs e) + private IProgress<(int, int)> UpdateProgress() + { + var p = new Progress<(int current, int total)>((x) => + { + Dispatcher.Invoke(() => + { + hoursProgress.IsIndeterminate = false; + var percent = (int)((double)x.current / x.total * 100); + hoursProgress.Progress = percent; + }); + }); + return p; + } + + private void dateButton_Click(object sender, RoutedEventArgs e) { calendarFlyout.IsOpen = true; } - private async void searchButton_Click(object sender, System.Windows.RoutedEventArgs e) + private void UpdateProgressI() + { + Dispatcher.Invoke(() => + { + var percent = (int)((double)loadI / totalI * 100); + lock (_lock) + { + hoursProgress.Progress = percent; + } + }); + } + + private int loadInternalI = 0; + private object _lock = new(); + private int loadI { get + { + var result = 0; + lock(_lock) + { + result = loadInternalI; + } + return result; + } + set + { + lock (_lock) + { + loadInternalI = value; + } + } + } + private int totalI = 0; + private async void searchButton_Click(object sender, RoutedEventArgs e) { var user = userComboBox.SelectedItem as UserInfo.User; if(user is null) @@ -64,6 +116,8 @@ namespace Blueberry for (int i = 0; i < selectedDates.Count; i++) { + hoursProgress.IsIndeterminate = false; + totalI = selectedDates.Count; var date = selectedDates[i]; tasks[i] = Task.Run(async () => { @@ -83,12 +137,16 @@ namespace Blueberry }; hours.Add(dh); } + loadI++; + UpdateProgressI(); }); await Task.Delay(10); } await Task.WhenAll(tasks); + hoursProgress.IsIndeterminate = true; + var newTickets = await _manager.GetIssuesAsync(user.Id, createdFrom: selectedDates.First(), createdTo: selectedDates.Last()); var closedTickets = await _manager.GetIssuesAsync(user.Id, isOpen: false, updatedFrom: selectedDates.First(), updatedTo: selectedDates.Last()); var currentTickets = await _manager.GetUserOpenIssuesAsync(user.Id);