Fair bit of code cleanup.

This commit is contained in:
Alex Garneau
2025-03-20 14:40:19 -06:00
parent 4f4b81e45f
commit a73b5fb62a
4 changed files with 44 additions and 46 deletions

View File

@ -64,6 +64,7 @@ class _EightWaySwipeDetectorState extends State<EightWaySwipeDetector> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return TrackpadListener( return TrackpadListener(
scrollSensitivity: 70,
onScroll: _trackpadSwipe, onScroll: _trackpadSwipe,
child: GestureDetector( child: GestureDetector(
behavior: HitTestBehavior.translucent, behavior: HitTestBehavior.translucent,
@ -78,7 +79,8 @@ class _EightWaySwipeDetectorState extends State<EightWaySwipeDetector> {
PointerDeviceKind.touch, PointerDeviceKind.touch,
PointerDeviceKind.unknown, PointerDeviceKind.unknown,
}, },
child: widget.child), child: widget.child,
),
); );
} }
} }

View File

@ -6,20 +6,12 @@ import 'package:wonders/common_libs.dart';
class TrackpadListener extends StatefulWidget { class TrackpadListener extends StatefulWidget {
final Widget child; final Widget child;
final double scrollSensitivity; 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; final void Function(Offset delta)? onScroll;
const TrackpadListener({ const TrackpadListener({
super.key, super.key,
required this.child, required this.child,
this.scrollSensitivity = 100, this.scrollSensitivity = 100,
this.onScrollUp,
this.onScrollDown,
this.onScrollLeft,
this.onScrollRight,
this.onScroll, this.onScroll,
}); });
@ -29,48 +21,46 @@ class TrackpadListener extends StatefulWidget {
class _TrackpadListenerState extends State<TrackpadListener> { class _TrackpadListenerState extends State<TrackpadListener> {
Offset _scrollOffset = Offset.zero; Offset _scrollOffset = Offset.zero;
void _handleTrackpadEvent(PointerSignalEvent event) { void _handleTrackpadEvent(PointerSignalEvent event) {
GestureBinding.instance.pointerSignalResolver.register(event, (PointerSignalEvent event) { GestureBinding.instance.pointerSignalResolver.register(event, (PointerSignalEvent event) {
// Only handle trackpad events here.
if (event is PointerScrollEvent && event.kind == PointerDeviceKind.trackpad) { if (event is PointerScrollEvent && event.kind == PointerDeviceKind.trackpad) {
Offset newScroll = _scrollOffset + event.scrollDelta; Offset newScroll = _scrollOffset + event.scrollDelta;
newScroll = Offset( newScroll = Offset(
newScroll.dx.clamp(-widget.scrollSensitivity, widget.scrollSensitivity), newScroll.dx.clamp(-widget.scrollSensitivity, widget.scrollSensitivity),
newScroll.dy.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; Offset directionScroll = Offset.zero;
double sensitivity = widget.scrollSensitivity; double sensitivity = widget.scrollSensitivity;
while (newOffset.dy >= sensitivity) { if (_scrollOffset.dy >= sensitivity) {
widget.onScrollDown?.call(); // Scroll down
newOffset -= Offset(0.0, sensitivity); _scrollOffset += Offset(0.0, -sensitivity);
directionScroll -= Offset(0.0, 1.0); directionScroll += Offset(0.0, -1.0);
} } else if (_scrollOffset.dy <= -sensitivity) {
while (newOffset.dy <= -sensitivity) { // Scroll up
widget.onScrollUp?.call(); _scrollOffset += Offset(0.0, sensitivity);
newOffset += Offset(0.0, sensitivity);
directionScroll += Offset(0.0, 1.0); directionScroll += Offset(0.0, 1.0);
} }
while (newOffset.dx >= sensitivity) { if (_scrollOffset.dx >= sensitivity) {
widget.onScrollLeft?.call(); // Scroll left
newOffset -= Offset(sensitivity, 0.0); _scrollOffset += Offset(-sensitivity, 0.0);
directionScroll -= Offset(1.0, 0.0); directionScroll += Offset(-1.0, 0.0);
} } else if (_scrollOffset.dx <= -sensitivity) {
while (newOffset.dx <= -sensitivity) { // Scroll right
widget.onScrollRight?.call(); _scrollOffset += Offset(sensitivity, 0.0);
newOffset += Offset(sensitivity, 0.0);
directionScroll += Offset(1.0, 0.0); directionScroll += Offset(1.0, 0.0);
} }
if (directionScroll != Offset.zero) { if (directionScroll != Offset.zero) {
widget.onScroll?.call(directionScroll); widget.onScroll?.call(directionScroll);
} }
// Tone it down over time.
newOffset *= 0.9;
setState(() => _scrollOffset = newOffset);
} }
@override @override

View File

@ -65,9 +65,9 @@ class _WonderEditorialScreenState extends State<WonderEditorialScreen> {
_scrollPos.value = _scroller.position.pixels; _scrollPos.value = _scroller.position.pixels;
} }
void _handleSwipeUp() { void _handleTrackpadScroll(Offset direction) {
// Trackpad swipe up. Return to home if at the top. // Trackpad swipe up. Return to home if at the top.
if (_scroller.position.pixels == 0) { if (_scroller.position.pixels == 0 && direction.dy > 0) {
_handleBackPressed(); _handleBackPressed();
} }
} }
@ -89,7 +89,7 @@ class _WonderEditorialScreenState extends State<WonderEditorialScreen> {
child: ColoredBox( child: ColoredBox(
color: $styles.colors.offWhite, color: $styles.colors.offWhite,
child: TrackpadListener( child: TrackpadListener(
onScrollUp: _handleSwipeUp, onScroll: _handleTrackpadScroll,
scrollSensitivity: 120, scrollSensitivity: 120,
child: Stack( child: Stack(
children: [ children: [

View File

@ -132,6 +132,12 @@ class _HomeScreenState extends State<HomeScreen> with SingleTickerProviderStateM
} }
} }
void _handleTrackpadScroll(Offset direction) {
if (direction.dy < 0) {
_showDetailsPage();
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (_fadeInOnNextBuild == true) { if (_fadeInOnNextBuild == true) {
@ -143,7 +149,7 @@ class _HomeScreenState extends State<HomeScreen> with SingleTickerProviderStateM
color: $styles.colors.black, color: $styles.colors.black,
child: TrackpadListener( child: TrackpadListener(
scrollSensitivity: 60, scrollSensitivity: 60,
onScrollDown: () => _showDetailsPage(), onScroll: _handleTrackpadScroll,
child: PreviousNextNavigation( child: PreviousNextNavigation(
listenToMouseWheel: false, listenToMouseWheel: false,
onPreviousPressed: () => _handlePrevNext(-1), onPreviousPressed: () => _handlePrevNext(-1),