feat: add EndOfBookMenuActivity replacing static end-of-book text

Interactive menu shown when reaching the end of a book with options:
Archive Book, Delete Book, Back to Beginning, Close Book, Close Menu.
Wired into EpubReaderActivity, XtcReaderActivity, and TxtReaderActivity
(TXT shows menu when user tries to advance past the last page).

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
cottongin
2026-02-21 03:04:48 -05:00
parent f5b708424d
commit 98146f2545
8 changed files with 253 additions and 9 deletions

View File

@@ -13,6 +13,7 @@
#include "EpubReaderBookmarkSelectionActivity.h"
#include "EpubReaderChapterSelectionActivity.h"
#include "EpubReaderPercentSelectionActivity.h"
#include "EndOfBookMenuActivity.h"
#include "KOReaderCredentialStore.h"
#include "KOReaderSyncActivity.h"
#include "MappedInputManager.h"
@@ -300,10 +301,11 @@ void EpubReaderActivity::loop() {
return;
}
// any botton press when at end of the book goes back to the last page
// any button 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;
endOfBookMenuOpened = false;
requestUpdate();
return;
}
@@ -840,9 +842,42 @@ void EpubReaderActivity::render(Activity::RenderLock&& lock) {
// Show end of book screen
if (currentSpineIndex == epub->getSpineItemsCount()) {
renderer.clearScreen();
renderer.drawCenteredText(UI_12_FONT_ID, 300, tr(STR_END_OF_BOOK), true, EpdFontFamily::BOLD);
renderer.displayBuffer();
if (!endOfBookMenuOpened) {
endOfBookMenuOpened = true;
lock.unlock();
const std::string path = epub->getPath();
enterNewActivity(new EndOfBookMenuActivity(
renderer, mappedInput, path, [this](EndOfBookMenuActivity::Action action) {
exitActivity();
switch (action) {
case EndOfBookMenuActivity::Action::ARCHIVE:
if (epub) BookManager::archiveBook(epub->getPath());
pendingGoHome = true;
break;
case EndOfBookMenuActivity::Action::DELETE:
if (epub) BookManager::deleteBook(epub->getPath());
pendingGoHome = true;
break;
case EndOfBookMenuActivity::Action::BACK_TO_BEGINNING:
currentSpineIndex = 0;
nextPageNumber = 0;
section.reset();
endOfBookMenuOpened = false;
requestUpdate();
break;
case EndOfBookMenuActivity::Action::CLOSE_BOOK:
pendingGoHome = true;
break;
case EndOfBookMenuActivity::Action::CLOSE_MENU:
currentSpineIndex = epub->getSpineItemsCount() - 1;
nextPageNumber = UINT16_MAX;
section.reset();
endOfBookMenuOpened = false;
requestUpdate();
break;
}
}));
}
return;
}