From 780ea035a3fae86d7887cd624ae294db684e3f81 Mon Sep 17 00:00:00 2001 From: daniel mayost Date: Mon, 21 Mar 2022 11:49:14 +0200 Subject: [PATCH] >implement FlowDirection on Popup --- src/Avalonia.Controls/MenuItem.cs | 29 ------------------ .../Primitives/OverlayPopupHost.cs | 2 +- .../PopupPositioning/IPopupPositioner.cs | 30 ++++++++++++++++++- src/Avalonia.Controls/Primitives/PopupRoot.cs | 2 +- .../Controls/MenuItem.xaml | 2 +- 5 files changed, 32 insertions(+), 33 deletions(-) diff --git a/src/Avalonia.Controls/MenuItem.cs b/src/Avalonia.Controls/MenuItem.cs index b35fe818aa..adb2e077d5 100644 --- a/src/Avalonia.Controls/MenuItem.cs +++ b/src/Avalonia.Controls/MenuItem.cs @@ -411,33 +411,6 @@ namespace Avalonia.Controls } } - public override void InvalidateFlowDirection() - { - if (_popup != null && Parent is Menu) - { - var popupAnchor = FlowDirection == FlowDirection.LeftToRight ? - PopupAnchor.BottomLeft : PopupAnchor.BottomRight; - - var popupGravity = FlowDirection == FlowDirection.LeftToRight ? - PopupGravity.BottomRight : PopupGravity.BottomLeft; - - var placement = FlowDirection == FlowDirection.LeftToRight ? - PlacementMode.Right : PlacementMode.Left; - - _popup.PlacementAnchor = popupAnchor; - _popup.PlacementGravity = popupGravity; - } - else if (_popup != null) - { - var placement = FlowDirection == FlowDirection.LeftToRight ? - PlacementMode.Right : PlacementMode.Left; - - _popup.PlacementMode = placement; - } - - base.InvalidateFlowDirection(); - } - /// /// Called when the is clicked. /// @@ -522,8 +495,6 @@ namespace Avalonia.Controls _popup.Opened += PopupOpened; _popup.Closed += PopupClosed; } - - InvalidateFlowDirection(); } protected override AutomationPeer OnCreateAutomationPeer() diff --git a/src/Avalonia.Controls/Primitives/OverlayPopupHost.cs b/src/Avalonia.Controls/Primitives/OverlayPopupHost.cs index 6251d5cda7..6ac544e0fe 100644 --- a/src/Avalonia.Controls/Primitives/OverlayPopupHost.cs +++ b/src/Avalonia.Controls/Primitives/OverlayPopupHost.cs @@ -76,7 +76,7 @@ namespace Avalonia.Controls.Primitives Rect? rect = null) { _positionerParameters.ConfigurePosition((TopLevel)_overlayLayer.GetVisualRoot()!, target, placement, offset, anchor, - gravity, constraintAdjustment, rect); + gravity, constraintAdjustment, rect, FlowDirection); UpdatePosition(); } diff --git a/src/Avalonia.Controls/Primitives/PopupPositioning/IPopupPositioner.cs b/src/Avalonia.Controls/Primitives/PopupPositioning/IPopupPositioner.cs index 340076a407..8daf1ac68a 100644 --- a/src/Avalonia.Controls/Primitives/PopupPositioning/IPopupPositioner.cs +++ b/src/Avalonia.Controls/Primitives/PopupPositioning/IPopupPositioner.cs @@ -46,6 +46,7 @@ Copyright © 2019 Nikita Tsukanov using System; using Avalonia.VisualTree; +using Avalonia.Media; namespace Avalonia.Controls.Primitives.PopupPositioning { @@ -444,7 +445,8 @@ namespace Avalonia.Controls.Primitives.PopupPositioning TopLevel topLevel, IVisual target, PlacementMode placement, Point offset, PopupAnchor anchor, PopupGravity gravity, - PopupPositionerConstraintAdjustment constraintAdjustment, Rect? rect) + PopupPositionerConstraintAdjustment constraintAdjustment, Rect? rect, + FlowDirection flowDirection) { // We need a better way for tracking the last pointer position #pragma warning disable CS0618 // Type or member is obsolete @@ -503,6 +505,32 @@ namespace Avalonia.Controls.Primitives.PopupPositioning else throw new InvalidOperationException("Invalid value for Popup.PlacementMode"); } + + // Invert coordinate system if FlowDirection is RTL + if (flowDirection == FlowDirection.RightToLeft) + { + if ((positionerParameters.Anchor & PopupAnchor.Right) == PopupAnchor.Right) + { + positionerParameters.Anchor ^= PopupAnchor.Right; + positionerParameters.Anchor |= PopupAnchor.Left; + } + else if ((positionerParameters.Anchor & PopupAnchor.Left) == PopupAnchor.Left) + { + positionerParameters.Anchor ^= PopupAnchor.Left; + positionerParameters.Anchor |= PopupAnchor.Right; + } + + if ((positionerParameters.Gravity & PopupGravity.Right) == PopupGravity.Right) + { + positionerParameters.Gravity ^= PopupGravity.Right; + positionerParameters.Gravity |= PopupGravity.Left; + } + else if ((positionerParameters.Gravity & PopupGravity.Left) == PopupGravity.Left) + { + positionerParameters.Gravity ^= PopupGravity.Left; + positionerParameters.Gravity |= PopupGravity.Right; + } + } } } diff --git a/src/Avalonia.Controls/Primitives/PopupRoot.cs b/src/Avalonia.Controls/Primitives/PopupRoot.cs index 2f6df862cf..ac652fa53f 100644 --- a/src/Avalonia.Controls/Primitives/PopupRoot.cs +++ b/src/Avalonia.Controls/Primitives/PopupRoot.cs @@ -92,7 +92,7 @@ namespace Avalonia.Controls.Primitives Rect? rect = null) { _positionerParameters.ConfigurePosition(_parent, target, - placement, offset, anchor, gravity, constraintAdjustment, rect); + placement, offset, anchor, gravity, constraintAdjustment, rect, FlowDirection); if (_positionerParameters.Size != default) UpdatePosition(); diff --git a/src/Avalonia.Themes.Fluent/Controls/MenuItem.xaml b/src/Avalonia.Themes.Fluent/Controls/MenuItem.xaml index 45949fee92..831537f578 100644 --- a/src/Avalonia.Themes.Fluent/Controls/MenuItem.xaml +++ b/src/Avalonia.Themes.Fluent/Controls/MenuItem.xaml @@ -111,6 +111,7 @@ @@ -159,7 +160,6 @@