From a014587a94b34d51aeb297737c305d552fb34c12 Mon Sep 17 00:00:00 2001 From: nyne Date: Fri, 21 Feb 2025 14:13:05 +0800 Subject: [PATCH] Do not switch chapters if the current chapter is the first or last chapter in the chapter group. --- lib/foundation/comic_source/models.dart | 2 +- lib/pages/reader/gesture.dart | 4 +-- lib/pages/reader/images.dart | 9 +++---- lib/pages/reader/reader.dart | 34 +++++++++++++++++++++++++ 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/lib/foundation/comic_source/models.dart b/lib/foundation/comic_source/models.dart index 4be9310..c80fea0 100644 --- a/lib/foundation/comic_source/models.dart +++ b/lib/foundation/comic_source/models.dart @@ -381,7 +381,7 @@ class ComicChapters { return _groupedChapters!.values.elementAt(index); } - /// Get a chapter by index + /// Get total number of chapters int get length { return isGrouped ? _groupedChapters!.values.map((e) => e.length).reduce((a, b) => a + b) diff --git a/lib/pages/reader/gesture.dart b/lib/pages/reader/gesture.dart index 3122339..0b3928c 100644 --- a/lib/pages/reader/gesture.dart +++ b/lib/pages/reader/gesture.dart @@ -131,11 +131,11 @@ class _ReaderGestureDetectorState extends AutomaticGlobalState<_ReaderGestureDet } if (context.reader.mode.key.startsWith('gallery')) { if (forward) { - if (!context.reader.toNextPage()) { + if (!context.reader.toNextPage() && !context.reader.isLastChapterOfGroup) { context.reader.toNextChapter(); } } else { - if (!context.reader.toPrevPage()) { + if (!context.reader.toPrevPage() && !context.reader.isFirstChapterOfGroup) { context.reader.toPrevChapter(); } } diff --git a/lib/pages/reader/images.dart b/lib/pages/reader/images.dart index dba0e70..5ce0e56 100644 --- a/lib/pages/reader/images.dart +++ b/lib/pages/reader/images.dart @@ -206,11 +206,11 @@ class _GalleryModeState extends State<_GalleryMode> ), onPageChanged: (i) { if (i == 0) { - if (!reader.toPrevChapter()) { + if (reader.isFirstChapterOfGroup || !reader.toPrevChapter()) { reader.toPage(1); } } else if (i == totalPages + 1) { - if (!reader.toNextChapter()) { + if (reader.isLastChapterOfGroup || !reader.toNextChapter()) { reader.toPage(totalPages); } } else { @@ -575,15 +575,14 @@ class _ContinuousModeState extends State<_ContinuousMode> } if (notification is ScrollUpdateNotification) { - var length = reader.maxChapter; if (!scrollController.hasClients) return false; if (scrollController.position.pixels <= scrollController.position.minScrollExtent && - reader.chapter != 1) { + !reader.isFirstChapterOfGroup) { context.readerScaffold.setFloatingButton(-1); } else if (scrollController.position.pixels >= scrollController.position.maxScrollExtent && - reader.chapter < length) { + !reader.isLastChapterOfGroup) { context.readerScaffold.setFloatingButton(1); } else { context.readerScaffold.setFloatingButton(0); diff --git a/lib/pages/reader/reader.dart b/lib/pages/reader/reader.dart index 2df6cd9..27d82da 100644 --- a/lib/pages/reader/reader.dart +++ b/lib/pages/reader/reader.dart @@ -265,6 +265,40 @@ class _ReaderState extends State }); } } + + bool get isFirstChapterOfGroup { + if (widget.chapters?.isGrouped ?? false) { + int c = chapter - 1; + int g = 1; + while (c > 0) { + c -= widget.chapters!.getGroupByIndex(g - 1).length; + g++; + } + if (c == 0) { + return true; + } else { + return false; + } + } + return chapter == 1; + } + + bool get isLastChapterOfGroup { + if (widget.chapters?.isGrouped ?? false) { + int c = chapter; + int g = 1; + while (c > 0) { + c -= widget.chapters!.getGroupByIndex(g - 1).length; + g++; + } + if (c == 0) { + return true; + } else { + return false; + } + } + return chapter == maxChapter; + } } abstract mixin class _ImagePerPageHandler {