diff --git a/Bloxstrap/Bootstrapper.cs b/Bloxstrap/Bootstrapper.cs index c23d17d..5bba097 100644 --- a/Bloxstrap/Bootstrapper.cs +++ b/Bloxstrap/Bootstrapper.cs @@ -6,6 +6,7 @@ using Microsoft.Win32; using Bloxstrap.Integrations; using Bloxstrap.Resources; using Bloxstrap.AppData; +using System.Windows.Shell; namespace Bloxstrap { @@ -13,6 +14,7 @@ namespace Bloxstrap { #region Properties private const int ProgressBarMaximum = 10000; + private const double TaskbarProgressMaximum = 1; // this can not be changed. keep it at 1. private const string AppSettings = "\r\n" + @@ -71,6 +73,7 @@ namespace Bloxstrap private bool _isInstalling = false; private double _progressIncrement; + private double _taskbarProgressIncrement; private long _totalDownloadedBytes = 0; private int _packagesExtracted = 0; private bool _cancelFired = false; @@ -106,6 +109,7 @@ namespace Bloxstrap if (Dialog is null) return; + // UI progress int progressValue = (int)Math.Floor(_progressIncrement * _totalDownloadedBytes); // bugcheck: if we're restoring a file from a package, it'll incorrectly increment the progress beyond 100 @@ -113,6 +117,12 @@ namespace Bloxstrap progressValue = Math.Clamp(progressValue, 0, ProgressBarMaximum); Dialog.ProgressValue = progressValue; + + // taskbar progress + double taskbarProgressValue = _taskbarProgressIncrement * _totalDownloadedBytes; + taskbarProgressValue = Math.Clamp(taskbarProgressValue, 0, TaskbarProgressMaximum); + + Dialog.TaskbarProgressValue = taskbarProgressValue; } public async Task Run() @@ -614,11 +624,14 @@ namespace Bloxstrap { Dialog.CancelEnabled = true; Dialog.ProgressStyle = ProgressBarStyle.Continuous; + Dialog.TaskbarProgressState = TaskbarItemProgressState.Normal; Dialog.ProgressMaximum = ProgressBarMaximum; // compute total bytes to download - _progressIncrement = (double)ProgressBarMaximum / _versionPackageManifest.Sum(package => package.PackedSize); + int totalSize = _versionPackageManifest.Sum(package => package.PackedSize); + _progressIncrement = (double)ProgressBarMaximum / totalSize; + _taskbarProgressIncrement = (double)TaskbarProgressMaximum / totalSize; } foreach (Package package in _versionPackageManifest) @@ -647,6 +660,7 @@ namespace Bloxstrap if (Dialog is not null) { Dialog.ProgressStyle = ProgressBarStyle.Marquee; + Dialog.TaskbarProgressState = TaskbarItemProgressState.Indeterminate; SetStatus(Strings.Bootstrapper_Status_Configuring); } diff --git a/Bloxstrap/UI/Elements/Bootstrapper/Base/WinFormsDialogBase.cs b/Bloxstrap/UI/Elements/Bootstrapper/Base/WinFormsDialogBase.cs index 588d950..d3005de 100644 --- a/Bloxstrap/UI/Elements/Bootstrapper/Base/WinFormsDialogBase.cs +++ b/Bloxstrap/UI/Elements/Bootstrapper/Base/WinFormsDialogBase.cs @@ -1,4 +1,5 @@ using System.Windows.Forms; +using System.Windows.Shell; using Bloxstrap.UI.Utility; @@ -15,6 +16,8 @@ namespace Bloxstrap.UI.Elements.Bootstrapper.Base protected virtual ProgressBarStyle _progressStyle { get; set; } protected virtual int _progressValue { get; set; } protected virtual int _progressMaximum { get; set; } + protected virtual TaskbarItemProgressState _taskbarProgressState { get; set; } + protected virtual double _taskbarProgressValue { get; set; } protected virtual bool _cancelEnabled { get; set; } public string Message @@ -65,6 +68,30 @@ namespace Bloxstrap.UI.Elements.Bootstrapper.Base } } + public TaskbarItemProgressState TaskbarProgressState + { + get => _taskbarProgressState; + set + { + if (InvokeRequired) + Invoke(() => _taskbarProgressState = value); + else + _taskbarProgressState = value; + } + } + + public double TaskbarProgressValue + { + get => _taskbarProgressValue; + set + { + if (InvokeRequired) + Invoke(() => _taskbarProgressValue = value); + else + _taskbarProgressValue = value; + } + } + public bool CancelEnabled { get => _cancelEnabled; diff --git a/Bloxstrap/UI/Elements/Bootstrapper/ByfronDialog.xaml b/Bloxstrap/UI/Elements/Bootstrapper/ByfronDialog.xaml index 200dbf0..b1ef6b9 100644 --- a/Bloxstrap/UI/Elements/Bootstrapper/ByfronDialog.xaml +++ b/Bloxstrap/UI/Elements/Bootstrapper/ByfronDialog.xaml @@ -12,6 +12,11 @@ AllowsTransparency="True" Background="Transparent" Closing="Window_Closing"> + + + + + diff --git a/Bloxstrap/UI/Elements/Bootstrapper/ByfronDialog.xaml.cs b/Bloxstrap/UI/Elements/Bootstrapper/ByfronDialog.xaml.cs index 54e57ca..3fb0441 100644 --- a/Bloxstrap/UI/Elements/Bootstrapper/ByfronDialog.xaml.cs +++ b/Bloxstrap/UI/Elements/Bootstrapper/ByfronDialog.xaml.cs @@ -3,6 +3,7 @@ using System.ComponentModel; using System.Windows.Forms; using System.Windows.Media; using System.Windows.Media.Imaging; +using System.Windows.Shell; using Bloxstrap.UI.Elements.Bootstrapper.Base; using Bloxstrap.UI.ViewModels.Bootstrapper; @@ -65,6 +66,26 @@ namespace Bloxstrap.UI.Elements.Bootstrapper } } + public TaskbarItemProgressState TaskbarProgressState + { + get => _viewModel.TaskbarProgressState; + set + { + _viewModel.TaskbarProgressState = value; + _viewModel.OnPropertyChanged(nameof(_viewModel.TaskbarProgressState)); + } + } + + public double TaskbarProgressValue + { + get => _viewModel.TaskbarProgressValue; + set + { + _viewModel.TaskbarProgressValue = value; + _viewModel.OnPropertyChanged(nameof(_viewModel.TaskbarProgressValue)); + } + } + public bool CancelEnabled { get => _viewModel.CancelEnabled; diff --git a/Bloxstrap/UI/Elements/Bootstrapper/ClassicFluentDialog.xaml b/Bloxstrap/UI/Elements/Bootstrapper/ClassicFluentDialog.xaml index 2cf25e7..76cda5e 100644 --- a/Bloxstrap/UI/Elements/Bootstrapper/ClassicFluentDialog.xaml +++ b/Bloxstrap/UI/Elements/Bootstrapper/ClassicFluentDialog.xaml @@ -19,6 +19,10 @@ WindowStartupLocation="CenterScreen" mc:Ignorable="d"> + + + + diff --git a/Bloxstrap/UI/Elements/Bootstrapper/ClassicFluentDialog.xaml.cs b/Bloxstrap/UI/Elements/Bootstrapper/ClassicFluentDialog.xaml.cs index 5139a3c..c2e46ab 100644 --- a/Bloxstrap/UI/Elements/Bootstrapper/ClassicFluentDialog.xaml.cs +++ b/Bloxstrap/UI/Elements/Bootstrapper/ClassicFluentDialog.xaml.cs @@ -1,9 +1,6 @@ using System.ComponentModel; using System.Windows.Forms; - -using Wpf.Ui.Appearance; -using Wpf.Ui.Mvvm.Contracts; -using Wpf.Ui.Mvvm.Services; +using System.Windows.Shell; using Bloxstrap.UI.ViewModels.Bootstrapper; using Bloxstrap.UI.Elements.Bootstrapper.Base; @@ -62,6 +59,26 @@ namespace Bloxstrap.UI.Elements.Bootstrapper } } + public TaskbarItemProgressState TaskbarProgressState + { + get => _viewModel.TaskbarProgressState; + set + { + _viewModel.TaskbarProgressState = value; + _viewModel.OnPropertyChanged(nameof(_viewModel.TaskbarProgressState)); + } + } + + public double TaskbarProgressValue + { + get => _viewModel.TaskbarProgressValue; + set + { + _viewModel.TaskbarProgressValue = value; + _viewModel.OnPropertyChanged(nameof(_viewModel.TaskbarProgressValue)); + } + } + public bool CancelEnabled { get => _viewModel.CancelEnabled; diff --git a/Bloxstrap/UI/Elements/Bootstrapper/FluentDialog.xaml b/Bloxstrap/UI/Elements/Bootstrapper/FluentDialog.xaml index 881692d..5f49a73 100644 --- a/Bloxstrap/UI/Elements/Bootstrapper/FluentDialog.xaml +++ b/Bloxstrap/UI/Elements/Bootstrapper/FluentDialog.xaml @@ -22,6 +22,10 @@ WindowStyle="None" mc:Ignorable="d"> + + + + diff --git a/Bloxstrap/UI/Elements/Bootstrapper/FluentDialog.xaml.cs b/Bloxstrap/UI/Elements/Bootstrapper/FluentDialog.xaml.cs index 9048f02..71acd6a 100644 --- a/Bloxstrap/UI/Elements/Bootstrapper/FluentDialog.xaml.cs +++ b/Bloxstrap/UI/Elements/Bootstrapper/FluentDialog.xaml.cs @@ -16,6 +16,7 @@ using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; +using System.Windows.Shell; using System.Windows.Threading; namespace Bloxstrap.UI.Elements.Bootstrapper @@ -72,6 +73,26 @@ namespace Bloxstrap.UI.Elements.Bootstrapper } } + public TaskbarItemProgressState TaskbarProgressState + { + get => _viewModel.TaskbarProgressState; + set + { + _viewModel.TaskbarProgressState = value; + _viewModel.OnPropertyChanged(nameof(_viewModel.TaskbarProgressState)); + } + } + + public double TaskbarProgressValue + { + get => _viewModel.TaskbarProgressValue; + set + { + _viewModel.TaskbarProgressValue = value; + _viewModel.OnPropertyChanged(nameof(_viewModel.TaskbarProgressValue)); + } + } + public bool CancelEnabled { get => _viewModel.CancelEnabled; diff --git a/Bloxstrap/UI/IBootstrapperDialog.cs b/Bloxstrap/UI/IBootstrapperDialog.cs index e15f7fb..95339aa 100644 --- a/Bloxstrap/UI/IBootstrapperDialog.cs +++ b/Bloxstrap/UI/IBootstrapperDialog.cs @@ -1,4 +1,5 @@ using System.Windows.Forms; +using System.Windows.Shell; namespace Bloxstrap.UI { @@ -10,6 +11,8 @@ namespace Bloxstrap.UI ProgressBarStyle ProgressStyle { get; set; } int ProgressValue { get; set; } int ProgressMaximum { get; set; } + TaskbarItemProgressState TaskbarProgressState { get; set; } + double TaskbarProgressValue { get; set; } bool CancelEnabled { get; set; } void ShowBootstrapper(); diff --git a/Bloxstrap/UI/ViewModels/Bootstrapper/BootstrapperDialogViewModel.cs b/Bloxstrap/UI/ViewModels/Bootstrapper/BootstrapperDialogViewModel.cs index 27e21da..6dc9b5e 100644 --- a/Bloxstrap/UI/ViewModels/Bootstrapper/BootstrapperDialogViewModel.cs +++ b/Bloxstrap/UI/ViewModels/Bootstrapper/BootstrapperDialogViewModel.cs @@ -1,6 +1,7 @@ using System.Windows; using System.Windows.Input; using System.Windows.Media; +using System.Windows.Shell; using CommunityToolkit.Mvvm.Input; @@ -19,6 +20,9 @@ namespace Bloxstrap.UI.ViewModels.Bootstrapper public int ProgressMaximum { get; set; } = 0; public int ProgressValue { get; set; } = 0; + public TaskbarItemProgressState TaskbarProgressState { get; set; } = TaskbarItemProgressState.Indeterminate; + public double TaskbarProgressValue { get; set; } = 0; + public bool CancelEnabled { get; set; } = false; public Visibility CancelButtonVisibility => CancelEnabled ? Visibility.Visible : Visibility.Collapsed;