From 833006f253422374039331383282daea219d4afc Mon Sep 17 00:00:00 2001 From: Benjamin Lehmann Date: Fri, 29 Jul 2022 19:13:41 -0600 Subject: [PATCH 1/2] PointerWheelEventArgs: Adds RawDelta Delta is flipped if the user holds down Shift while scrolling. RawDelta preserves the original scroll vector. --- src/Avalonia.Base/Input/MouseDevice.cs | 3 ++- src/Avalonia.Base/Input/PointerWheelEventArgs.cs | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Base/Input/MouseDevice.cs b/src/Avalonia.Base/Input/MouseDevice.cs index 055c9cf1fd..720e869e5b 100644 --- a/src/Avalonia.Base/Input/MouseDevice.cs +++ b/src/Avalonia.Base/Input/MouseDevice.cs @@ -196,6 +196,7 @@ namespace Avalonia.Input PointerPointProperties props, Vector delta, KeyModifiers inputModifiers, IInputElement? hitTest) { + var rawDelta = delta; device = device ?? throw new ArgumentNullException(nameof(device)); root = root ?? throw new ArgumentNullException(nameof(root)); @@ -210,7 +211,7 @@ namespace Avalonia.Input if (source is not null) { - var e = new PointerWheelEventArgs(source, _pointer, root, p, timestamp, props, inputModifiers, delta); + var e = new PointerWheelEventArgs(source, _pointer, root, p, timestamp, props, inputModifiers, delta, rawDelta); source?.RaiseEvent(e); return e.Handled; diff --git a/src/Avalonia.Base/Input/PointerWheelEventArgs.cs b/src/Avalonia.Base/Input/PointerWheelEventArgs.cs index e5701dcf23..57a7565884 100644 --- a/src/Avalonia.Base/Input/PointerWheelEventArgs.cs +++ b/src/Avalonia.Base/Input/PointerWheelEventArgs.cs @@ -6,14 +6,16 @@ namespace Avalonia.Input public class PointerWheelEventArgs : PointerEventArgs { public Vector Delta { get; set; } + public Vector RawDelta { get; set; } public PointerWheelEventArgs(IInteractive source, IPointer pointer, IVisual rootVisual, Point rootVisualPosition, ulong timestamp, - PointerPointProperties properties, KeyModifiers modifiers, Vector delta) + PointerPointProperties properties, KeyModifiers modifiers, Vector delta, Vector rawDelta) : base(InputElement.PointerWheelChangedEvent, source, pointer, rootVisual, rootVisualPosition, timestamp, properties, modifiers) { Delta = delta; + RawDelta = rawDelta; } } } From 76887ef16aa594fa4cea578cdd5655edd7711acb Mon Sep 17 00:00:00 2001 From: Max Katz Date: Tue, 15 Nov 2022 21:58:48 -0500 Subject: [PATCH 2/2] Move Shift scrolling to the ScrollPresenter layer --- src/Avalonia.Base/Input/MouseDevice.cs | 9 +-------- .../Input/PointerWheelEventArgs.cs | 4 +--- .../Presenters/ScrollContentPresenter.cs | 19 ++++++++++++++----- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Avalonia.Base/Input/MouseDevice.cs b/src/Avalonia.Base/Input/MouseDevice.cs index 0c31372cd3..8c10799911 100644 --- a/src/Avalonia.Base/Input/MouseDevice.cs +++ b/src/Avalonia.Base/Input/MouseDevice.cs @@ -202,16 +202,9 @@ namespace Avalonia.Input var source = _pointer.Captured ?? hitTest; - // KeyModifiers.Shift should scroll in horizontal direction. This does not work on every platform. - // If Shift-Key is pressed and X is close to 0 we swap the Vector. - if (inputModifiers == KeyModifiers.Shift && MathUtilities.IsZero(delta.X)) - { - delta = new Vector(delta.Y, delta.X); - } - if (source is not null) { - var e = new PointerWheelEventArgs(source, _pointer, root, p, timestamp, props, inputModifiers, delta, rawDelta); + var e = new PointerWheelEventArgs(source, _pointer, root, p, timestamp, props, inputModifiers, delta); source?.RaiseEvent(e); return e.Handled; diff --git a/src/Avalonia.Base/Input/PointerWheelEventArgs.cs b/src/Avalonia.Base/Input/PointerWheelEventArgs.cs index e0071641cd..8a0412659b 100644 --- a/src/Avalonia.Base/Input/PointerWheelEventArgs.cs +++ b/src/Avalonia.Base/Input/PointerWheelEventArgs.cs @@ -6,16 +6,14 @@ namespace Avalonia.Input public class PointerWheelEventArgs : PointerEventArgs { public Vector Delta { get; set; } - public Vector RawDelta { get; set; } internal PointerWheelEventArgs(IInteractive source, IPointer pointer, IVisual rootVisual, Point rootVisualPosition, ulong timestamp, - PointerPointProperties properties, KeyModifiers modifiers, Vector delta, Vector rawDelta) + PointerPointProperties properties, KeyModifiers modifiers, Vector delta) : base(InputElement.PointerWheelChangedEvent, source, pointer, rootVisual, rootVisualPosition, timestamp, properties, modifiers) { Delta = delta; - RawDelta = rawDelta; } } } diff --git a/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs b/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs index c526b7ac49..189197dd58 100644 --- a/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs +++ b/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs @@ -5,6 +5,7 @@ using System.Reactive.Disposables; using System.Reactive.Linq; using Avalonia.Controls.Primitives; using Avalonia.Input; +using Avalonia.Utilities; using Avalonia.VisualTree; namespace Avalonia.Controls.Presenters @@ -440,15 +441,23 @@ namespace Avalonia.Controls.Presenters if (Extent.Height > Viewport.Height || Extent.Width > Viewport.Width) { var scrollable = Child as ILogicalScrollable; - bool isLogical = scrollable?.IsLogicalScrollEnabled == true; + var isLogical = scrollable?.IsLogicalScrollEnabled == true; - double x = Offset.X; - double y = Offset.Y; + var x = Offset.X; + var y = Offset.Y; + var delta = e.Delta; + // KeyModifiers.Shift should scroll in horizontal direction. This does not work on every platform. + // If Shift-Key is pressed and X is close to 0 we swap the Vector. + if (e.KeyModifiers == KeyModifiers.Shift && MathUtilities.IsZero(delta.X)) + { + delta = new Vector(delta.Y, delta.X); + } + if (Extent.Height > Viewport.Height) { double height = isLogical ? scrollable!.ScrollSize.Height : 50; - y += -e.Delta.Y * height; + y += -delta.Y * height; y = Math.Max(y, 0); y = Math.Min(y, Extent.Height - Viewport.Height); } @@ -456,7 +465,7 @@ namespace Avalonia.Controls.Presenters if (Extent.Width > Viewport.Width) { double width = isLogical ? scrollable!.ScrollSize.Width : 50; - x += -e.Delta.X * width; + x += -delta.X * width; x = Math.Max(x, 0); x = Math.Min(x, Extent.Width - Viewport.Width); }