From b896d91fb8cb142b4fde03750260c4ed42deb876 Mon Sep 17 00:00:00 2001 From: Callum Moffat Date: Sat, 14 May 2022 01:03:41 -0400 Subject: [PATCH] Pointer bidding --- lib/widgets/weak_gesture_recognizer.dart | 51 ++++++++++++++---------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/lib/widgets/weak_gesture_recognizer.dart b/lib/widgets/weak_gesture_recognizer.dart index 1d6732b6f..356332acb 100644 --- a/lib/widgets/weak_gesture_recognizer.dart +++ b/lib/widgets/weak_gesture_recognizer.dart @@ -69,7 +69,7 @@ abstract class WeakDragGestureRecognizer extends OneSequenceGestureRecognizer { Offset _getDeltaForDetails(Offset delta); double? _getPrimaryValueFromOffset(Offset value); - bool _hasSufficientGlobalDistanceToAccept(PointerEvent event, double? deviceTouchSlop); + double _calculateAcceptFactor(PointerEvent event, double? deviceTouchSlop); final Map _velocityTrackers = {}; final Map _pointerDownTimes = {}; @@ -184,9 +184,7 @@ abstract class WeakDragGestureRecognizer extends OneSequenceGestureRecognizer { untransformedDelta: movedLocally, untransformedEndPosition: event.localPosition, ).distance * (_getPrimaryValueFromOffset(movedLocally) ?? 1).sign; - if (_hasSufficientGlobalDistanceToAccept(event, gestureSettings?.touchSlop)) { - resolve(GestureDisposition.accepted); - } + resolve(GestureDisposition.accepted, bid: _calculateAcceptFactor(event, gestureSettings?.touchSlop)); } } if (event is PointerPanZoomUpdateEvent) { @@ -210,9 +208,7 @@ abstract class WeakDragGestureRecognizer extends OneSequenceGestureRecognizer { untransformedDelta: movedLocally, untransformedEndPosition: event.localPosition + event.pan ).distance * (_getPrimaryValueFromOffset(movedLocally) ?? 1).sign; - if (_hasSufficientGlobalDistanceToAccept(event, gestureSettings?.touchSlop)) { - resolve(GestureDisposition.accepted); - } + resolve(GestureDisposition.accepted, bid: _calculateAcceptFactor(event, gestureSettings?.touchSlop)); } } if (event is PointerUpEvent || event is PointerCancelEvent || event is PointerPanZoomEndEvent) { @@ -224,6 +220,7 @@ abstract class WeakDragGestureRecognizer extends OneSequenceGestureRecognizer { @override void acceptGesture(int pointer) { + super.acceptGesture(pointer); assert(!_acceptedActivePointers.contains(pointer)); _acceptedActivePointers.add(pointer); if (_state != _DragState.accepted) { @@ -268,6 +265,7 @@ abstract class WeakDragGestureRecognizer extends OneSequenceGestureRecognizer { @override void rejectGesture(int pointer) { + super.rejectGesture(pointer); _giveUpPointer(pointer); } @@ -420,11 +418,14 @@ class WeakVerticalDragGestureRecognizer extends WeakDragGestureRecognizer { } @override - bool _hasSufficientGlobalDistanceToAccept(PointerEvent event, double? deviceTouchSlop) { - return (sign != null && _globalDistanceMoved.sign == sign!.sign) && _globalDistanceMoved.abs() > (weakness * computeHitSlop(event.kind, gestureSettings)) || ( - (_globalDistanceMoved.abs() > computeHitSlop(event.kind, gestureSettings)) && - _hasSufficientDurationToAccept(event) - ); + double _calculateAcceptFactor(PointerEvent event, double? deviceTouchSlop) { + if (_globalDistanceMoved.sign != sign?.sign) { + return 0; + } + if (_hasSufficientDurationToAccept(event)) { + return _globalDistanceMoved.abs() / computeHitSlop(event.kind, gestureSettings); + } + return _globalDistanceMoved.abs() / (weakness * computeHitSlop(event.kind, gestureSettings)); } @override @@ -456,11 +457,14 @@ class WeakHorizontalDragGestureRecognizer extends WeakDragGestureRecognizer { } @override - bool _hasSufficientGlobalDistanceToAccept(PointerEvent event, double? deviceTouchSlop) { - return (sign != null && _globalDistanceMoved.sign == sign!.sign) && _globalDistanceMoved.abs() > (weakness * computeHitSlop(event.kind, gestureSettings)) || ( - (_globalDistanceMoved.abs() > computeHitSlop(event.kind, gestureSettings)) && - _hasSufficientDurationToAccept(event) - ); + double _calculateAcceptFactor(PointerEvent event, double? deviceTouchSlop) { + if (_globalDistanceMoved.sign != sign?.sign) { + return 0; + } + if (_hasSufficientDurationToAccept(event)) { + return _globalDistanceMoved.abs() / computeHitSlop(event.kind, gestureSettings); + } + return _globalDistanceMoved.abs() / (weakness * computeHitSlop(event.kind, gestureSettings)); } @override @@ -495,11 +499,14 @@ class WeakPanGestureRecognizer extends WeakDragGestureRecognizer { } @override - bool _hasSufficientGlobalDistanceToAccept(PointerEvent event, double? deviceTouchSlop) { - return allowedToAccept && (sign != null && _globalDistanceMoved.sign == sign!.sign) && _globalDistanceMoved.abs() > (weakness * computePanSlop(event.kind, gestureSettings)) || ( - (_globalDistanceMoved.abs() > computePanSlop(event.kind, gestureSettings)) && - _hasSufficientDurationToAccept(event) - ); + double _calculateAcceptFactor(PointerEvent event, double? deviceTouchSlop) { + if (!allowedToAccept || _globalDistanceMoved.sign != sign?.sign) { + return 0; + } + if (_hasSufficientDurationToAccept(event)) { + return _globalDistanceMoved.abs() / computeHitSlop(event.kind, gestureSettings); + } + return _globalDistanceMoved.abs() / (weakness * computeHitSlop(event.kind, gestureSettings)); } @override