Tags panel overscroll will scroll parent

This commit is contained in:
2023-09-04 20:25:28 +08:00
parent 49239869ff
commit c3e46170d4
6 changed files with 48 additions and 7 deletions

View File

@@ -16,6 +16,7 @@ class GalleryInfo extends StatefulWidget {
}
class _GalleryInfo extends State<GalleryInfo> {
final ScrollController controller = ScrollController();
void showNsfwChanged(dynamic _) {
setState(() {});
}
@@ -34,6 +35,7 @@ class _GalleryInfo extends State<GalleryInfo> {
? widget.files!.files[firstPage.token]!.first.id
: null;
return CustomScrollView(
controller: controller,
slivers: [
useMobile
? SliverList(
@@ -44,7 +46,8 @@ class _GalleryInfo extends State<GalleryInfo> {
)
: 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<GalleryInfo> {
@override
void dispose() {
controller.dispose();
listener.removeEventListener("showNsfwChanged", showNsfwChanged);
super.dispose();
}

View File

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

View File

@@ -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<OverscrollNotification>(
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,
);
}
}

View File

@@ -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<Tag> tags;
final ScrollController? controller;
@override
State<TagsPanel> createState() => _TagsPanel();
@@ -51,7 +53,7 @@ class _TagsPanel extends State<TagsPanel> {
@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<TagsPanel> {
}
}));
});
return widget.controller != null
? ScrollParent(controller: widget.controller!, child: re)
: re;
}
}

View File

@@ -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));
});
}
}

View File

@@ -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");