From 36ff1b74aca023be577488111b7f0b178cff70f2 Mon Sep 17 00:00:00 2001 From: robloo Date: Thu, 28 Apr 2022 00:06:42 -0400 Subject: [PATCH] Improve ColorChanged event implementations --- .../ColorPreviewer/ColorPreviewer.cs | 27 ++++++++++++++----- .../ColorSlider/ColorSlider.cs | 25 +++++++++++++++++ 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.Controls.ColorPicker/ColorPreviewer/ColorPreviewer.cs b/src/Avalonia.Controls.ColorPicker/ColorPreviewer/ColorPreviewer.cs index 3c429783d5..d04ddf4bd6 100644 --- a/src/Avalonia.Controls.ColorPicker/ColorPreviewer/ColorPreviewer.cs +++ b/src/Avalonia.Controls.ColorPicker/ColorPreviewer/ColorPreviewer.cs @@ -81,16 +81,26 @@ namespace Avalonia.Controls.Primitives base.OnApplyTemplate(e); } + /// + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) + { + if (change.Property == HsvColorProperty) + { + OnColorChanged(new ColorChangedEventArgs( + change.GetOldValue().ToRgb(), + change.GetNewValue().ToRgb())); + } + + base.OnPropertyChanged(change); + } + /// /// Called before the event occurs. /// - /// The newly selected color. - protected virtual void OnColorChanged(HsvColor newColor) + /// The defining old/new colors. + protected virtual void OnColorChanged(ColorChangedEventArgs e) { - var oldColor = HsvColor; - HsvColor = newColor; - - ColorChanged?.Invoke(this, new ColorChangedEventArgs(oldColor.ToRgb(), newColor.ToRgb())); + ColorChanged?.Invoke(this, e); } /// @@ -111,7 +121,10 @@ namespace Avalonia.Controls.Primitives catch { } HsvColor newHsvColor = AccentColorConverter.GetAccent(hsvColor, accentStep); - OnColorChanged(newHsvColor); + HsvColor oldHsvColor = HsvColor; + + HsvColor = newHsvColor; + OnColorChanged(new ColorChangedEventArgs(oldHsvColor.ToRgb(), newHsvColor.ToRgb())); } } } diff --git a/src/Avalonia.Controls.ColorPicker/ColorSlider/ColorSlider.cs b/src/Avalonia.Controls.ColorPicker/ColorSlider/ColorSlider.cs index c73f2b1cea..59fb53556a 100644 --- a/src/Avalonia.Controls.ColorPicker/ColorSlider/ColorSlider.cs +++ b/src/Avalonia.Controls.ColorPicker/ColorSlider/ColorSlider.cs @@ -15,6 +15,11 @@ namespace Avalonia.Controls.Primitives protected const string pcDarkSelector = ":dark-selector"; protected const string pcLightSelector = ":light-selector"; + /// + /// Event for when the selected color changes within the slider. + /// + public event EventHandler? ColorChanged; + private const double MaxHue = 359.99999999999999999; private bool disableUpdates = false; @@ -321,6 +326,10 @@ namespace Avalonia.Controls.Primitives } UpdatePseudoClasses(); + OnColorChanged(new ColorChangedEventArgs( + change.GetOldValue(), + change.GetNewValue())); + disableUpdates = false; } else if (change.Property == HsvColorProperty) @@ -336,6 +345,10 @@ namespace Avalonia.Controls.Primitives } UpdatePseudoClasses(); + OnColorChanged(new ColorChangedEventArgs( + change.GetOldValue().ToRgb(), + change.GetNewValue().ToRgb())); + disableUpdates = false; } else if (change.Property == BoundsProperty) @@ -351,6 +364,7 @@ namespace Avalonia.Controls.Primitives { disableUpdates = true; + Color oldColor = Color; (var color, var hsvColor) = GetColorFromSliderValues(); if (ColorModel == ColorModel.Hsva) @@ -365,10 +379,21 @@ namespace Avalonia.Controls.Primitives } UpdatePseudoClasses(); + OnColorChanged(new ColorChangedEventArgs(oldColor, Color)); + disableUpdates = false; } base.OnPropertyChanged(change); } + + /// + /// Called before the event occurs. + /// + /// The defining old/new colors. + protected virtual void OnColorChanged(ColorChangedEventArgs e) + { + ColorChanged?.Invoke(this, e); + } } }