diff --git a/lib/common/widgets/gesture/player_gesture_recognizer.dart b/lib/common/widgets/gesture/player_gesture_recognizer.dart index 8db3627db..e539a1ea7 100644 --- a/lib/common/widgets/gesture/player_gesture_recognizer.dart +++ b/lib/common/widgets/gesture/player_gesture_recognizer.dart @@ -1,12 +1,15 @@ import 'package:flutter/gestures.dart' show + PointerDownEvent, GestureRecognizer, RecognizerCallback, ScaleGestureRecognizer, + PointerPanZoomStartEvent, LongPressGestureRecognizer; mixin PlayerGestureMixin on GestureRecognizer { bool isPosAllowed = true; + bool _isPosAllowed = true; @override T? invokeCallback( @@ -14,7 +17,7 @@ mixin PlayerGestureMixin on GestureRecognizer { RecognizerCallback callback, { String Function()? debugReport, }) { - if (!isPosAllowed) return null; + if (!_isPosAllowed) return null; return super.invokeCallback(name, callback, debugReport: debugReport); } } @@ -29,6 +32,24 @@ class PlayerScaleGestureRecognizer extends ScaleGestureRecognizer super.trackpadScrollCausesScale, super.trackpadScrollToScaleFactor, }); + + void _handleAllowedPointer() { + if (isReadyState) { + _isPosAllowed = isPosAllowed; + } + } + + @override + void addAllowedPointer(PointerDownEvent event) { + _handleAllowedPointer(); + super.addAllowedPointer(event); + } + + @override + void addAllowedPointerPanZoom(PointerPanZoomStartEvent event) { + _handleAllowedPointer(); + super.addAllowedPointerPanZoom(event); + } } class PlayerLongPressGestureRecognizer extends LongPressGestureRecognizer @@ -40,4 +61,12 @@ class PlayerLongPressGestureRecognizer extends LongPressGestureRecognizer super.debugOwner, super.allowedButtonsFilter, }); + + @override + void addAllowedPointer(PointerDownEvent event) { + if (state == .ready) { + _isPosAllowed = isPosAllowed; + } + super.addAllowedPointer(event); + } } diff --git a/lib/scripts/patch.ps1 b/lib/scripts/patch.ps1 index 659ec06b7..5bf8e0bcc 100644 --- a/lib/scripts/patch.ps1 +++ b/lib/scripts/patch.ps1 @@ -24,6 +24,8 @@ $ImageCachePatch = "lib/scripts/image_cache.patch" $ImageAnimPatch = "lib/scripts/image_anim.patch" +$ScaleGesturePatch = "lib/scripts/scale_gesture.patch" + # TODO: remove # https://github.com/flutter/flutter/issues/90223 $ModalBarrierPatch = "lib/scripts/modal_barrier.patch" @@ -38,7 +40,7 @@ $picks = @() $reverts = @() $patches = @($ModalBarrierPatch, $TextSelectionPatch, $MouseCursorPatch, $NavigationBarPatch, $PaddingPatch, $ImageCachePatch, $ImageAnimPatch, - $LayoutBuilderPatch) + $LayoutBuilderPatch, $ScaleGesturePatch) switch ($platform.ToLower()) { "android" { diff --git a/lib/scripts/scale_gesture.patch b/lib/scripts/scale_gesture.patch new file mode 100644 index 000000000..f41d85973 --- /dev/null +++ b/lib/scripts/scale_gesture.patch @@ -0,0 +1,13 @@ +diff --git a/packages/flutter/lib/src/gestures/scale.dart b/packages/flutter/lib/src/gestures/scale.dart +index fe3cdf27a41..7fe56080bc1 100644 +--- a/packages/flutter/lib/src/gestures/scale.dart ++++ b/packages/flutter/lib/src/gestures/scale.dart +@@ -398,6 +398,8 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer { + + _ScaleState _state = _ScaleState.ready; + ++ bool get isReadyState => _state == _ScaleState.ready; ++ + Matrix4? _lastTransform; + + /// {@template flutter.gestures.scale.trackpadScrollCausesScale}