diff --git a/lib/components/gallery_info.dart b/lib/components/gallery_info.dart index 77db273..67fbd4b 100644 --- a/lib/components/gallery_info.dart +++ b/lib/components/gallery_info.dart @@ -16,6 +16,7 @@ class GalleryInfo extends StatefulWidget { } class _GalleryInfo extends State { + final ScrollController controller = ScrollController(); void showNsfwChanged(dynamic _) { setState(() {}); } @@ -34,6 +35,7 @@ class _GalleryInfo extends State { ? widget.files!.files[firstPage.token]!.first.id : null; return CustomScrollView( + controller: controller, slivers: [ useMobile ? SliverList( @@ -44,7 +46,8 @@ class _GalleryInfo extends State { ) : SliverList( delegate: SliverChildListDelegate([ - GalleryInfoDesktop(widget.gData, fileId: firstFileId), + GalleryInfoDesktop(widget.gData, + fileId: firstFileId, controller: controller), ]), ), ThumbnailGridView(widget.gData.pages, @@ -56,6 +59,7 @@ class _GalleryInfo extends State { @override void dispose() { + controller.dispose(); listener.removeEventListener("showNsfwChanged", showNsfwChanged); super.dispose(); } diff --git a/lib/components/gallery_info_desktop.dart b/lib/components/gallery_info_desktop.dart index 2d7a33c..da2fca8 100644 --- a/lib/components/gallery_info_desktop.dart +++ b/lib/components/gallery_info_desktop.dart @@ -5,10 +5,11 @@ import 'tags.dart'; import 'thumbnail.dart'; class GalleryInfoDesktop extends StatelessWidget { - const GalleryInfoDesktop(this.gData, {Key? key, this.fileId}) + const GalleryInfoDesktop(this.gData, {Key? key, this.fileId, this.controller}) : super(key: key); final GalleryData gData; final int? fileId; + final ScrollController? controller; @override Widget build(BuildContext context) { diff --git a/lib/components/scroll_parent.dart b/lib/components/scroll_parent.dart new file mode 100644 index 0000000..2cb0cad --- /dev/null +++ b/lib/components/scroll_parent.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; + +class ScrollParent extends StatelessWidget { + final ScrollController controller; + final Widget child; + + const ScrollParent({Key? key, required this.controller, required this.child}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return NotificationListener( + onNotification: (OverscrollNotification value) { + if (value.overscroll < 0 && controller.offset + value.overscroll <= 0) { + if (controller.offset != 0) controller.jumpTo(0); + return true; + } + if (controller.offset + value.overscroll >= + controller.position.maxScrollExtent) { + if (controller.offset != controller.position.maxScrollExtent) + controller.jumpTo(controller.position.maxScrollExtent); + return true; + } + controller.jumpTo(controller.offset + value.overscroll); + return true; + }, + child: child, + ); + } +} diff --git a/lib/components/tags.dart b/lib/components/tags.dart index b1ab201..81417b7 100644 --- a/lib/components/tags.dart +++ b/lib/components/tags.dart @@ -2,10 +2,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import '../api/gallery.dart'; import '../globals.dart'; +import 'scroll_parent.dart'; class TagsPanel extends StatefulWidget { - const TagsPanel(this.tags, {Key? key}) : super(key: key); + const TagsPanel(this.tags, {Key? key, this.controller}) : super(key: key); final List tags; + final ScrollController? controller; @override State createState() => _TagsPanel(); @@ -51,7 +53,7 @@ class _TagsPanel extends State { @override Widget build(BuildContext context) { final cs = Theme.of(context).colorScheme; - return ListView.builder( + final re = ListView.builder( padding: const EdgeInsets.all(8), itemCount: data!.length, itemBuilder: (context, index) { @@ -76,5 +78,8 @@ class _TagsPanel extends State { } })); }); + return widget.controller != null + ? ScrollParent(controller: widget.controller!, child: re) + : re; } } diff --git a/lib/components/thumbnail_gridview.dart b/lib/components/thumbnail_gridview.dart index ca1cbd0..795c7fb 100644 --- a/lib/components/thumbnail_gridview.dart +++ b/lib/components/thumbnail_gridview.dart @@ -19,7 +19,9 @@ class ThumbnailGridView extends StatelessWidget { final page = pages[index]!; final fileId = files != null ? files!.files[page.token]!.first.id : null; - return Thumbnail(page, fileId: fileId); + return Container( + padding: const EdgeInsets.all(4), + child: Thumbnail(page, fileId: fileId)); }); } } diff --git a/lib/gallery.dart b/lib/gallery.dart index 67bcfd8..4ae67a4 100644 --- a/lib/gallery.dart +++ b/lib/gallery.dart @@ -1,11 +1,10 @@ -import 'package:eh_downloader_flutter/api/file.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:go_router/go_router.dart'; import 'package:logging/logging.dart'; +import 'api/file.dart'; import 'api/gallery.dart'; import 'components/gallery_info.dart'; -import 'components/thumbnail.dart'; import 'globals.dart'; final _log = Logger("GalleryPage");