From c17f5cbfa3f877fc5c2ca0cb7cc4ee2ad71d30f8 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Fri, 19 Jan 2024 22:32:26 +0800 Subject: [PATCH] feat: clean up code. add event to slider. --- src/Ursa/Controls/RangeSlider/RangeSlider.cs | 25 ++++++++++- src/Ursa/Controls/RangeSlider/RangeTrack.cs | 44 -------------------- 2 files changed, 23 insertions(+), 46 deletions(-) diff --git a/src/Ursa/Controls/RangeSlider/RangeSlider.cs b/src/Ursa/Controls/RangeSlider/RangeSlider.cs index 401a6bc..2bade27 100644 --- a/src/Ursa/Controls/RangeSlider/RangeSlider.cs +++ b/src/Ursa/Controls/RangeSlider/RangeSlider.cs @@ -116,19 +116,40 @@ public class RangeSlider: TemplatedControl set => SetValue(IsSnapToTickProperty, value); } + public static readonly RoutedEvent ValueChangedEvent = + RoutedEvent.Register(nameof(ValueChanged), RoutingStrategies.Bubble); + + public event EventHandler ValueChanged + { + add => AddHandler(ValueChangedEvent, value); + remove => RemoveHandler(ValueChangedEvent, value); + } + static RangeSlider() { PressedMixin.Attach(); FocusableProperty.OverrideDefaultValue(true); IsHitTestVisibleProperty.OverrideDefaultValue(true); OrientationProperty.OverrideDefaultValue(Orientation.Horizontal); - OrientationProperty.Changed.AddClassHandler((o,e)=>o.OnOrientationChanged(e)); + OrientationProperty.Changed.AddClassHandler((o,e)=>o.OnOrientationChanged(e)); MinimumProperty.OverrideDefaultValue(0); MaximumProperty.OverrideDefaultValue(100); LowerValueProperty.OverrideDefaultValue(0); UpperValueProperty.OverrideDefaultValue(100); + LowerValueProperty.Changed.AddClassHandler((o, e) => o.OnValueChanged(e, true)); + UpperValueProperty.Changed.AddClassHandler((o, e) => o.OnValueChanged(e, false)); } - + + private void OnValueChanged(AvaloniaPropertyChangedEventArgs args, bool isLower) + { + var oldValue = args.OldValue.Value; + var newValue = args.NewValue.Value; + if (oldValue != newValue) + { + RaiseEvent(new RangeValueChangedEventArgs(ValueChangedEvent, this, oldValue, newValue, isLower)); + } + } + public RangeSlider() { UpdatePseudoClasses(Orientation); diff --git a/src/Ursa/Controls/RangeSlider/RangeTrack.cs b/src/Ursa/Controls/RangeSlider/RangeTrack.cs index aafabcd..f3b80ed 100644 --- a/src/Ursa/Controls/RangeSlider/RangeTrack.cs +++ b/src/Ursa/Controls/RangeSlider/RangeTrack.cs @@ -212,47 +212,17 @@ public class RangeTrack: Control var newThumb = args.NewValue.Value; if(oldThumb is not null) { - oldThumb.DragDelta -= OnThumbDragDelta; LogicalChildren.Remove(oldThumb); VisualChildren.Remove(oldThumb); } if (newThumb is not null) { - newThumb.DragDelta += OnThumbDragDelta; newThumb.ZIndex = 5; LogicalChildren.Add(newThumb); VisualChildren.Add(newThumb); } } - private void OnThumbDragDelta(object sender, VectorEventArgs e) - { - return; - if(sender is not Thumb thumb) return; - bool lower = thumb == LowerThumb; - double scale = IsDirectionReversed ? -1 : 1; - double originalValue = lower ? LowerValue : UpperValue; - double value; - if (Orientation == Orientation.Horizontal) - { - value = scale * e.Vector.X * _density; - } - else - { - value = -1 * scale * e.Vector.Y * _density; - } - var factor = e.Vector / value; - if (lower) - { - SetCurrentValue(LowerValueProperty, MathUtilities.Clamp(originalValue + value, Minimum, UpperValue)); - } - else - { - SetCurrentValue(UpperValueProperty, MathUtilities.Clamp(originalValue + value, LowerValue, Maximum)); - } - - } - private void OnOrientationChanged(AvaloniaPropertyChangedEventArgs args) { Orientation o = args.NewValue.Value; @@ -481,20 +451,6 @@ public class RangeTrack: Control { return !double.IsInfinity(value) && !double.IsNaN(value); } - - internal double GetThumbLength() - { - return Orientation == Orientation.Horizontal - ? LowerThumb?.Bounds.Width ?? 0 + UpperThumb?.Bounds.Width ?? 0 - : LowerThumb?.Bounds.Height ?? 0 + UpperThumb?.Bounds.Height ?? 0; - } - - internal double GetTrackLength() - { - return Orientation == Orientation.Horizontal - ? Bounds.Width - : Bounds.Height; - } internal double GetRatioByPoint(double position) {