From 46db07296b0c524329b3ae64922fb75cbda8d02f Mon Sep 17 00:00:00 2001 From: chinboy Date: Fri, 20 Jun 2025 18:48:53 +0800 Subject: [PATCH] Fix popup shadow layer bug on macos --- src/AtomUI.Base/MotionScene/SceneLayer.cs | 6 ++--- src/AtomUI.Controls/Popup/PopupBuddyLayer.cs | 24 +++++++++++++++++++- src/AtomUI.Controls/TextBlock/TextBlock.cs | 8 +------ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/AtomUI.Base/MotionScene/SceneLayer.cs b/src/AtomUI.Base/MotionScene/SceneLayer.cs index 274ec9854..7b2c66a3b 100644 --- a/src/AtomUI.Base/MotionScene/SceneLayer.cs +++ b/src/AtomUI.Base/MotionScene/SceneLayer.cs @@ -11,7 +11,7 @@ namespace AtomUI.MotionScene; internal class SceneLayer : WindowBase, IHostedVisualTreeRoot, IDisposable { - private readonly IManagedPopupPositionerPopup? _managedPopupPositionerPopup; + protected readonly IManagedPopupPositionerPopup? ManagedPopupPositionerPopup; private readonly Canvas _layout; private SceneMotionActorControl? _motionActorControl; @@ -49,7 +49,7 @@ internal class SceneLayer : WindowBase, IHostedVisualTreeRoot, IDisposable this.SetWindowIgnoreMouseEvents(true); if (PlatformImpl?.PopupPositioner is ManagedPopupPositioner managedPopupPositioner) { - _managedPopupPositionerPopup = managedPopupPositioner.GetManagedPopupPositionerPopup(); + ManagedPopupPositionerPopup = managedPopupPositioner.GetManagedPopupPositionerPopup(); } _layout = new Canvas(); @@ -155,7 +155,7 @@ internal class SceneLayer : WindowBase, IHostedVisualTreeRoot, IDisposable { Width = size.Width; Height = size.Height; - _managedPopupPositionerPopup?.MoveAndResize(new Point(Math.Round(point.X), Math.Floor(point.Y + 0.5)), size); + ManagedPopupPositionerPopup?.MoveAndResize(new Point(Math.Round(point.X), Math.Floor(point.Y + 0.5)), size); } protected override void OnOpened(EventArgs e) diff --git a/src/AtomUI.Controls/Popup/PopupBuddyLayer.cs b/src/AtomUI.Controls/Popup/PopupBuddyLayer.cs index d24080fcb..3f36ecf99 100644 --- a/src/AtomUI.Controls/Popup/PopupBuddyLayer.cs +++ b/src/AtomUI.Controls/Popup/PopupBuddyLayer.cs @@ -113,10 +113,32 @@ internal class PopupBuddyLayer : SceneLayer, IPopupBuddyLayer, IShadowAwareLayer { scaling = windowBase.DesktopScaling; } - var offset = new Point(popupOffset.X, popupOffset.Y); + var offset = new Point(popupOffset.X, popupOffset.Y); + var maskShadowsThickness = MaskShadows.Thickness(); var layerOffset = new Point(offset.X - maskShadowsThickness.Left * scaling, offset.Y - maskShadowsThickness.Top * scaling); + if (OperatingSystem.IsMacOS()) + { + var topOffsetMark = 0d; + if (ManagedPopupPositionerPopup != null) + { + var screens = ManagedPopupPositionerPopup.Screens; + foreach (var screen in screens) + { + topOffsetMark = Math.Max(topOffsetMark, screen.WorkingArea.Top); + } + } + var delta = layerOffset.Y - topOffsetMark; + if (delta < 0) + { + RenderTransform = new TranslateTransform(0, delta); + } + else + { + RenderTransform = null; + } + } MoveAndResize(layerOffset, popupRoot.ClientSize.Inflate(MaskShadows.Thickness())); } diff --git a/src/AtomUI.Controls/TextBlock/TextBlock.cs b/src/AtomUI.Controls/TextBlock/TextBlock.cs index cfa6080f3..3f4add529 100644 --- a/src/AtomUI.Controls/TextBlock/TextBlock.cs +++ b/src/AtomUI.Controls/TextBlock/TextBlock.cs @@ -34,13 +34,7 @@ public class TextBlock : AvaloniaTextBlock, IResourceBindingManager base.OnDetachedFromVisualTree(e); this.DisposeTokenBindings(); } - - protected override Size MeasureOverride(Size availableSize) - { - var size = base.MeasureOverride(availableSize); - return new Size(size.Width, size.Height + Math.Abs(_deltaOffsetY)); - } - + protected override void RenderTextLayout(DrawingContext context, Point origin) { base.RenderTextLayout(context, new Point(origin.X, origin.Y + _deltaOffsetY));