From eeb37f3296e51cbcdbb3640850ee06b0eebeec57 Mon Sep 17 00:00:00 2001 From: polarboy Date: Sun, 28 Jul 2024 18:53:49 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=99=20Slider=20=E8=AE=BE=E7=BD=AE=20toolt?= =?UTF-8?q?ip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/AtomUI.Controls/Popup/PopupShadowLayer.cs | 1 + src/AtomUI.Controls/Slider/Slider.cs | 53 +++++++++++++++++-- src/AtomUI.Controls/Slider/SliderTheme.cs | 5 ++ src/AtomUI.Controls/Slider/SliderTrack.cs | 4 +- src/AtomUI.Controls/Tooltip/ToolTip.cs | 39 +++++++++++--- src/AtomUI.Controls/Tooltip/ToolTipService.cs | 7 ++- 6 files changed, 95 insertions(+), 14 deletions(-) diff --git a/src/AtomUI.Controls/Popup/PopupShadowLayer.cs b/src/AtomUI.Controls/Popup/PopupShadowLayer.cs index 6523fd759..b4705f32c 100644 --- a/src/AtomUI.Controls/Popup/PopupShadowLayer.cs +++ b/src/AtomUI.Controls/Popup/PopupShadowLayer.cs @@ -127,6 +127,7 @@ internal class PopupShadowLayer : LiteWindow, IShadowDecorator private void TargetPopupPositionChanged(object? sender, PixelPointEventArgs e) { + SetupShadowRenderer(); SetupPositionAndSize(); } diff --git a/src/AtomUI.Controls/Slider/Slider.cs b/src/AtomUI.Controls/Slider/Slider.cs index 7a6de7634..98be6434b 100644 --- a/src/AtomUI.Controls/Slider/Slider.cs +++ b/src/AtomUI.Controls/Slider/Slider.cs @@ -285,6 +285,21 @@ public class Slider : RangeBase _pointerPressDispose = this.AddDisposableHandler(PointerPressedEvent, TrackPressed, RoutingStrategies.Tunnel); _pointerReleaseDispose = this.AddDisposableHandler(PointerReleasedEvent, TrackReleased, RoutingStrategies.Tunnel); _pointerMovedDispose = this.AddDisposableHandler(PointerMovedEvent, TrackMoved, RoutingStrategies.Tunnel); + + if (_track is not null) { + if (!IsRangeMode) { + if (_track.StartSliderThumb is not null) { + ToolTip.SetTip(_track.StartSliderThumb, FormatValue(Value)); + } + } else { + if (_track.StartSliderThumb is not null) { + ToolTip.SetTip(_track.StartSliderThumb, FormatValue(RangeValue.StartValue)); + } + if (_track.EndSliderThumb is not null) { + ToolTip.SetTip(_track.EndSliderThumb, FormatValue(RangeValue.EndValue)); + } + } + } } /// @@ -406,6 +421,12 @@ public class Slider : RangeBase private void TrackReleased(object? sender, PointerReleasedEventArgs e) { + if (_graspedThumb is not null) { + ToolTip.SetIsCustomHide(_graspedThumb, false); + if (!_graspedThumb.Bounds.Contains(e.GetPosition(_track))) { + ToolTip.SetIsOpen(_graspedThumb, false); + } + } _isDragging = false; _graspedThumb = null; } @@ -416,6 +437,10 @@ public class Slider : RangeBase var posOnTrack = e.GetCurrentPoint(_track); _graspedThumb = GetEffectiveMoveThumb(posOnTrack.Position); MoveToPoint(posOnTrack); + if (_graspedThumb is not null) { + ToolTip.SetIsCustomHide(_graspedThumb, true); + } + _isDragging = true; } } @@ -439,19 +464,19 @@ public class Slider : RangeBase var calcVal = Math.Abs(invert - logicalPos); var range = Maximum - Minimum; var finalValue = calcVal * range + Minimum; + finalValue = IsSnapToTickEnabled ? SnapToTick(finalValue) : finalValue; if (!IsRangeMode) { - SetCurrentValue(ValueProperty, IsSnapToTickEnabled ? SnapToTick(finalValue) : finalValue); + SetCurrentValue(ValueProperty, finalValue); } else { - var targetValue = IsSnapToTickEnabled ? SnapToTick(finalValue) : finalValue; var currentRangeValue = RangeValue; if (sliderThumb == _track.StartSliderThumb) { - currentRangeValue.StartValue = targetValue; + currentRangeValue.StartValue = finalValue; } else { - currentRangeValue.EndValue = targetValue; + currentRangeValue.EndValue = finalValue; } + SetCurrentValue(RangeValueProperty, currentRangeValue); } - if (sliderThumb is not null && !sliderThumb.IsFocused) { sliderThumb.Focus(); } @@ -507,9 +532,27 @@ public class Slider : RangeBase if (change.Property == OrientationProperty) { UpdatePseudoClasses(change.GetNewValue()); + } else if (change.Property == ValueProperty) { + if (_track is not null && _track.StartSliderThumb is not null) { + ToolTip.SetTip(_track.StartSliderThumb, FormatValue(Value)); + } + } else if (change.Property == RangeValueProperty) { + if (_track is not null) { + if (_track.StartSliderThumb is not null) { + ToolTip.SetTip(_track.StartSliderThumb, FormatValue(RangeValue.StartValue)); + } + if (_track.EndSliderThumb is not null) { + ToolTip.SetTip(_track.EndSliderThumb, FormatValue(RangeValue.EndValue)); + } + } } } + private string FormatValue(double value) + { + return $"{Math.Round(value)}"; + } + /// /// Called when user start dragging the . /// diff --git a/src/AtomUI.Controls/Slider/SliderTheme.cs b/src/AtomUI.Controls/Slider/SliderTheme.cs index 42dce0161..4e92bdb3d 100644 --- a/src/AtomUI.Controls/Slider/SliderTheme.cs +++ b/src/AtomUI.Controls/Slider/SliderTheme.cs @@ -1,4 +1,5 @@ using AtomUI.Styling; +using Avalonia.Controls; using Avalonia.Controls.Templates; using Avalonia.Data; using Avalonia.Input; @@ -26,6 +27,8 @@ internal class SliderTheme : ControlTheme { Name = StartThumbPart, }; + ToolTip.SetPlacement(startSliderThumb, PlacementMode.Top); + ToolTip.SetShowDelay(startSliderThumb, 50); startSliderThumb.RegisterInNameScope(scope); var endSliderThumb = new SliderThumb @@ -33,6 +36,8 @@ internal class SliderTheme : ControlTheme Name = EndThumbPart, }; endSliderThumb.RegisterInNameScope(scope); + ToolTip.SetPlacement(endSliderThumb, PlacementMode.Top); + ToolTip.SetShowDelay(endSliderThumb, 50); var sliderTrack = new SliderTrack { diff --git a/src/AtomUI.Controls/Slider/SliderTrack.cs b/src/AtomUI.Controls/Slider/SliderTrack.cs index 72c58b338..cabe288d0 100644 --- a/src/AtomUI.Controls/Slider/SliderTrack.cs +++ b/src/AtomUI.Controls/Slider/SliderTrack.cs @@ -278,8 +278,8 @@ public class SliderTrack : Control, IControlCustomStyle sender.GetValue(MaximumProperty)); return new SliderRangeValue() { - StartValue = Math.Min(startValue, endValue), - EndValue = Math.Max(startValue, endValue), + StartValue = startValue, + EndValue = endValue, }; } return sender.GetValue(RangeValueProperty); diff --git a/src/AtomUI.Controls/Tooltip/ToolTip.cs b/src/AtomUI.Controls/Tooltip/ToolTip.cs index 0a1faa754..d42168cf9 100644 --- a/src/AtomUI.Controls/Tooltip/ToolTip.cs +++ b/src/AtomUI.Controls/Tooltip/ToolTip.cs @@ -1,8 +1,5 @@ using System.Reflection; using AtomUI.ColorSystem; -using AtomUI.Controls.MotionScene; -using AtomUI.Controls.Utils; -using AtomUI.MotionScene; using AtomUI.Reflection; using AtomUI.Styling; using AtomUI.Utils; @@ -21,12 +18,12 @@ namespace AtomUI.Controls; [PseudoClasses(StdPseudoClass.Open)] public class ToolTip : TemplatedControl, - IShadowMaskInfoProvider, - IControlCustomStyle + IShadowMaskInfoProvider, + IControlCustomStyle { #region 公共属性定义 - /// + /// /// Defines the property. /// public static readonly StyledProperty ContentProperty = @@ -43,6 +40,12 @@ public class ToolTip : TemplatedControl, /// public static readonly AttachedProperty IsOpenProperty = AvaloniaProperty.RegisterAttached("IsOpen"); + + /// + /// 自己手动关闭哦 + /// + public static readonly AttachedProperty IsCustomHideProperty = + AvaloniaProperty.RegisterAttached("IsCustomHide", false); /// /// Defines the ToolTip.PresetColor attached property. @@ -337,6 +340,16 @@ public class ToolTip : TemplatedControl, { element.SetValue(IsShowArrowProperty, flag); } + + public static bool GetIsCustomHide(Control element) + { + return element.GetValue(IsCustomHideProperty); + } + + public static void SetIsCustomHide(Control element, bool flag) + { + element.SetValue(IsCustomHideProperty, flag); + } /// /// 箭头是否始终指向居中位置 @@ -529,6 +542,20 @@ public class ToolTip : TemplatedControl, } } + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) + { + base.OnPropertyChanged(change); + if (change.Property == ContentProperty) { + if (_arrowDecoratedBox is not null) { + if (_arrowDecoratedBox.Child is TextBlock textBlock) { + if (change.NewValue is string text) { + textBlock.Text = text; + } + } + } + } + } + private static void IsShowArrowChanged(AvaloniaPropertyChangedEventArgs e) { var control = (Control)e.Sender; diff --git a/src/AtomUI.Controls/Tooltip/ToolTipService.cs b/src/AtomUI.Controls/Tooltip/ToolTipService.cs index 97bfb9fd7..2b7af87af 100644 --- a/src/AtomUI.Controls/Tooltip/ToolTipService.cs +++ b/src/AtomUI.Controls/Tooltip/ToolTipService.cs @@ -66,6 +66,9 @@ internal sealed class ToolTipService : IDisposable case RawPointerEventType.MiddleButtonDown: case RawPointerEventType.XButton1Down: case RawPointerEventType.XButton2Down: + if (_tipControl is not null && ToolTip.GetIsCustomHide(_tipControl)) { + break; + } ClearTip(); break; } @@ -216,7 +219,9 @@ internal sealed class ToolTipService : IDisposable private void Close(Control control) { - ToolTip.SetIsOpen(control, false); + if (!ToolTip.GetIsCustomHide(control)) { + ToolTip.SetIsOpen(control, false); + } } private void StopTimer()