From f69fc90b5c6a80a3aae8d506a718bb5ce754a16a Mon Sep 17 00:00:00 2001 From: Dave Allie Date: Sat, 13 Dec 2025 20:10:38 +1100 Subject: [PATCH] Show end of book screen when navigating past last page --- src/screens/EpubReaderScreen.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/screens/EpubReaderScreen.cpp b/src/screens/EpubReaderScreen.cpp index c6dd552..b9542d1 100644 --- a/src/screens/EpubReaderScreen.cpp +++ b/src/screens/EpubReaderScreen.cpp @@ -79,6 +79,14 @@ void EpubReaderScreen::handleInput() { return; } + // any botton press when at end of the book goes back to the last page + if (currentSpineIndex > 0 && currentSpineIndex >= epub->getSpineItemsCount()) { + currentSpineIndex = epub->getSpineItemsCount() - 1; + nextPageNumber = UINT16_MAX; + updateRequired = true; + return; + } + const bool skipChapter = inputManager.getHeldTime() > SKIP_CHAPTER_MS; if (skipChapter) { @@ -143,9 +151,22 @@ void EpubReaderScreen::renderScreen() { return; } - if (currentSpineIndex >= epub->getSpineItemsCount() || currentSpineIndex < 0) { + // edge case handling for sub-zero spine index + if (currentSpineIndex < 0) { currentSpineIndex = 0; } + // based bounds of book, show end of book screen + if (currentSpineIndex > epub->getSpineItemsCount()) { + currentSpineIndex = epub->getSpineItemsCount(); + } + + // Show end of book screen + if (currentSpineIndex == epub->getSpineItemsCount()) { + renderer.clearScreen(); + renderer.drawCenteredText(READER_FONT_ID, 300, "End of book", true, BOLD); + renderer.displayBuffer(); + return; + } if (!section) { const auto filepath = epub->getSpineItem(currentSpineIndex);