diff --git a/lib/components/scroll.dart b/lib/components/scroll.dart index 3988630..741de7d 100644 --- a/lib/components/scroll.dart +++ b/lib/components/scroll.dart @@ -51,10 +51,32 @@ class _SmoothScrollProviderState extends State { static bool _isMouseScroll = App.isDesktop; + late int id; + + static int _id = 0; + + var activeChildren = {}; + + ScrollState? parent; + @override void initState() { _controller = widget.controller ?? ScrollController(); super.initState(); + id = _id; + _id++; + } + + @override + void didChangeDependencies() { + parent = ScrollState.maybeOf(context); + super.didChangeDependencies(); + } + + @override + void dispose() { + parent?.onChildInactive(id); + super.dispose(); } @override @@ -66,8 +88,7 @@ class _SmoothScrollProviderState extends State { const BouncingScrollPhysics(), ); } - return Listener( - behavior: HitTestBehavior.translucent, + var child = Listener( onPointerDown: (event) { _futurePosition = null; if (_isMouseScroll) { @@ -77,6 +98,9 @@ class _SmoothScrollProviderState extends State { } }, onPointerSignal: (pointerSignal) { + if (activeChildren.isNotEmpty) { + return; + } if (pointerSignal is PointerScrollEvent) { if (HardwareKeyboard.instance.isShiftPressed) { return; @@ -113,8 +137,14 @@ class _SmoothScrollProviderState extends State { }); } }, - child: ScrollControllerProvider._( + child: ScrollState._( controller: _controller, + onChildActive: (id) { + activeChildren.add(id); + }, + onChildInactive: (id) { + activeChildren.remove(id); + }, child: widget.builder( context, _controller, @@ -124,25 +154,49 @@ class _SmoothScrollProviderState extends State { ), ), ); + + if (parent != null) { + return MouseRegion( + onEnter: (_) { + parent!.onChildActive(id); + }, + onExit: (_) { + parent!.onChildInactive(id); + }, + child: child, + ); + } + + return child; } } -class ScrollControllerProvider extends InheritedWidget { - const ScrollControllerProvider._({ +class ScrollState extends InheritedWidget { + const ScrollState._({ required this.controller, required super.child, + required this.onChildActive, + required this.onChildInactive, }); final ScrollController controller; - static ScrollController of(BuildContext context) { - final ScrollControllerProvider? provider = - context.dependOnInheritedWidgetOfExactType(); - return provider!.controller; + final void Function(int id) onChildActive; + + final void Function(int id) onChildInactive; + + static ScrollState of(BuildContext context) { + final ScrollState? provider = + context.dependOnInheritedWidgetOfExactType(); + return provider!; + } + + static ScrollState? maybeOf(BuildContext context) { + return context.dependOnInheritedWidgetOfExactType(); } @override - bool updateShouldNotify(ScrollControllerProvider oldWidget) { + bool updateShouldNotify(ScrollState oldWidget) { return oldWidget.controller != controller; } } diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 81da9a3..4b0b2d7 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -942,7 +942,7 @@ class _ImageFavoritesState extends State { displayType = type; }); await Future.delayed(const Duration(milliseconds: 20)); - var scrollController = ScrollControllerProvider.of(context); + var scrollController = ScrollState.of(context).controller; scrollController.animateTo( scrollController.position.maxScrollExtent, duration: const Duration(milliseconds: 200),