diff --git a/lib/ui/common/controls/eight_way_swipe_detector.dart b/lib/ui/common/controls/eight_way_swipe_detector.dart index 06efebff..2017c4ab 100644 --- a/lib/ui/common/controls/eight_way_swipe_detector.dart +++ b/lib/ui/common/controls/eight_way_swipe_detector.dart @@ -64,21 +64,23 @@ class _EightWaySwipeDetectorState extends State { @override Widget build(BuildContext context) { return TrackpadListener( + scrollSensitivity: 70, onScroll: _trackpadSwipe, child: GestureDetector( - behavior: HitTestBehavior.translucent, - onPanStart: _handleSwipeStart, - onPanUpdate: _handleSwipeUpdate, - onPanCancel: _resetSwipe, - onPanEnd: _handleSwipeEnd, - supportedDevices: const { - // Purposely omitting PointerDeviceKind.trackpad. - PointerDeviceKind.mouse, - PointerDeviceKind.stylus, - PointerDeviceKind.touch, - PointerDeviceKind.unknown, - }, - child: widget.child), + behavior: HitTestBehavior.translucent, + onPanStart: _handleSwipeStart, + onPanUpdate: _handleSwipeUpdate, + onPanCancel: _resetSwipe, + onPanEnd: _handleSwipeEnd, + supportedDevices: const { + // Purposely omitting PointerDeviceKind.trackpad. + PointerDeviceKind.mouse, + PointerDeviceKind.stylus, + PointerDeviceKind.touch, + PointerDeviceKind.unknown, + }, + child: widget.child, + ), ); } } diff --git a/lib/ui/common/controls/trackpad_listener.dart b/lib/ui/common/controls/trackpad_listener.dart index c26d9e89..93e1667c 100644 --- a/lib/ui/common/controls/trackpad_listener.dart +++ b/lib/ui/common/controls/trackpad_listener.dart @@ -6,20 +6,12 @@ import 'package:wonders/common_libs.dart'; class TrackpadListener extends StatefulWidget { final Widget child; final double scrollSensitivity; - final void Function()? onScrollUp; - final void Function()? onScrollDown; - final void Function()? onScrollLeft; - final void Function()? onScrollRight; final void Function(Offset delta)? onScroll; const TrackpadListener({ super.key, required this.child, this.scrollSensitivity = 100, - this.onScrollUp, - this.onScrollDown, - this.onScrollLeft, - this.onScrollRight, this.onScroll, }); @@ -29,48 +21,46 @@ class TrackpadListener extends StatefulWidget { class _TrackpadListenerState extends State { Offset _scrollOffset = Offset.zero; + void _handleTrackpadEvent(PointerSignalEvent event) { GestureBinding.instance.pointerSignalResolver.register(event, (PointerSignalEvent event) { + // Only handle trackpad events here. if (event is PointerScrollEvent && event.kind == PointerDeviceKind.trackpad) { Offset newScroll = _scrollOffset + event.scrollDelta; newScroll = Offset( newScroll.dx.clamp(-widget.scrollSensitivity, widget.scrollSensitivity), newScroll.dy.clamp(-widget.scrollSensitivity, widget.scrollSensitivity), ); - _update(newScroll); + _scrollOffset = newScroll; + _update(); } }); } - void _update(Offset newOffset) { + void _update() { Offset directionScroll = Offset.zero; double sensitivity = widget.scrollSensitivity; - while (newOffset.dy >= sensitivity) { - widget.onScrollDown?.call(); - newOffset -= Offset(0.0, sensitivity); - directionScroll -= Offset(0.0, 1.0); - } - while (newOffset.dy <= -sensitivity) { - widget.onScrollUp?.call(); - newOffset += Offset(0.0, sensitivity); + if (_scrollOffset.dy >= sensitivity) { + // Scroll down + _scrollOffset += Offset(0.0, -sensitivity); + directionScroll += Offset(0.0, -1.0); + } else if (_scrollOffset.dy <= -sensitivity) { + // Scroll up + _scrollOffset += Offset(0.0, sensitivity); directionScroll += Offset(0.0, 1.0); } - while (newOffset.dx >= sensitivity) { - widget.onScrollLeft?.call(); - newOffset -= Offset(sensitivity, 0.0); - directionScroll -= Offset(1.0, 0.0); - } - while (newOffset.dx <= -sensitivity) { - widget.onScrollRight?.call(); - newOffset += Offset(sensitivity, 0.0); + if (_scrollOffset.dx >= sensitivity) { + // Scroll left + _scrollOffset += Offset(-sensitivity, 0.0); + directionScroll += Offset(-1.0, 0.0); + } else if (_scrollOffset.dx <= -sensitivity) { + // Scroll right + _scrollOffset += Offset(sensitivity, 0.0); directionScroll += Offset(1.0, 0.0); } if (directionScroll != Offset.zero) { widget.onScroll?.call(directionScroll); } - // Tone it down over time. - newOffset *= 0.9; - setState(() => _scrollOffset = newOffset); } @override diff --git a/lib/ui/screens/editorial/editorial_screen.dart b/lib/ui/screens/editorial/editorial_screen.dart index 94276a5c..9aa4c5e4 100644 --- a/lib/ui/screens/editorial/editorial_screen.dart +++ b/lib/ui/screens/editorial/editorial_screen.dart @@ -65,9 +65,9 @@ class _WonderEditorialScreenState extends State { _scrollPos.value = _scroller.position.pixels; } - void _handleSwipeUp() { + void _handleTrackpadScroll(Offset direction) { // Trackpad swipe up. Return to home if at the top. - if (_scroller.position.pixels == 0) { + if (_scroller.position.pixels == 0 && direction.dy > 0) { _handleBackPressed(); } } @@ -89,7 +89,7 @@ class _WonderEditorialScreenState extends State { child: ColoredBox( color: $styles.colors.offWhite, child: TrackpadListener( - onScrollUp: _handleSwipeUp, + onScroll: _handleTrackpadScroll, scrollSensitivity: 120, child: Stack( children: [ diff --git a/lib/ui/screens/home/wonders_home_screen.dart b/lib/ui/screens/home/wonders_home_screen.dart index a9abb481..84a7c7de 100644 --- a/lib/ui/screens/home/wonders_home_screen.dart +++ b/lib/ui/screens/home/wonders_home_screen.dart @@ -132,6 +132,12 @@ class _HomeScreenState extends State with SingleTickerProviderStateM } } + void _handleTrackpadScroll(Offset direction) { + if (direction.dy < 0) { + _showDetailsPage(); + } + } + @override Widget build(BuildContext context) { if (_fadeInOnNextBuild == true) { @@ -143,7 +149,7 @@ class _HomeScreenState extends State with SingleTickerProviderStateM color: $styles.colors.black, child: TrackpadListener( scrollSensitivity: 60, - onScrollDown: () => _showDetailsPage(), + onScroll: _handleTrackpadScroll, child: PreviousNextNavigation( listenToMouseWheel: false, onPreviousPressed: () => _handlePrevNext(-1),