Przeglądaj źródła

track currently active gesture in the pointer

Emmanuel Hansen 2 lat temu
rodzic
commit
42fccd1af6

+ 6 - 0
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 - 0
src/Avalonia.Base/Input/IPointer.cs

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

+ 24 - 1
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;
+        }
     }
 }

+ 0 - 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 - 0
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;