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,21 +64,23 @@ class _EightWaySwipeDetectorState extends State<EightWaySwipeDetector> {
@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,
),
);
}
}

View File

@ -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<TrackpadListener> {
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

View File

@ -65,9 +65,9 @@ class _WonderEditorialScreenState extends State<WonderEditorialScreen> {
_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<WonderEditorialScreen> {
child: ColoredBox(
color: $styles.colors.offWhite,
child: TrackpadListener(
onScrollUp: _handleSwipeUp,
onScroll: _handleTrackpadScroll,
scrollSensitivity: 120,
child: Stack(
children: [

View File

@ -132,6 +132,12 @@ class _HomeScreenState extends State<HomeScreen> 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<HomeScreen> with SingleTickerProviderStateM
color: $styles.colors.black,
child: TrackpadListener(
scrollSensitivity: 60,
onScrollDown: () => _showDetailsPage(),
onScroll: _handleTrackpadScroll,
child: PreviousNextNavigation(
listenToMouseWheel: false,
onPreviousPressed: () => _handlePrevNext(-1),