Browse Source

track currently active gesture in the pointer

pull/11518/head
Emmanuel Hansen 3 years ago
parent
commit
42fccd1af6
  1. 6
      src/Avalonia.Base/Input/GestureRecognizers/GestureRecognizerCollection.cs
  2. 1
      src/Avalonia.Base/Input/IPointer.cs
  3. 25
      src/Avalonia.Base/Input/Pointer.cs
  4. 3
      src/Avalonia.Controls/PullToRefresh/RefreshVisualizer.cs
  5. 1
      tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs

6
src/Avalonia.Base/Input/GestureRecognizers/GestureRecognizerCollection.cs

@ -114,7 +114,13 @@ namespace Avalonia.Input.GestureRecognizers
void IGestureRecognizerActionsDispatcher.Capture(IPointer pointer, IGestureRecognizer recognizer)
{
var p = pointer as Pointer;
if (p != null && p.CapturedGestureRecognizer != null && recognizer != p.CapturedGestureRecognizer)
return;
pointer.Capture(_inputElement);
p?.CaptureGestureRecognizer(recognizer);
_pointerGrabs![pointer] = recognizer;
foreach (var r in _recognizers!)
{

1
src/Avalonia.Base/Input/IPointer.cs

@ -1,3 +1,4 @@
using Avalonia.Input.GestureRecognizers;
using Avalonia.Metadata;
namespace Avalonia.Input

25
src/Avalonia.Base/Input/Pointer.cs

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Avalonia.Input.GestureRecognizers;
using Avalonia.VisualTree;
namespace Avalonia.Input
@ -52,6 +53,9 @@ namespace Avalonia.Input
if (Captured is Visual v3)
v3.DetachedFromVisualTree += OnCaptureDetached;
if (Captured == null)
CaptureGestureRecognizer(null);
}
static IInputElement? GetNextCapture(Visual parent)
@ -69,6 +73,25 @@ namespace Avalonia.Input
public PointerType Type { get; }
public bool IsPrimary { get; }
public void Dispose() => Capture(null);
/// <summary>
/// Gets the gesture recognizer that is currently capturing by the pointer, if any.
/// </summary>
internal IGestureRecognizer? CapturedGestureRecognizer { get; private set; }
public void Dispose()
{
Capture(null);
}
/// <summary>
/// Captures pointer input to the specified gesture recognizer.
/// </summary>
/// <param name="gestureRecognizer">The gesture recognizer.</param>
/// </remarks>
internal void CaptureGestureRecognizer(IGestureRecognizer? gestureRecognizer)
{
CapturedGestureRecognizer = gestureRecognizer;
}
}
}

3
src/Avalonia.Controls/PullToRefresh/RefreshVisualizer.cs

@ -238,7 +238,6 @@ namespace Avalonia.Controls
visualizerVisual.Offset = IsPullDirectionVertical ?
new Vector3(visualizerVisual.Offset.X, 0, 0) :
new Vector3(0, visualizerVisual.Offset.Y, 0);
visual.Offset = default;
_content.InvalidateMeasure();
break;
case RefreshVisualizerState.Interacting:
@ -452,8 +451,6 @@ namespace Avalonia.Controls
_interactionRatioSubscription = RefreshInfoProvider.GetObservable(RefreshInfoProvider.InteractionRatioProperty)
.Subscribe(InteractionRatioObserver);
var visual = RefreshInfoProvider.Visual;
_executingRatio = RefreshInfoProvider.ExecutionRatio;
}
else

1
tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs

@ -2,6 +2,7 @@
using Avalonia.Controls.Platform;
using Avalonia.Controls.Primitives;
using Avalonia.Input;
using Avalonia.Input.GestureRecognizers;
using Avalonia.Interactivity;
using Avalonia.VisualTree;
using Moq;

Loading…
Cancel
Save