From d563e5996bda5e0d2dcef2dae35c445b34342138 Mon Sep 17 00:00:00 2001 From: Adrian Fleiszer <39962275+adrian-fleiszer@users.noreply.github.com> Date: Fri, 7 Mar 2025 21:49:22 +0100 Subject: [PATCH] Implement vertical page panning in paged reader mode when using hardware keys (#716) * Implement vertical page panning in paged reader mode when using hardware keys * Pan to top or bottom of the page instead of directly moving to the previous/next page. * Add `canPanUp`, `canPanDown`, `panUp`, `panDown` to `ReaderPageImageView`. * Modify `moveUp` and `moveDown` in `PagerViewer` to utilize the new panning functions. * add annotation --- .../ui/reader/viewer/ReaderPageImageView.kt | 28 +++++++++++++++++++ .../ui/reader/viewer/pager/PagerViewer.kt | 22 ++++++++++++--- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderPageImageView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderPageImageView.kt index 7f258b701..93e252902 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderPageImageView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderPageImageView.kt @@ -187,6 +187,18 @@ open class ReaderPageImageView @JvmOverloads constructor( */ fun canPanRight(): Boolean = canPan { it.right } + // KMK --> + /** + * Check if the image can be panned up + */ + fun canPanUp(): Boolean = canPan { it.top } + + /** + * Check if the image can be panned down + */ + fun canPanDown(): Boolean = canPan { it.bottom } + // KMK <-- + /** * Check whether the image can be panned. * @param fn a function that returns the direction to check for @@ -215,6 +227,22 @@ open class ReaderPageImageView @JvmOverloads constructor( pan { center, view -> center.also { it.x += view.width / view.scale } } } + // KMK --> + /** + * Pans the image down by a screen's height worth. + */ + fun panDown() { + pan { center, view -> center.also { it.y += view.height / view.scale } } + } + + /** + * Pans the image up by a screen's height worth. + */ + fun panUp() { + pan { center, view -> center.also { it.y -= view.height / view.scale } } + } + // KMK <-- + /** * Pans the image. * @param fn a function that computes the new center of the image diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt index 945a20c8c..fbc995626 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt @@ -384,17 +384,31 @@ abstract class PagerViewer( } /** - * Moves to the page at the top (or previous). + * Pans to the top of the page or if already on the top moves to the previous page. */ protected open fun moveUp() { - moveToPrevious() + // KMK --> + val holder = (currentPage as? ReaderPage)?.let(::getPageHolder) + if (holder != null && holder.canPanUp()) { + holder.panUp() + } else { + // KMK <-- + moveToPrevious() + } } /** - * Moves to the page at the bottom (or next). + * Pans to the bottom of the page or if already on the bottom moves to the next page. */ protected open fun moveDown() { - moveToNext() + // KMK --> + val holder = (currentPage as? ReaderPage)?.let(::getPageHolder) + if (holder != null && holder.canPanDown()) { + holder.panDown() + } else { + // KMK <-- + moveToNext() + } } /**