diff --git a/src/AtomUI.Controls/Buttons/Button.cs b/src/AtomUI.Controls/Buttons/Button.cs index 65717f20e..ef637470f 100644 --- a/src/AtomUI.Controls/Buttons/Button.cs +++ b/src/AtomUI.Controls/Buttons/Button.cs @@ -263,52 +263,55 @@ public class Button : AvaloniaButton, return new Size(targetWidth, targetHeight); } - private void SetupShadows() + private void SetupShadows(bool force = false) { - if (ButtonType == ButtonType.Default) + if (force || Effect == null) { - if (IsDanger) + if (ButtonType == ButtonType.Default) { - Effect = new DropShadowEffect + if (IsDanger) { - OffsetX = DangerShadow.OffsetX, - OffsetY = DangerShadow.OffsetY, - Color = DangerShadow.Color, - BlurRadius = DangerShadow.Blur - }; + Effect = new DropShadowEffect + { + OffsetX = DangerShadow.OffsetX, + OffsetY = DangerShadow.OffsetY, + Color = DangerShadow.Color, + BlurRadius = DangerShadow.Blur + }; + } + else + { + Effect = new DropShadowEffect + { + OffsetX = DefaultShadow.OffsetX, + OffsetY = DefaultShadow.OffsetY, + Color = DefaultShadow.Color, + BlurRadius = DefaultShadow.Blur + }; + } } - else + else if (ButtonType == ButtonType.Primary) { - Effect = new DropShadowEffect + if (IsDanger) { - OffsetX = DefaultShadow.OffsetX, - OffsetY = DefaultShadow.OffsetY, - Color = DefaultShadow.Color, - BlurRadius = DefaultShadow.Blur - }; - } - } - else if (ButtonType == ButtonType.Primary) - { - if (IsDanger) - { - Effect = new DropShadowEffect + Effect = new DropShadowEffect + { + OffsetX = DangerShadow.OffsetX, + OffsetY = DangerShadow.OffsetY, + Color = DangerShadow.Color, + BlurRadius = DangerShadow.Blur + }; + } + else { - OffsetX = DangerShadow.OffsetX, - OffsetY = DangerShadow.OffsetY, - Color = DangerShadow.Color, - BlurRadius = DangerShadow.Blur - }; - } - else - { - Effect = new DropShadowEffect - { - OffsetX = PrimaryShadow.OffsetX, - OffsetY = PrimaryShadow.OffsetY, - Color = PrimaryShadow.Color, - BlurRadius = PrimaryShadow.Blur - }; + Effect = new DropShadowEffect + { + OffsetX = PrimaryShadow.OffsetX, + OffsetY = PrimaryShadow.OffsetY, + Color = PrimaryShadow.Color, + BlurRadius = PrimaryShadow.Blur + }; + } } } } @@ -372,7 +375,7 @@ public class Button : AvaloniaButton, e.Property == IsGhostProperty || e.Property == ButtonTypeProperty) { - SetupShadows(); + SetupShadows(true); } else if (e.Property == IsMotionEnabledProperty || e.Property == IsWaveSpiritEnabledProperty) diff --git a/src/AtomUI.Controls/ColorPicker/ColorPickerToken.cs b/src/AtomUI.Controls/ColorPicker/ColorPickerToken.cs index a43c0d9cd..153c4b1fc 100644 --- a/src/AtomUI.Controls/ColorPicker/ColorPickerToken.cs +++ b/src/AtomUI.Controls/ColorPicker/ColorPickerToken.cs @@ -55,10 +55,16 @@ public class ColorPickerToken : AbstractControlDesignToken public Color ColorPickerHandlerDarkColor { get; set; } /// - /// ColorPicker 滑块高度 + /// ColorPicker 滑块高度或者宽度 /// Slider height of ColorPicker /// - public double ColorPickerSliderHeight { get; set; } + public double ColorPickerSliderSize { get; set; } + + /// + /// ColorPicker 轨道的大小高度或者宽度 + /// Slider height of ColorPicker Track + /// + public double ColorPickerSliderTrackSize { get; set; } /// /// ColorPicker 预览尺寸 @@ -99,6 +105,11 @@ public class ColorPickerToken : AbstractControlDesignToken /// public Thickness TriggerTextMargin { get; set; } + /// + /// 颜色滑块外间距 + /// + public Thickness SliderContainerMargin { get; set; } + public ColorPickerToken() : base(ID) { @@ -114,8 +125,9 @@ public class ColorPickerToken : AbstractControlDesignToken ColorPickerAlphaInputWidth = 44; ColorPickerInputNumberHandleWidth = 16; ColorPickerPresetColorSize = 24; - ColorPickerSliderHeight = 8; - ColorPickerPreviewSize = ColorPickerSliderHeight * 2 + SharedToken.UniformlyMarginSM; + ColorPickerSliderSize = ColorPickerHandlerSizeSM; + ColorPickerSliderTrackSize = 8; + ColorPickerPreviewSize = ColorPickerSliderSize * 2 + SharedToken.UniformlyMarginSM; ColorPickerInsetShadow = new BoxShadows(new BoxShadow() { IsInset = true, @@ -140,6 +152,7 @@ public class ColorPickerToken : AbstractControlDesignToken ColorSpectrumHeight = SharedToken.ControlHeightLG * 4; ColorPickerHandlerLightColor = SharedToken.ColorBgElevated; - ColorPickerHandlerDarkColor = Color.Parse("#22075e"); + ColorPickerHandlerDarkColor = Color.Parse("#22075e"); + SliderContainerMargin = new Thickness(0, 0, SharedToken.UniformlyMarginSM, 0); } } diff --git a/src/AtomUI.Controls/ColorPicker/ColorSlider.cs b/src/AtomUI.Controls/ColorPicker/ColorSlider.cs new file mode 100644 index 000000000..59c0b5678 --- /dev/null +++ b/src/AtomUI.Controls/ColorPicker/ColorSlider.cs @@ -0,0 +1,31 @@ +using Avalonia; +using Avalonia.Layout; + +namespace AtomUI.Controls; + +using AvaloniaColorSlider = Avalonia.Controls.Primitives.ColorSlider; + +public class ColorSlider : AvaloniaColorSlider +{ + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) + { + base.OnPropertyChanged(change); + if (change.Property == HeightProperty || + change.Property == WidthProperty) + { + ConfigureCornerRadius(); + } + } + + protected void ConfigureCornerRadius() + { + if (Orientation == Orientation.Vertical) + { + CornerRadius = new CornerRadius(Width / 2); + } + else + { + CornerRadius = new CornerRadius(Height / 2); + } + } +} \ No newline at end of file diff --git a/src/AtomUI.Controls/ColorPicker/ColorSpectrum.cs b/src/AtomUI.Controls/ColorPicker/ColorSpectrum.cs index ebdf3bdcb..cc509e53b 100644 --- a/src/AtomUI.Controls/ColorPicker/ColorSpectrum.cs +++ b/src/AtomUI.Controls/ColorPicker/ColorSpectrum.cs @@ -332,10 +332,10 @@ public class ColorSpectrum : TemplatedControl if (_inputTarget != null) { _inputTarget.PointerEntered += InputTarget_PointerEntered; - _inputTarget.PointerExited += InputTarget_PointerExited; - _inputTarget.PointerPressed += InputTarget_PointerPressed; - _inputTarget.PointerMoved += InputTarget_PointerMoved; - _inputTarget.PointerReleased += InputTarget_PointerReleased; + _inputTarget.PointerExited += HandleInputTargetPointerExited; + _inputTarget.PointerPressed += HandleInputTargetPointerPressed; + _inputTarget.PointerMoved += HandleInputTargetPointerMoved; + _inputTarget.PointerReleased += HandleInputTargetPointerReleased; } if (_layoutRoot != null) @@ -405,10 +405,10 @@ public class ColorSpectrum : TemplatedControl if (_inputTarget != null) { _inputTarget.PointerEntered -= InputTarget_PointerEntered; - _inputTarget.PointerExited -= InputTarget_PointerExited; - _inputTarget.PointerPressed -= InputTarget_PointerPressed; - _inputTarget.PointerMoved -= InputTarget_PointerMoved; - _inputTarget.PointerReleased -= InputTarget_PointerReleased; + _inputTarget.PointerExited -= HandleInputTargetPointerExited; + _inputTarget.PointerPressed -= HandleInputTargetPointerPressed; + _inputTarget.PointerMoved -= HandleInputTargetPointerMoved; + _inputTarget.PointerReleased -= HandleInputTargetPointerReleased; } } @@ -1082,14 +1082,14 @@ public class ColorSpectrum : TemplatedControl } /// - private void InputTarget_PointerExited(object? sender, PointerEventArgs args) + private void HandleInputTargetPointerExited(object? sender, PointerEventArgs args) { UpdatePseudoClasses(); args.Handled = true; } /// - private void InputTarget_PointerPressed(object? sender, PointerPressedEventArgs args) + private void HandleInputTargetPointerPressed(object? sender, PointerPressedEventArgs args) { var inputTarget = _inputTarget; @@ -1110,7 +1110,7 @@ public class ColorSpectrum : TemplatedControl } /// - private void InputTarget_PointerMoved(object? sender, PointerEventArgs args) + private void HandleInputTargetPointerMoved(object? sender, PointerEventArgs args) { if (!_isPointerPressed) { @@ -1122,7 +1122,7 @@ public class ColorSpectrum : TemplatedControl } /// - private void InputTarget_PointerReleased(object? sender, PointerReleasedEventArgs args) + private void HandleInputTargetPointerReleased(object? sender, PointerReleasedEventArgs args) { _isPointerPressed = false; _shouldShowLargeSelection = false; diff --git a/src/AtomUI.Controls/ColorPicker/Themes/AbstractColorPickerViewTheme.axaml b/src/AtomUI.Controls/ColorPicker/Themes/AbstractColorPickerViewTheme.axaml index a85d9f920..9db49b70d 100644 --- a/src/AtomUI.Controls/ColorPicker/Themes/AbstractColorPickerViewTheme.axaml +++ b/src/AtomUI.Controls/ColorPicker/Themes/AbstractColorPickerViewTheme.axaml @@ -16,8 +16,8 @@ MinHeight="{TemplateBinding MinHeight}"> - - + + + + + + + + + + - + + + + + + + - \ No newline at end of file diff --git a/src/AtomUI.Controls/ColorPicker/Themes/ColorPickerThemes.axaml b/src/AtomUI.Controls/ColorPicker/Themes/ColorPickerThemes.axaml index 5a5d54b1c..f9132c2a6 100644 --- a/src/AtomUI.Controls/ColorPicker/Themes/ColorPickerThemes.axaml +++ b/src/AtomUI.Controls/ColorPicker/Themes/ColorPickerThemes.axaml @@ -8,5 +8,6 @@ + \ No newline at end of file diff --git a/src/AtomUI.Controls/ColorPicker/Themes/ColorSliderTheme.axaml b/src/AtomUI.Controls/ColorPicker/Themes/ColorSliderTheme.axaml new file mode 100644 index 000000000..8ba8dd42c --- /dev/null +++ b/src/AtomUI.Controls/ColorPicker/Themes/ColorSliderTheme.axaml @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AtomUI.Controls/ColorPicker/Themes/ColorSpectrumTheme.axaml b/src/AtomUI.Controls/ColorPicker/Themes/ColorSpectrumTheme.axaml index c62984e76..458337979 100644 --- a/src/AtomUI.Controls/ColorPicker/Themes/ColorSpectrumTheme.axaml +++ b/src/AtomUI.Controls/ColorPicker/Themes/ColorSpectrumTheme.axaml @@ -10,15 +10,15 @@ - - + + + VerticalAlignment="Center"> - - + + - + + - + - + \ No newline at end of file diff --git a/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs b/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs index a74beda3a..83515aa2d 100644 --- a/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs +++ b/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs @@ -247,9 +247,11 @@ namespace AtomUI.Theme.Styling public static readonly TokenResourceKey ColorPickerInsetShadow = new TokenResourceKey("ColorPicker.ColorPickerInsetShadow"); public static readonly TokenResourceKey ColorPickerPresetColorSize = new TokenResourceKey("ColorPicker.ColorPickerPresetColorSize"); public static readonly TokenResourceKey ColorPickerPreviewSize = new TokenResourceKey("ColorPicker.ColorPickerPreviewSize"); - public static readonly TokenResourceKey ColorPickerSliderHeight = new TokenResourceKey("ColorPicker.ColorPickerSliderHeight"); + public static readonly TokenResourceKey ColorPickerSliderSize = new TokenResourceKey("ColorPicker.ColorPickerSliderSize"); + public static readonly TokenResourceKey ColorPickerSliderTrackSize = new TokenResourceKey("ColorPicker.ColorPickerSliderTrackSize"); public static readonly TokenResourceKey ColorPickerWidth = new TokenResourceKey("ColorPicker.ColorPickerWidth"); public static readonly TokenResourceKey ColorSpectrumHeight = new TokenResourceKey("ColorPicker.ColorSpectrumHeight"); + public static readonly TokenResourceKey SliderContainerMargin = new TokenResourceKey("ColorPicker.SliderContainerMargin"); public static readonly TokenResourceKey TriggerPadding = new TokenResourceKey("ColorPicker.TriggerPadding"); public static readonly TokenResourceKey TriggerTextMargin = new TokenResourceKey("ColorPicker.TriggerTextMargin"); } diff --git a/src/AtomUI.Controls/Slider/SliderTrack.cs b/src/AtomUI.Controls/Slider/SliderTrack.cs index 54e73c58f..7508e35c5 100644 --- a/src/AtomUI.Controls/Slider/SliderTrack.cs +++ b/src/AtomUI.Controls/Slider/SliderTrack.cs @@ -1,11 +1,7 @@ using System.Globalization; -using System.Reactive.Disposables; using AtomUI.Animations; using AtomUI.Controls.Utils; using AtomUI.Media; -using AtomUI.Theme; -using AtomUI.Theme.Data; -using AtomUI.Theme.Styling; using AtomUI.Utils; using Avalonia; using Avalonia.Animation; @@ -18,7 +14,6 @@ using Avalonia.Input; using Avalonia.Input.Raw; using Avalonia.Interactivity; using Avalonia.Layout; -using Avalonia.LogicalTree; using Avalonia.Media; using Avalonia.Utilities; using Avalonia.VisualTree; @@ -26,8 +21,7 @@ using Avalonia.VisualTree; namespace AtomUI.Controls; [PseudoClasses(StdPseudoClass.Vertical, StdPseudoClass.Horizontal)] -public class SliderTrack : Control, - IResourceBindingManager +public class SliderTrack : TemplatedControl { #region 公共属性定义 @@ -210,9 +204,6 @@ public class SliderTrack : Control, internal static readonly StyledProperty SliderMarkSizeProperty = AvaloniaProperty.Register(nameof(SliderMarkSize)); - internal static readonly StyledProperty PaddingProperty = - Decorator.PaddingProperty.AddOwner(); - internal static readonly StyledProperty MarkBorderBrushProperty = AvaloniaProperty.Register(nameof(MarkBorderBrush)); @@ -231,8 +222,8 @@ public class SliderTrack : Control, internal static readonly RoutedEvent TrailReleasedEvent = RoutedEvent.Register(nameof(TrailReleased), RoutingStrategies.Bubble); - internal static readonly StyledProperty IsMotionEnabledProperty - = MotionAwareControlProperty.IsMotionEnabledProperty.AddOwner(); + internal static readonly StyledProperty IsMotionEnabledProperty = + MotionAwareControlProperty.IsMotionEnabledProperty.AddOwner(); internal double SliderTrackSize { @@ -252,12 +243,6 @@ public class SliderTrack : Control, set => SetValue(SliderMarkSizeProperty, value); } - public Thickness Padding - { - get => GetValue(PaddingProperty); - set => SetValue(PaddingProperty, value); - } - internal IBrush? MarkBorderBrush { get => GetValue(MarkBorderBrushProperty); @@ -287,12 +272,7 @@ public class SliderTrack : Control, get => GetValue(IsMotionEnabledProperty); set => SetValue(IsMotionEnabledProperty, value); } - - CompositeDisposable? IResourceBindingManager.ResourceBindingsDisposable - { - get => _resourceBindingsDisposable; - set => _resourceBindingsDisposable = value; - } + #endregion #region 事件定义 @@ -310,13 +290,11 @@ public class SliderTrack : Control, } #endregion - - private CompositeDisposable? _resourceBindingsDisposable; + private VectorEventArgs? _deferredThumbDrag; private Vector _lastDrag; private RenderContextData? _renderContextData; - - + /// /// Gets the value of the 's current position. This can differ from when /// is true. @@ -425,18 +403,6 @@ public class SliderTrack : Control, protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) { base.OnAttachedToVisualTree(e); - _resourceBindingsDisposable = new CompositeDisposable(); - this.AddResourceBindingDisposable( - TokenResourceBinder.CreateTokenBinding(this, SliderTrackSizeProperty, SliderTokenKey.SliderTrackSize)); - this.AddResourceBindingDisposable( - TokenResourceBinder.CreateTokenBinding(this, SliderMarkSizeProperty, SliderTokenKey.MarkSize)); - this.AddResourceBindingDisposable( - TokenResourceBinder.CreateTokenBinding(this, SliderRailSizeProperty, SliderTokenKey.RailSize)); - this.AddResourceBindingDisposable(TokenResourceBinder.CreateTokenBinding(this, MarkBackgroundBrushProperty, - SharedTokenKey.ColorBgElevated)); - this.AddResourceBindingDisposable(TokenResourceBinder.CreateTokenBinding(this, MarkBorderThicknessProperty, - SliderTokenKey.ThumbCircleBorderThickness)); - var inputManager = AvaloniaLocator.Current.GetService()!; _focusProcessDisposable = inputManager.Process.Subscribe(args => { @@ -456,7 +422,6 @@ public class SliderTrack : Control, } }); HandleRangeModeChanged(); - SetupMarkLabelBrush(); CalculateMaxMarkSize(); ConfigureTransitions(); } @@ -465,21 +430,6 @@ public class SliderTrack : Control, { base.OnDetachedFromVisualTree(e); _focusProcessDisposable?.Dispose(); - this.DisposeTokenBindings(); - } - - private void SetupMarkLabelBrush() - { - if (IsEnabled) - { - this.AddResourceBindingDisposable( - TokenResourceBinder.CreateTokenBinding(this, MarkLabelBrushProperty, SharedTokenKey.ColorText)); - } - else - { - this.AddResourceBindingDisposable(TokenResourceBinder.CreateTokenBinding(this, MarkLabelBrushProperty, - SharedTokenKey.ColorTextDisabled)); - } } private void HandleGlobalMousePressed(Point point) @@ -599,10 +549,7 @@ public class SliderTrack : Control, var isVertical = Orientation == Orientation.Vertical; ComputeDensity(arrangeSize, isVertical); - - // Layout the pieces of track - var isDirectionReversed = IsDirectionReversed; - + var thumbCenterPoints = CalculateThumbCenterOffset(arrangeSize); StartThumbCenterOffset = thumbCenterPoints.Item1; EndThumbCenterOffset = thumbCenterPoints.Item2; @@ -735,7 +682,6 @@ public class SliderTrack : Control, { if (change.Property == IsEnabledProperty) { - SetupMarkLabelBrush(); CalculateMaxMarkSize(true); } else if (change.Property == MarksProperty) diff --git a/src/AtomUI.Controls/Slider/Themes/SliderThemes.axaml b/src/AtomUI.Controls/Slider/Themes/SliderThemes.axaml index 9e62bc65c..247aa6c04 100644 --- a/src/AtomUI.Controls/Slider/Themes/SliderThemes.axaml +++ b/src/AtomUI.Controls/Slider/Themes/SliderThemes.axaml @@ -4,5 +4,6 @@ + \ No newline at end of file diff --git a/src/AtomUI.Controls/Slider/Themes/SliderTrackTheme.axaml b/src/AtomUI.Controls/Slider/Themes/SliderTrackTheme.axaml new file mode 100644 index 000000000..6d9d3d17b --- /dev/null +++ b/src/AtomUI.Controls/Slider/Themes/SliderTrackTheme.axaml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + \ No newline at end of file