From 73a1fd5f741567ea785a29466e3e52ce64a5cedd Mon Sep 17 00:00:00 2001 From: Daniel Clark Date: Thu, 3 Nov 2022 13:42:36 +0000 Subject: [PATCH] Progress ring work sort of completed --- App/KingPing/Views/AnalogOutputView.axaml | 7 ++-- .../ProgressRing/ProgressRing.axaml | 5 ++- .../ProgressRing/ProgressRing.cs | 41 +++++++++++++++---- .../ProgressRingTemplateSettings.cs | 17 ++++++++ 4 files changed, 56 insertions(+), 14 deletions(-) create mode 100644 UI/Avalonia.Controls/ProgressRing/ProgressRingTemplateSettings.cs diff --git a/App/KingPing/Views/AnalogOutputView.axaml b/App/KingPing/Views/AnalogOutputView.axaml index 26cc409..cb3e3bd 100644 --- a/App/KingPing/Views/AnalogOutputView.axaml +++ b/App/KingPing/Views/AnalogOutputView.axaml @@ -2,8 +2,7 @@ x:Class="KingPing.AnalogOutputView" xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> - - - - + + + diff --git a/UI/Avalonia.Controls/ProgressRing/ProgressRing.axaml b/UI/Avalonia.Controls/ProgressRing/ProgressRing.axaml index 21c1bb0..058fb5e 100644 --- a/UI/Avalonia.Controls/ProgressRing/ProgressRing.axaml +++ b/UI/Avalonia.Controls/ProgressRing/ProgressRing.axaml @@ -29,10 +29,11 @@ SweepAngle="360" /> + StrokeThickness="{DynamicResource ProgressRingStrokeThickness}" + SweepAngle="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.SweepAngle}" /> diff --git a/UI/Avalonia.Controls/ProgressRing/ProgressRing.cs b/UI/Avalonia.Controls/ProgressRing/ProgressRing.cs index 529a452..fae2ce5 100644 --- a/UI/Avalonia.Controls/ProgressRing/ProgressRing.cs +++ b/UI/Avalonia.Controls/ProgressRing/ProgressRing.cs @@ -7,7 +7,15 @@ namespace TheXamlGuy.UI.Avalonia.Controls public class ProgressRing : RangeBase { public static readonly StyledProperty IsIndeterminateProperty = - AvaloniaProperty.Register(nameof(IsIndeterminate), true); + AvaloniaProperty.Register(nameof(IsIndeterminate), false); + + public static readonly StyledProperty TemplateSettingsProperty = + AvaloniaProperty.Register(nameof(TemplateSettings)); + + public ProgressRing() + { + SetValue(TemplateSettingsProperty, new ProgressRingTemplateSettings()); + } public bool IsIndeterminate { @@ -15,23 +23,40 @@ namespace TheXamlGuy.UI.Avalonia.Controls set => SetValue(IsIndeterminateProperty, value); } + public ProgressRingTemplateSettings TemplateSettings + { + get => GetValue(TemplateSettingsProperty); + set => SetValue(TemplateSettingsProperty, value); + } + protected override void OnApplyTemplate(TemplateAppliedEventArgs args) { UpdateIsIndeterminate(); + UpdateValue(); + } + + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs args) + { + base.OnPropertyChanged(args); + if (args.Property == IsIndeterminateProperty) + { + UpdateIsIndeterminate(); + } + + if (args.Property == ValueProperty) + { + UpdateValue(); + } } private void UpdateIsIndeterminate() { PseudoClasses.Set(":indeterminate", IsIndeterminate); - } - protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) + + private void UpdateValue() { - base.OnPropertyChanged(change); - if (change.Property == IsIndeterminateProperty) - { - UpdateIsIndeterminate(); - } + TemplateSettings.SetValue(ProgressRingTemplateSettings.SweepAngleProperty, Value == Maximum ? 360 : 360 * (Value / (Maximum - Minimum))); } } } diff --git a/UI/Avalonia.Controls/ProgressRing/ProgressRingTemplateSettings.cs b/UI/Avalonia.Controls/ProgressRing/ProgressRingTemplateSettings.cs new file mode 100644 index 0000000..6d97afe --- /dev/null +++ b/UI/Avalonia.Controls/ProgressRing/ProgressRingTemplateSettings.cs @@ -0,0 +1,17 @@ +using Avalonia; +using Avalonia.Controls.Primitives; + +namespace TheXamlGuy.UI.Avalonia.Controls +{ + public class ProgressRingTemplateSettings : TemplatedControl + { + public static readonly StyledProperty SweepAngleProperty = + AvaloniaProperty.Register(nameof(SweepAngle), 0); + + public double SweepAngle + { + get => GetValue(SweepAngleProperty); + set => SetValue(SweepAngleProperty, value); + } + } +}