From 19017f1b7f01aabded9c3947d068a8d5714d0332 Mon Sep 17 00:00:00 2001 From: ijklam <43789618+ijklam@users.noreply.github.com> Date: Sat, 1 Feb 2025 22:53:32 +0800 Subject: [PATCH] [ScrollViewerPresenter] Fix rtl scroll (#16667) (#17714) * Fix rtl scroll (#16667) * fix shift + scroll --------- Co-authored-by: ijklam <43789618+Tangent-90@users.noreply.github.com> --- .../Presenters/ScrollContentPresenter.cs | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs b/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs index 799b9dc992..88e10c3ba3 100644 --- a/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs +++ b/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs @@ -201,7 +201,7 @@ namespace Avalonia.Controls.Presenters /// public SnapPointsAlignment VerticalSnapPointsAlignment { - get => GetValue(VerticalSnapPointsAlignmentProperty); + get => GetValue(VerticalSnapPointsAlignmentProperty); set => SetValue(VerticalSnapPointsAlignmentProperty, value); } @@ -514,7 +514,7 @@ namespace Avalonia.Controls.Presenters Vector delta = default; if (isLogical) _activeLogicalGestureScrolls?.TryGetValue(e.Id, out delta); - delta += e.Delta; + delta += AdjustDeltaForFlowDirection(e.Delta, FlowDirection); if (isLogical && scrollable is object) { @@ -673,7 +673,11 @@ namespace Avalonia.Controls.Presenters { delta = new Vector(delta.Y, delta.X); } - + else + { + delta = AdjustDeltaForFlowDirection(delta, FlowDirection); + } + if (Extent.Height > Viewport.Height) { double height = isLogical ? scrollable!.ScrollSize.Height : 50; @@ -954,7 +958,7 @@ namespace Avalonia.Controls.Presenters midPoint = (previousSnapPoint + nextSnapPoint) / 2; } - var nearestSnapPoint = snapToNext ? (direction.Y > 0 ? previousSnapPoint : nextSnapPoint ) : + var nearestSnapPoint = snapToNext ? (direction.Y > 0 ? previousSnapPoint : nextSnapPoint) : estimatedOffset.Y < midPoint ? previousSnapPoint : nextSnapPoint; offset = new Vector(offset.X, nearestSnapPoint - diff.Y); @@ -977,7 +981,7 @@ namespace Avalonia.Controls.Presenters midPoint = (previousSnapPoint + nextSnapPoint) / 2; } - var nearestSnapPoint = snapToNext ? (direction.X > 0 ? previousSnapPoint : nextSnapPoint) : + var nearestSnapPoint = snapToNext ? (direction.X > 0 ? previousSnapPoint : nextSnapPoint) : estimatedOffset.X < midPoint ? previousSnapPoint : nextSnapPoint; offset = new Vector(nearestSnapPoint - diff.X, offset.Y); @@ -1046,9 +1050,9 @@ namespace Avalonia.Controls.Presenters var snapPointsInfo = scrollable as IScrollSnapPointsInfo; - if(snapPointsInfo != _scrollSnapPointsInfo) + if (snapPointsInfo != _scrollSnapPointsInfo) { - if(_scrollSnapPointsInfo != null) + if (_scrollSnapPointsInfo != null) { _scrollSnapPointsInfo.VerticalSnapPointsChanged -= ScrollSnapPointsInfoSnapPointsChanged; _scrollSnapPointsInfo.HorizontalSnapPointsChanged -= ScrollSnapPointsInfoSnapPointsChanged; @@ -1056,7 +1060,7 @@ namespace Avalonia.Controls.Presenters _scrollSnapPointsInfo = snapPointsInfo; - if(_scrollSnapPointsInfo != null) + if (_scrollSnapPointsInfo != null) { _scrollSnapPointsInfo.VerticalSnapPointsChanged += ScrollSnapPointsInfoSnapPointsChanged; _scrollSnapPointsInfo.HorizontalSnapPointsChanged += ScrollSnapPointsInfoSnapPointsChanged; @@ -1065,5 +1069,14 @@ namespace Avalonia.Controls.Presenters return snapPointsInfo; } + + private static Vector AdjustDeltaForFlowDirection(Vector delta, Media.FlowDirection flowDirection) + { + if (flowDirection == Media.FlowDirection.RightToLeft) + { + return delta.WithX(-delta.X); + } + return delta; + } } }