diff --git a/src/Avalonia.Visuals/Media/ExperimentalAcrylicBrush.cs b/src/Avalonia.Visuals/Media/ExperimentalAcrylicBrush.cs index 2ab2701c9d..3c093b1919 100644 --- a/src/Avalonia.Visuals/Media/ExperimentalAcrylicBrush.cs +++ b/src/Avalonia.Visuals/Media/ExperimentalAcrylicBrush.cs @@ -1,17 +1,67 @@ namespace Avalonia.Media { - public class ExperimentalAcrylicBrush : IExperimentalAcrylicBrush + public class ExperimentalAcrylicBrush : Brush, IExperimentalAcrylicBrush { - public AcrylicBackgroundSource BackgroundSource { get; set; } + static ExperimentalAcrylicBrush() + { + AffectsRender( + TintColorProperty, + BackgroundSourceProperty, + TintOpacityProperty, + TintLuminosityOpacityProperty); + } - public Color TintColor { get; set; } + /// + /// Defines the property. + /// + public static readonly StyledProperty TintColorProperty = + AvaloniaProperty.Register(nameof(TintColor)); - public double TintOpacity { get; set; } + public static readonly StyledProperty BackgroundSourceProperty = + AvaloniaProperty.Register(nameof(BackgroundSource)); - public Color FallbackColor { get; set; } + public static readonly StyledProperty TintOpacityProperty = + AvaloniaProperty.Register(nameof(TintOpacity)); - public double TintLuminosityOpacity { get; set; } + public static readonly StyledProperty TintLuminosityOpacityProperty = + AvaloniaProperty.Register(nameof(TintLuminosityOpacity)); - public double Opacity { get; set; } + public static readonly StyledProperty FallbackColorProperty = + AvaloniaProperty.Register(nameof(FallbackColor)); + + public AcrylicBackgroundSource BackgroundSource + { + get => GetValue(BackgroundSourceProperty); + set => SetValue(BackgroundSourceProperty, value); + } + + public Color TintColor + { + get => GetValue(TintColorProperty); + set => SetValue(TintColorProperty, value); + } + + public double TintOpacity + { + get => GetValue(TintOpacityProperty); + set => SetValue(TintOpacityProperty, value); + } + + public Color FallbackColor + { + get => GetValue(FallbackColorProperty); + set => SetValue(FallbackColorProperty, value); + } + + public double TintLuminosityOpacity + { + get => GetValue(TintLuminosityOpacityProperty); + set => SetValue(TintLuminosityOpacityProperty, value); + } + + public override IBrush ToImmutable() + { + return new ImmutableExperimentalAcrylicBrush(this); + } } } diff --git a/src/Avalonia.Visuals/Media/IExperimentalAcrylicBrush.cs b/src/Avalonia.Visuals/Media/IExperimentalAcrylicBrush.cs index ae202b58ae..adc9335eab 100644 --- a/src/Avalonia.Visuals/Media/IExperimentalAcrylicBrush.cs +++ b/src/Avalonia.Visuals/Media/IExperimentalAcrylicBrush.cs @@ -2,14 +2,14 @@ { public interface IExperimentalAcrylicBrush : IBrush { - AcrylicBackgroundSource BackgroundSource { get; set; } + AcrylicBackgroundSource BackgroundSource { get; } - Color TintColor { get; set; } + Color TintColor { get; } - double TintOpacity { get; set; } + double TintOpacity { get; } - double TintLuminosityOpacity { get; set; } + double TintLuminosityOpacity { get; } - Color FallbackColor { get; set; } + Color FallbackColor { get; } } } diff --git a/src/Avalonia.Visuals/Media/ImmutableExperimentalAcrylicBrush.cs b/src/Avalonia.Visuals/Media/ImmutableExperimentalAcrylicBrush.cs new file mode 100644 index 0000000000..ad91b5fa42 --- /dev/null +++ b/src/Avalonia.Visuals/Media/ImmutableExperimentalAcrylicBrush.cs @@ -0,0 +1,73 @@ +using System; + +namespace Avalonia.Media +{ + public readonly struct ImmutableExperimentalAcrylicBrush : IExperimentalAcrylicBrush, IEquatable + { + public ImmutableExperimentalAcrylicBrush(IExperimentalAcrylicBrush brush) + { + BackgroundSource = brush.BackgroundSource; + TintColor = brush.TintColor; + TintOpacity = brush.TintOpacity; + TintLuminosityOpacity = brush.TintLuminosityOpacity; + FallbackColor = brush.FallbackColor; + Opacity = brush.Opacity; + } + + public AcrylicBackgroundSource BackgroundSource { get; } + + public Color TintColor { get; } + + public double TintOpacity { get; } + + public double TintLuminosityOpacity { get; } + + public Color FallbackColor { get; } + + public double Opacity { get; } + + public bool Equals(ImmutableExperimentalAcrylicBrush other) + { + // ReSharper disable once CompareOfFloatsByEqualityOperator + return + TintColor == other.TintColor && + Opacity == other.Opacity && + TintOpacity == other.TintOpacity && + BackgroundSource == other.BackgroundSource && + TintLuminosityOpacity == other.TintLuminosityOpacity && + FallbackColor == other.FallbackColor; + } + + public override bool Equals(object obj) + { + return obj is ImmutableExperimentalAcrylicBrush other && Equals(other); + } + + public override int GetHashCode() + { + unchecked + { + int hash = 17; + + hash = (hash * 23) + TintColor.GetHashCode(); + hash = (hash * 23) + TintLuminosityOpacity.GetHashCode(); + hash = (hash * 23) + Opacity.GetHashCode(); + hash = (hash * 23) + TintOpacity.GetHashCode(); + hash = (hash * 23) + BackgroundSource.GetHashCode(); + hash = (hash * 23) + FallbackColor.GetHashCode(); + + return hash; + } + } + + public static bool operator ==(ImmutableExperimentalAcrylicBrush left, ImmutableExperimentalAcrylicBrush right) + { + return left.Equals(right); + } + + public static bool operator !=(ImmutableExperimentalAcrylicBrush left, ImmutableExperimentalAcrylicBrush right) + { + return !left.Equals(right); + } + } +}