diff --git a/src/Avalonia.Base/Input/GestureRecognizers/GestureRecognizer.cs b/src/Avalonia.Base/Input/GestureRecognizers/GestureRecognizer.cs index e96c397d11..2cb97b4707 100644 --- a/src/Avalonia.Base/Input/GestureRecognizers/GestureRecognizer.cs +++ b/src/Avalonia.Base/Input/GestureRecognizers/GestureRecognizer.cs @@ -4,10 +4,30 @@ { protected internal IInputElement? Target { get; internal set; } - protected internal abstract void PointerPressed(PointerPressedEventArgs e); - protected internal abstract void PointerReleased(PointerReleasedEventArgs e); - protected internal abstract void PointerMoved(PointerEventArgs e); - protected internal abstract void PointerCaptureLost(IPointer pointer); + protected abstract void PointerPressed(PointerPressedEventArgs e); + protected abstract void PointerReleased(PointerReleasedEventArgs e); + protected abstract void PointerMoved(PointerEventArgs e); + protected abstract void PointerCaptureLost(IPointer pointer); + + internal void PointerPressedInternal(PointerPressedEventArgs e) + { + PointerPressed(e); + } + + internal void PointerReleasedInternal(PointerReleasedEventArgs e) + { + PointerReleased(e); + } + + internal void PointerMovedInternal(PointerEventArgs e) + { + PointerMoved(e); + } + + internal void PointerCaptureLostInternal(IPointer pointer) + { + PointerCaptureLost(pointer); + } protected void Capture(IPointer pointer) { diff --git a/src/Avalonia.Base/Input/GestureRecognizers/GestureRecognizerCollection.cs b/src/Avalonia.Base/Input/GestureRecognizers/GestureRecognizerCollection.cs index d8c2d5a21b..05dce8214b 100644 --- a/src/Avalonia.Base/Input/GestureRecognizers/GestureRecognizerCollection.cs +++ b/src/Avalonia.Base/Input/GestureRecognizers/GestureRecognizerCollection.cs @@ -53,7 +53,7 @@ namespace Avalonia.Input.GestureRecognizers return false; foreach (var r in _recognizers) { - r.PointerPressed(e); + r.PointerPressedInternal(e); } return e.Handled; @@ -70,7 +70,7 @@ namespace Avalonia.Input.GestureRecognizers if (pointer?.CapturedGestureRecognizer != null) break; - r.PointerReleased(e); + r.PointerReleasedInternal(e); } return e.Handled; } @@ -86,7 +86,7 @@ namespace Avalonia.Input.GestureRecognizers if (pointer?.CapturedGestureRecognizer != null) break; - r.PointerMoved(e); + r.PointerMovedInternal(e); } return e.Handled; } diff --git a/src/Avalonia.Base/Input/GestureRecognizers/PinchGestureRecognizer.cs b/src/Avalonia.Base/Input/GestureRecognizers/PinchGestureRecognizer.cs index b12c2cc701..b02c82a066 100644 --- a/src/Avalonia.Base/Input/GestureRecognizers/PinchGestureRecognizer.cs +++ b/src/Avalonia.Base/Input/GestureRecognizers/PinchGestureRecognizer.cs @@ -21,12 +21,12 @@ namespace Avalonia.Input PointerReleased(e); } - protected internal override void PointerCaptureLost(IPointer pointer) + protected override void PointerCaptureLost(IPointer pointer) { RemoveContact(pointer); } - protected internal override void PointerMoved(PointerEventArgs e) + protected override void PointerMoved(PointerEventArgs e) { if (Target != null && Target is Visual visual) { @@ -57,7 +57,7 @@ namespace Avalonia.Input } } - protected internal override void PointerPressed(PointerPressedEventArgs e) + protected override void PointerPressed(PointerPressedEventArgs e) { if (Target != null && Target is Visual visual && (e.Pointer.Type == PointerType.Touch || e.Pointer.Type == PointerType.Pen)) { @@ -90,7 +90,7 @@ namespace Avalonia.Input } } - protected internal override void PointerReleased(PointerReleasedEventArgs e) + protected override void PointerReleased(PointerReleasedEventArgs e) { RemoveContact(e.Pointer); } diff --git a/src/Avalonia.Base/Input/GestureRecognizers/PullGestureRecognizer.cs b/src/Avalonia.Base/Input/GestureRecognizers/PullGestureRecognizer.cs index 5358eb4cda..57faf5bfd8 100644 --- a/src/Avalonia.Base/Input/GestureRecognizers/PullGestureRecognizer.cs +++ b/src/Avalonia.Base/Input/GestureRecognizers/PullGestureRecognizer.cs @@ -30,7 +30,7 @@ namespace Avalonia.Input public PullGestureRecognizer() { } - protected internal override void PointerCaptureLost(IPointer pointer) + protected override void PointerCaptureLost(IPointer pointer) { if (_tracking == pointer) { @@ -38,7 +38,7 @@ namespace Avalonia.Input } } - protected internal override void PointerMoved(PointerEventArgs e) + protected override void PointerMoved(PointerEventArgs e) { if (_tracking == e.Pointer && Target is Visual visual) { @@ -83,7 +83,7 @@ namespace Avalonia.Input } } - protected internal override void PointerPressed(PointerPressedEventArgs e) + protected override void PointerPressed(PointerPressedEventArgs e) { if (Target != null && Target is Visual visual && (e.Pointer.Type == PointerType.Touch || e.Pointer.Type == PointerType.Pen)) { @@ -118,7 +118,7 @@ namespace Avalonia.Input } } - protected internal override void PointerReleased(PointerReleasedEventArgs e) + protected override void PointerReleased(PointerReleasedEventArgs e) { if (_tracking == e.Pointer && _pullInProgress) { diff --git a/src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs b/src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs index 80c0583d90..beecfcc3ce 100644 --- a/src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs +++ b/src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs @@ -91,7 +91,7 @@ namespace Avalonia.Input.GestureRecognizers set => SetAndRaise(ScrollStartDistanceProperty, ref _scrollStartDistance, value); } - protected internal override void PointerPressed(PointerPressedEventArgs e) + protected override void PointerPressed(PointerPressedEventArgs e) { if (e.Pointer.IsPrimary && (e.Pointer.Type == PointerType.Touch || e.Pointer.Type == PointerType.Pen)) @@ -103,7 +103,7 @@ namespace Avalonia.Input.GestureRecognizers } } - protected internal override void PointerMoved(PointerEventArgs e) + protected override void PointerMoved(PointerEventArgs e) { if (e.Pointer == _tracking) { @@ -143,7 +143,7 @@ namespace Avalonia.Input.GestureRecognizers } } - protected internal override void PointerCaptureLost(IPointer pointer) + protected override void PointerCaptureLost(IPointer pointer) { if (pointer == _tracking) EndGesture(); } @@ -163,7 +163,7 @@ namespace Avalonia.Input.GestureRecognizers } - protected internal override void PointerReleased(PointerReleasedEventArgs e) + protected override void PointerReleased(PointerReleasedEventArgs e) { if (e.Pointer == _tracking && _scrolling) { diff --git a/src/Avalonia.Base/Input/MouseDevice.cs b/src/Avalonia.Base/Input/MouseDevice.cs index 4da8062897..db333dbd8b 100644 --- a/src/Avalonia.Base/Input/MouseDevice.cs +++ b/src/Avalonia.Base/Input/MouseDevice.cs @@ -163,26 +163,17 @@ namespace Avalonia.Input device = device ?? throw new ArgumentNullException(nameof(device)); root = root ?? throw new ArgumentNullException(nameof(root)); - if (_pointer.CapturedGestureRecognizer is GestureRecognizer gestureRecognizer) - { - if(gestureRecognizer.Target != null) - { - var e = new PointerEventArgs(InputElement.PointerMovedEvent, gestureRecognizer.Target, _pointer, (Visual)root, - p, timestamp, properties, inputModifiers, intermediatePoints); - gestureRecognizer.PointerMoved(e); - - return e.Handled; - } - } - - var source = _pointer.Captured ?? hitTest; + var source = _pointer.CapturedGestureRecognizer?.Target ?? _pointer.Captured ?? hitTest; if (source is object) { var e = new PointerEventArgs(InputElement.PointerMovedEvent, source, _pointer, (Visual)root, p, timestamp, properties, inputModifiers, intermediatePoints); - source.RaiseEvent(e); + if (_pointer.CapturedGestureRecognizer is GestureRecognizer gestureRecognizer) + gestureRecognizer.PointerMovedInternal(e); + else + source.RaiseEvent(e); return e.Handled; } @@ -195,27 +186,18 @@ namespace Avalonia.Input { device = device ?? throw new ArgumentNullException(nameof(device)); root = root ?? throw new ArgumentNullException(nameof(root)); - - if (_pointer.CapturedGestureRecognizer is GestureRecognizer gestureRecognizer) - { - if (gestureRecognizer.Target != null) - { - var e = new PointerReleasedEventArgs(gestureRecognizer.Target, _pointer, (Visual)root, p, timestamp, props, inputModifiers, - _lastMouseDownButton); - gestureRecognizer.PointerReleased(e); - - return e.Handled; - } - } - var source = _pointer.Captured ?? hitTest; + var source = _pointer.CapturedGestureRecognizer?.Target ?? _pointer.Captured ?? hitTest; if (source is not null) { var e = new PointerReleasedEventArgs(source, _pointer, (Visual)root, p, timestamp, props, inputModifiers, _lastMouseDownButton); - source?.RaiseEvent(e); + if (_pointer.CapturedGestureRecognizer is GestureRecognizer gestureRecognizer) + gestureRecognizer.PointerReleasedInternal(e); + else + source?.RaiseEvent(e); _pointer.Capture(null); _pointer.CaptureGestureRecognizer(null); _lastMouseDownButton = default; diff --git a/src/Avalonia.Base/Input/PenDevice.cs b/src/Avalonia.Base/Input/PenDevice.cs index fab0f1320c..09bf18d3fd 100644 --- a/src/Avalonia.Base/Input/PenDevice.cs +++ b/src/Avalonia.Base/Input/PenDevice.cs @@ -115,26 +115,17 @@ namespace Avalonia.Input KeyModifiers inputModifiers, IInputElement? hitTest, Lazy?>? intermediatePoints) { - if (pointer.CapturedGestureRecognizer is GestureRecognizer gestureRecognizer) - { - if (gestureRecognizer.Target != null) - { - var e = new PointerEventArgs(InputElement.PointerMovedEvent, gestureRecognizer.Target, pointer, (Visual)root, - p, timestamp, properties, inputModifiers, intermediatePoints); - gestureRecognizer.PointerMoved(e); - - return e.Handled; - } - } - - var source = pointer.Captured ?? hitTest; + var source = pointer.CapturedGestureRecognizer?.Target ?? pointer.Captured ?? hitTest; if (source is not null) { var e = new PointerEventArgs(InputElement.PointerMovedEvent, source, pointer, (Visual)root, p, timestamp, properties, inputModifiers, intermediatePoints); - source.RaiseEvent(e); + if (pointer.CapturedGestureRecognizer is GestureRecognizer gestureRecognizer) + gestureRecognizer.PointerMovedInternal(e); + else + source.RaiseEvent(e); return e.Handled; } @@ -145,26 +136,17 @@ namespace Avalonia.Input IInputElement root, Point p, PointerPointProperties properties, KeyModifiers inputModifiers, IInputElement? hitTest) { - if (pointer.CapturedGestureRecognizer is GestureRecognizer gestureRecognizer) - { - if (gestureRecognizer.Target != null) - { - var e = new PointerReleasedEventArgs(gestureRecognizer.Target, pointer, (Visual)root, p, timestamp, properties, inputModifiers, - _lastMouseDownButton); - gestureRecognizer.PointerReleased(e); - - return e.Handled; - } - } - - var source = pointer.Captured ?? hitTest; + var source = pointer.CapturedGestureRecognizer?.Target ?? pointer.Captured ?? hitTest; if (source is not null) { var e = new PointerReleasedEventArgs(source, pointer, (Visual)root, p, timestamp, properties, inputModifiers, _lastMouseDownButton); - source.RaiseEvent(e); + if (pointer.CapturedGestureRecognizer is GestureRecognizer gestureRecognizer) + gestureRecognizer.PointerReleasedInternal(e); + else + source.RaiseEvent(e); pointer.Capture(null); pointer.CaptureGestureRecognizer(null); _lastMouseDownButton = default; diff --git a/src/Avalonia.Base/Input/Pointer.cs b/src/Avalonia.Base/Input/Pointer.cs index 65c0d7f538..91358712a0 100644 --- a/src/Avalonia.Base/Input/Pointer.cs +++ b/src/Avalonia.Base/Input/Pointer.cs @@ -92,7 +92,7 @@ namespace Avalonia.Input internal void CaptureGestureRecognizer(GestureRecognizer? gestureRecognizer) { if (CapturedGestureRecognizer != gestureRecognizer) - CapturedGestureRecognizer?.PointerCaptureLost(this); + CapturedGestureRecognizer?.PointerCaptureLostInternal(this); if (gestureRecognizer != null) Capture(null); diff --git a/src/Avalonia.Base/Input/TouchDevice.cs b/src/Avalonia.Base/Input/TouchDevice.cs index 02f3479e95..8868e966f0 100644 --- a/src/Avalonia.Base/Input/TouchDevice.cs +++ b/src/Avalonia.Base/Input/TouchDevice.cs @@ -103,7 +103,7 @@ namespace Avalonia.Input keyModifier, MouseButton.Left); if (gestureTarget != null) { - pointer?.CapturedGestureRecognizer?.PointerReleased(e); + pointer?.CapturedGestureRecognizer?.PointerReleasedInternal(e); } else { @@ -132,7 +132,7 @@ namespace Avalonia.Input if (gestureTarget != null) { - pointer?.CapturedGestureRecognizer?.PointerMoved(e); + pointer?.CapturedGestureRecognizer?.PointerMovedInternal(e); } else { diff --git a/tests/Avalonia.UnitTests/TouchTestHelper.cs b/tests/Avalonia.UnitTests/TouchTestHelper.cs index 703cb45b96..574599d1ad 100644 --- a/tests/Avalonia.UnitTests/TouchTestHelper.cs +++ b/tests/Avalonia.UnitTests/TouchTestHelper.cs @@ -30,7 +30,7 @@ namespace Avalonia.UnitTests var e = new PointerEventArgs(InputElement.PointerMovedEvent, source, _pointer, (Visual)target, position, Timestamp(), PointerPointProperties.None, modifiers); if (_pointer.CapturedGestureRecognizer != null) - _pointer.CapturedGestureRecognizer.PointerMoved(e); + _pointer.CapturedGestureRecognizer.PointerMovedInternal(e); else target.RaiseEvent(e); @@ -45,7 +45,7 @@ namespace Avalonia.UnitTests modifiers, MouseButton.None); if (_pointer.CapturedGestureRecognizer != null) - _pointer.CapturedGestureRecognizer.PointerReleased(e); + _pointer.CapturedGestureRecognizer.PointerReleasedInternal(e); else source.RaiseEvent(e);