diff --git a/lib/I18n/translations/belarusian.yaml b/lib/I18n/translations/belarusian.yaml index e907950d..7411592d 100644 --- a/lib/I18n/translations/belarusian.yaml +++ b/lib/I18n/translations/belarusian.yaml @@ -268,6 +268,7 @@ STR_IMAGES_DISPLAY: "Паказваць" STR_IMAGES_PLACEHOLDER: "Запаўняльнік" STR_IMAGES_SUPPRESS: "Хаваць" STR_SHOW_HIDDEN_FILES: "Паказваць схаваныя файлы" +STR_REMOVE_READ_FROM_RECENTS: "Ачышчаць прачытаныя кнігі са спісу нядаўніх" STR_MOVE_FINISHED_TO_READ: "Перамяшчаць прачытаныя кнігі ў тэчку Read" STR_SELECTED: "Выбрана" STR_SHOW: "Паказаць" diff --git a/lib/I18n/translations/catalan.yaml b/lib/I18n/translations/catalan.yaml index 0961626c..b2f936a1 100644 --- a/lib/I18n/translations/catalan.yaml +++ b/lib/I18n/translations/catalan.yaml @@ -85,6 +85,7 @@ STR_PARA_ALIGNMENT: "Alineació de paràgrafs del lector" STR_HYPHENATION: "Partició de mots" STR_TIME_TO_SLEEP: "Temps per entrar en repòs" STR_SHOW_HIDDEN_FILES: "Mostra fitxers ocults" +STR_REMOVE_READ_FROM_RECENTS: "Esborra els llibres llegits de la llista de recents" STR_MOVE_FINISHED_TO_READ: "Mou els llibres acabats a la carpeta Read" STR_REFRESH_FREQ: "Freqüència de refresc" STR_KOREADER_SYNC: "Sincronització del KOReader" diff --git a/lib/I18n/translations/czech.yaml b/lib/I18n/translations/czech.yaml index e03ea8af..44f65bdc 100644 --- a/lib/I18n/translations/czech.yaml +++ b/lib/I18n/translations/czech.yaml @@ -80,6 +80,7 @@ STR_SCREEN_MARGIN: "Okraj obrazovky čtečky" STR_PARA_ALIGNMENT: "Zarovnání odstavců čtečky" STR_HYPHENATION: "Dělení slov" STR_TIME_TO_SLEEP: "Čas do uspání" +STR_REMOVE_READ_FROM_RECENTS: "Vymazat přečtené knihy ze seznamu nedávných" STR_MOVE_FINISHED_TO_READ: "Přesunout přečtené knihy do složky Read" STR_REFRESH_FREQ: "Frekvence obnovení" STR_KOREADER_SYNC: "KOReaderu Sync" diff --git a/lib/I18n/translations/danish.yaml b/lib/I18n/translations/danish.yaml index 56f3a05f..b89993d7 100644 --- a/lib/I18n/translations/danish.yaml +++ b/lib/I18n/translations/danish.yaml @@ -85,6 +85,7 @@ STR_PARA_ALIGNMENT: "Afsnitsjustering" STR_HYPHENATION: "Orddeling" STR_TIME_TO_SLEEP: "Tid til hvile" STR_SHOW_HIDDEN_FILES: "Vis skjulte filer" +STR_REMOVE_READ_FROM_RECENTS: "Ryd læste bøger fra listen Seneste" STR_MOVE_FINISHED_TO_READ: "Flyt læste bøger til Read-mappen" STR_REFRESH_FREQ: "Opdateringsfrekvens" STR_KOREADER_SYNC: "KOReader Sync" diff --git a/lib/I18n/translations/dutch.yaml b/lib/I18n/translations/dutch.yaml index 0f0c42ab..2211d6b4 100644 --- a/lib/I18n/translations/dutch.yaml +++ b/lib/I18n/translations/dutch.yaml @@ -85,6 +85,7 @@ STR_PARA_ALIGNMENT: "Uitlijning alinea lezer" STR_HYPHENATION: "Woordafbreking" STR_TIME_TO_SLEEP: "Tijd tot slaapstand" STR_SHOW_HIDDEN_FILES: "Toon verborgen bestanden" +STR_REMOVE_READ_FROM_RECENTS: "Gelezen boeken wissen uit de lijst Recent" STR_MOVE_FINISHED_TO_READ: "Voltooide boeken naar de Read-map verplaatsen" STR_REFRESH_FREQ: "Verversingsfrequentie" STR_KOREADER_SYNC: "KOReader Sync" diff --git a/lib/I18n/translations/english.yaml b/lib/I18n/translations/english.yaml index 824e7240..39f64244 100644 --- a/lib/I18n/translations/english.yaml +++ b/lib/I18n/translations/english.yaml @@ -85,6 +85,7 @@ STR_PARA_ALIGNMENT: "Reader Paragraph Alignment" STR_HYPHENATION: "Hyphenation" STR_TIME_TO_SLEEP: "Time to Sleep" STR_SHOW_HIDDEN_FILES: "Show Hidden Files" +STR_REMOVE_READ_FROM_RECENTS: "Clear Read Books from Recent List" STR_MOVE_FINISHED_TO_READ: "Move Finished Books to Read Folder" STR_REFRESH_FREQ: "Refresh Frequency" STR_KOREADER_SYNC: "KOReader Sync" diff --git a/lib/I18n/translations/finnish.yaml b/lib/I18n/translations/finnish.yaml index 6d625a07..0448ae84 100644 --- a/lib/I18n/translations/finnish.yaml +++ b/lib/I18n/translations/finnish.yaml @@ -80,6 +80,7 @@ STR_SCREEN_MARGIN: "Lukijan näyttömarginaali" STR_PARA_ALIGNMENT: "Lukijan kappaletasaus" STR_HYPHENATION: "Tavutus" STR_TIME_TO_SLEEP: "Aika lepotilaan" +STR_REMOVE_READ_FROM_RECENTS: "Tyhjennä luetut kirjat viimeisimpien listalta" STR_MOVE_FINISHED_TO_READ: "Siirrä luetut kirjat Read-kansioon" STR_REFRESH_FREQ: "Päivitystaajuus" STR_KOREADER_SYNC: "KOReader-synkronointi" diff --git a/lib/I18n/translations/french.yaml b/lib/I18n/translations/french.yaml index 8e335f76..25d25a29 100644 --- a/lib/I18n/translations/french.yaml +++ b/lib/I18n/translations/french.yaml @@ -85,6 +85,7 @@ STR_PARA_ALIGNMENT: "Alignement du texte" STR_HYPHENATION: "Césure" STR_TIME_TO_SLEEP: "Mise en veille auto" STR_SHOW_HIDDEN_FILES: "Afficher les fichiers cachés" +STR_REMOVE_READ_FROM_RECENTS: "Effacer les livres lus de la liste des récents" STR_MOVE_FINISHED_TO_READ: "Déplacer les livres terminés vers le dossier Read" STR_REFRESH_FREQ: "Fréquence rafraîchissement" STR_KOREADER_SYNC: "Synchro KOReader" diff --git a/lib/I18n/translations/german.yaml b/lib/I18n/translations/german.yaml index 0f98eb6c..1612957d 100644 --- a/lib/I18n/translations/german.yaml +++ b/lib/I18n/translations/german.yaml @@ -303,6 +303,7 @@ STR_IMAGES_DISPLAY: "Darstellung" STR_IMAGES_PLACEHOLDER: "Platzhalter" STR_IMAGES_SUPPRESS: "Unterdrücken" STR_SHOW_HIDDEN_FILES: "Versteckte Dateien anzeigen" +STR_REMOVE_READ_FROM_RECENTS: "Gelesene Bücher aus der Zuletzt-Liste löschen" STR_MOVE_FINISHED_TO_READ: "Gelesene Bücher in den Read-Ordner verschieben" STR_PAGE_OVERLAY: "Seiten-Overlay" STR_RECENTS: "Zuletzt" diff --git a/lib/I18n/translations/hungarian.yaml b/lib/I18n/translations/hungarian.yaml index b5eb19f7..e4474d28 100644 --- a/lib/I18n/translations/hungarian.yaml +++ b/lib/I18n/translations/hungarian.yaml @@ -82,6 +82,7 @@ STR_PARA_ALIGNMENT: "Olvasó szövegigazítás" STR_HYPHENATION: "Elválasztás" STR_TIME_TO_SLEEP: "Alvó mód aktiválása" STR_SHOW_HIDDEN_FILES: "Rejtett fájlok megjelenítése" +STR_REMOVE_READ_FROM_RECENTS: "Olvasott könyvek törlése a legutóbbiak listájáról" STR_MOVE_FINISHED_TO_READ: "Befejezett könyvek áthelyezése a Read mappába" STR_REFRESH_FREQ: "Frissítési frekvencia" STR_KOREADER_SYNC: "KOReader szinkronizálás" diff --git a/lib/I18n/translations/italian.yaml b/lib/I18n/translations/italian.yaml index 611aeab4..7b5a894a 100644 --- a/lib/I18n/translations/italian.yaml +++ b/lib/I18n/translations/italian.yaml @@ -85,6 +85,7 @@ STR_PARA_ALIGNMENT: "Allineamento paragrafo" STR_HYPHENATION: "Sillabazione" STR_TIME_TO_SLEEP: "Timeout sospensione" STR_SHOW_HIDDEN_FILES: "Mostra file nascosti" +STR_REMOVE_READ_FROM_RECENTS: "Cancella i libri letti dall'elenco dei recenti" STR_MOVE_FINISHED_TO_READ: "Sposta i libri finiti nella cartella Read" STR_REFRESH_FREQ: "Frequenza di aggiornamento" STR_KOREADER_SYNC: "Sincronizzazione KOReader" diff --git a/lib/I18n/translations/kazakh.yaml b/lib/I18n/translations/kazakh.yaml index 624bf197..a5fb5ccd 100644 --- a/lib/I18n/translations/kazakh.yaml +++ b/lib/I18n/translations/kazakh.yaml @@ -76,6 +76,7 @@ STR_SCREEN_MARGIN: "Оқырман экран жиегі" STR_PARA_ALIGNMENT: "Оқырман абзац туралануы" STR_HYPHENATION: "Буын бөлу" STR_TIME_TO_SLEEP: "Ұйқы уақыты" +STR_REMOVE_READ_FROM_RECENTS: "Оқылған кітаптарды соңғылар тізімінен тазалау" STR_MOVE_FINISHED_TO_READ: "Оқылған кітаптарды Read қалтасына жылжыту" STR_REFRESH_FREQ: "Жаңарту жиілігі" STR_KOREADER_SYNC: "KOReader синхронизациясы" diff --git a/lib/I18n/translations/lithuanian.yaml b/lib/I18n/translations/lithuanian.yaml index b73c86e7..88870d9d 100644 --- a/lib/I18n/translations/lithuanian.yaml +++ b/lib/I18n/translations/lithuanian.yaml @@ -82,6 +82,7 @@ STR_PARA_ALIGNMENT: "Lygiavimas" STR_HYPHENATION: "Skiemenuoti" STR_TIME_TO_SLEEP: "Užmigti po" STR_SHOW_HIDDEN_FILES: "Rod. paslėptus failus" +STR_REMOVE_READ_FROM_RECENTS: "Išvalyti perskaitytas knygas iš paskutinių sąrašo" STR_MOVE_FINISHED_TO_READ: "Perkelti perskaitytas knygas į aplanką Read" STR_REFRESH_FREQ: "Atnaujinimo dažnis" STR_KOREADER_SYNC: "KOReader sinchr." diff --git a/lib/I18n/translations/polish.yaml b/lib/I18n/translations/polish.yaml index fffdb114..a187b011 100644 --- a/lib/I18n/translations/polish.yaml +++ b/lib/I18n/translations/polish.yaml @@ -85,6 +85,7 @@ STR_PARA_ALIGNMENT: "Wyjustowanie paragrafów" STR_HYPHENATION: "Dzielenie wyrazów" STR_TIME_TO_SLEEP: "Czas do uśpienia" STR_SHOW_HIDDEN_FILES: "Pokaż ukryte pliki" +STR_REMOVE_READ_FROM_RECENTS: "Wyczyść przeczytane książki z listy ostatnich" STR_MOVE_FINISHED_TO_READ: "Przenoś przeczytane książki do folderu Read" STR_REFRESH_FREQ: "Częstotliwość odświeżania" STR_KOREADER_SYNC: "KOReader Sync" diff --git a/lib/I18n/translations/portuguese.yaml b/lib/I18n/translations/portuguese.yaml index a0efb68c..d2289014 100644 --- a/lib/I18n/translations/portuguese.yaml +++ b/lib/I18n/translations/portuguese.yaml @@ -80,6 +80,7 @@ STR_SCREEN_MARGIN: "Margens da tela" STR_PARA_ALIGNMENT: "Alinhamento parágrafo" STR_HYPHENATION: "Hifenização" STR_TIME_TO_SLEEP: "Tempo para repousar" +STR_REMOVE_READ_FROM_RECENTS: "Limpar livros lidos da lista de recentes" STR_MOVE_FINISHED_TO_READ: "Mover livros lidos para a pasta Read" STR_REFRESH_FREQ: "Frequência atualização" STR_KOREADER_SYNC: "Sincronização KOReader" diff --git a/lib/I18n/translations/romanian.yaml b/lib/I18n/translations/romanian.yaml index d5670467..0daf3c6f 100644 --- a/lib/I18n/translations/romanian.yaml +++ b/lib/I18n/translations/romanian.yaml @@ -85,6 +85,7 @@ STR_PARA_ALIGNMENT: "Aliniere paragrafe reader" STR_HYPHENATION: "Silabisire" STR_TIME_TO_SLEEP: "Timp până la repaus" STR_SHOW_HIDDEN_FILES: "Afişează fişierele ascunse" +STR_REMOVE_READ_FROM_RECENTS: "Șterge cărțile citite din lista de recente" STR_MOVE_FINISHED_TO_READ: "Mută cărţile terminate în folderul Read" STR_REFRESH_FREQ: "Frecvenţă reîmprospătare" STR_KOREADER_SYNC: "Sincronizare KOReader" diff --git a/lib/I18n/translations/russian.yaml b/lib/I18n/translations/russian.yaml index eadbc60b..f5e95054 100644 --- a/lib/I18n/translations/russian.yaml +++ b/lib/I18n/translations/russian.yaml @@ -85,6 +85,7 @@ STR_PARA_ALIGNMENT: "Выравнивание абзаца" STR_HYPHENATION: "Перенос слов" STR_TIME_TO_SLEEP: "Сон через" STR_SHOW_HIDDEN_FILES: "Показать скрытые файлы" +STR_REMOVE_READ_FROM_RECENTS: "Очищать прочитанные книги из списка недавних" STR_MOVE_FINISHED_TO_READ: "Перемещать прочитанные книги в папку Read" STR_REFRESH_FREQ: "Частота обновления" STR_KOREADER_SYNC: "Синхронизация KOReader" diff --git a/lib/I18n/translations/slovenian.yaml b/lib/I18n/translations/slovenian.yaml index 87d96817..f9abf855 100644 --- a/lib/I18n/translations/slovenian.yaml +++ b/lib/I18n/translations/slovenian.yaml @@ -82,6 +82,7 @@ STR_PARA_ALIGNMENT: "Poravnava odstavkov" STR_HYPHENATION: "Deljenje besed" STR_TIME_TO_SLEEP: "Čas do spanja" STR_SHOW_HIDDEN_FILES: "Prikaži skrite datoteke" +STR_REMOVE_READ_FROM_RECENTS: "Počisti prebrane knjige s seznama nedavnih" STR_MOVE_FINISHED_TO_READ: "Premakni prebrane knjige v mapo Read" STR_REFRESH_FREQ: "Pogostost osveževanja" STR_KOREADER_SYNC: "KOReader sinhronizacija" diff --git a/lib/I18n/translations/spanish.yaml b/lib/I18n/translations/spanish.yaml index cb7723a2..0fceae4e 100644 --- a/lib/I18n/translations/spanish.yaml +++ b/lib/I18n/translations/spanish.yaml @@ -85,6 +85,7 @@ STR_PARA_ALIGNMENT: "Ajuste de párrafo" STR_HYPHENATION: "División de palabras" STR_TIME_TO_SLEEP: "Auto suspensión" STR_SHOW_HIDDEN_FILES: "Mostrar archivos ocultos" +STR_REMOVE_READ_FROM_RECENTS: "Borrar libros leídos de la lista de recientes" STR_MOVE_FINISHED_TO_READ: "Mover libros terminados a la carpeta Read" STR_REFRESH_FREQ: "Frecuencia de refresco" STR_KOREADER_SYNC: "Sincronización de KOReader" diff --git a/lib/I18n/translations/swedish.yaml b/lib/I18n/translations/swedish.yaml index 8d0957d3..14811162 100644 --- a/lib/I18n/translations/swedish.yaml +++ b/lib/I18n/translations/swedish.yaml @@ -85,6 +85,7 @@ STR_PARA_ALIGNMENT: "Eboksläsarens paragrafjustering" STR_HYPHENATION: "Avstavning" STR_TIME_TO_SLEEP: "Tid för att gå i vila" STR_SHOW_HIDDEN_FILES: "Visa dolda filer" +STR_REMOVE_READ_FROM_RECENTS: "Rensa lästa böcker från listan Senaste" STR_MOVE_FINISHED_TO_READ: "Flytta lästa böcker till Read-mappen" STR_REFRESH_FREQ: "Uppdateringsfrekvens" STR_KOREADER_SYNC: "KOReader-synkronisering" diff --git a/lib/I18n/translations/turkish.yaml b/lib/I18n/translations/turkish.yaml index 64a58285..5c5cdada 100644 --- a/lib/I18n/translations/turkish.yaml +++ b/lib/I18n/translations/turkish.yaml @@ -80,6 +80,7 @@ STR_PARA_ALIGNMENT: "Okuyucu Paragraf Hizalaması" STR_HYPHENATION: "Hecelerden Ayırma" STR_TIME_TO_SLEEP: "Uykuya Geçme Süresi" STR_SHOW_HIDDEN_FILES: "Gizli Dosyaları Göster" +STR_REMOVE_READ_FROM_RECENTS: "Okunan kitapları Son listesinden temizle" STR_MOVE_FINISHED_TO_READ: "Biten kitapları Read klasörüne taşı" STR_REFRESH_FREQ: "Yenileme Sıklığı" STR_KOREADER_SYNC: "KOReader Senkronizasyonu" diff --git a/lib/I18n/translations/ukrainian.yaml b/lib/I18n/translations/ukrainian.yaml index bc2299a9..4f9e9915 100644 --- a/lib/I18n/translations/ukrainian.yaml +++ b/lib/I18n/translations/ukrainian.yaml @@ -85,6 +85,7 @@ STR_PARA_ALIGNMENT: "Вирівнювання тексту" STR_HYPHENATION: "Перенесення слів" STR_TIME_TO_SLEEP: "Перехід в режим сну" STR_SHOW_HIDDEN_FILES: "Показати приховані файли" +STR_REMOVE_READ_FROM_RECENTS: "Очищати прочитані книги зі списку останніх" STR_MOVE_FINISHED_TO_READ: "Переміщати прочитані книги до теки Read" STR_REFRESH_FREQ: "Частота оновлення екрану" STR_KOREADER_SYNC: "Синхронізація KOReader" diff --git a/src/CrossPointSettings.h b/src/CrossPointSettings.h index c4d865e8..3e857fac 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -231,6 +231,8 @@ class CrossPointSettings { char sdFontFamilyName[32] = ""; // Show hidden files/directories (starting with '.') in the file browser (0 = hidden, 1 = show) uint8_t showHiddenFiles = 0; + // Remove a book from the Recent Books list when its End-of-Book screen is reached (0 = off, 1 = on) + uint8_t removeReadBooksFromRecents = 0; // Move epub to /Read/ folder on SD card when finished (0 = disabled, 1 = enabled) uint8_t moveFinishedToReadFolder = 0; // Image rendering mode in EPUB reader diff --git a/src/RecentBooksStore.cpp b/src/RecentBooksStore.cpp index e4c819b9..c9df55d8 100644 --- a/src/RecentBooksStore.cpp +++ b/src/RecentBooksStore.cpp @@ -56,6 +56,21 @@ void RecentBooksStore::updateBook(const std::string& path, const std::string& ti } } +bool RecentBooksStore::removeByPath(const std::string& path) { + auto it = + std::find_if(recentBooks.begin(), recentBooks.end(), [&](const RecentBook& book) { return book.path == path; }); + if (it == recentBooks.end()) { + return false; + } + recentBooks.erase(it); + if (!saveToFile()) { + // In-memory removal succeeded; persistence is best-effort here (consistent with + // addBook/updateBook). Log the failure but still report the entry as removed. + LOG_ERR("RBS", "Failed to persist removal of recent book: %s", path.c_str()); + } + return true; +} + void RecentBooksStore::updatePath(const std::string& oldPath, const std::string& newPath, const std::string& oldCachePath, const std::string& newCachePath) { auto it = std::find_if(recentBooks.begin(), recentBooks.end(), diff --git a/src/RecentBooksStore.h b/src/RecentBooksStore.h index d1111a9f..e063f9cf 100644 --- a/src/RecentBooksStore.h +++ b/src/RecentBooksStore.h @@ -37,6 +37,11 @@ class RecentBooksStore { void updateBook(const std::string& path, const std::string& title, const std::string& author, const std::string& coverBmpPath); + // Remove the entry whose path matches (used when a book is finished/read). + // Returns true if an entry was found and removed (no-op + false otherwise). + // Persistence is best-effort: a failed save is logged, not reflected in the return. + bool removeByPath(const std::string& path); + // Repoint an entry's path (and coverBmpPath, if it lived under the old cache dir) after the // backing file and cache dir were moved on disk. No-op if no entry matches oldPath. // Persists on success. Keeps the entry's list position (does not reorder). diff --git a/src/SettingsList.h b/src/SettingsList.h index 510b019f..e625f17f 100644 --- a/src/SettingsList.h +++ b/src/SettingsList.h @@ -178,6 +178,8 @@ inline std::vector getSettingsList(const SdCardFontRegistry* regist "sleepTimeout", StrId::STR_CAT_SYSTEM), SettingInfo::Toggle(StrId::STR_SHOW_HIDDEN_FILES, &CrossPointSettings::showHiddenFiles, "showHiddenFiles", StrId::STR_CAT_SYSTEM), + SettingInfo::Toggle(StrId::STR_REMOVE_READ_FROM_RECENTS, &CrossPointSettings::removeReadBooksFromRecents, + "removeReadBooksFromRecents", StrId::STR_CAT_SYSTEM), SettingInfo::Toggle(StrId::STR_MOVE_FINISHED_TO_READ, &CrossPointSettings::moveFinishedToReadFolder, "moveFinishedToReadFolder", StrId::STR_CAT_SYSTEM), diff --git a/src/activities/reader/EpubReaderActivity.cpp b/src/activities/reader/EpubReaderActivity.cpp index e30d1959..c44e3a59 100644 --- a/src/activities/reader/EpubReaderActivity.cpp +++ b/src/activities/reader/EpubReaderActivity.cpp @@ -190,10 +190,30 @@ void EpubReaderActivity::loop() { return; } - // Being on the "End of Book" screen (currentSpineIndex == spine count) means the book is - // finished. Arm the move here so ANY exit path (Back, Home, file browser) relocates the - // book in onExit(); paging back off the end screen disarms it (book not actually finished). - if (currentSpineIndex > 0 && currentSpineIndex >= epub->getSpineItemsCount()) { + // End-of-Book screen reached (currentSpineIndex == spine count) means the book is + // finished. Two independent finished-book features key off this same condition. + const bool atEndOfBook = currentSpineIndex > 0 && currentSpineIndex >= epub->getSpineItemsCount(); + + // Drop this book from the Recent Books list; if the reader then pages back into the book, + // re-add it. So removal only sticks if the reader leaves while still on the End-of-Book + // screen. Acts only on the transition (guarded by recentsEntryRemoved) — no per-frame writes. + if (SETTINGS.removeReadBooksFromRecents) { + if (atEndOfBook && !recentsEntryRemoved) { + // Only treat the book as "removed by us" if it was actually in the list, so the + // re-add branch below doesn't insert a book the feature never removed. + recentsEntryRemoved = RECENT_BOOKS.removeByPath(epub->getPath()); + } else if (!atEndOfBook && recentsEntryRemoved) { + // Re-add (goes to front of the list via addBook — accepted ordering side effect). + RECENT_BOOKS.addBook(epub->getPath(), epub->getTitle(), epub->getAuthor(), epub->getThumbBmpPath()); + recentsEntryRemoved = false; + } + } + + // Arm the move here so ANY exit path (Back, Home, file browser) relocates the book into + // /Read/ in onExit(); paging back off the end screen disarms it (book not actually + // finished). If removeReadBooksFromRecents also fired, RecentBooksStore::updatePath in the + // move path becomes a safe no-op since the entry was already removed. + if (atEndOfBook) { pendingReadFolderMove = SETTINGS.moveFinishedToReadFolder && !isInReadFolder(epub->getPath()); } else { pendingReadFolderMove = false; diff --git a/src/activities/reader/EpubReaderActivity.h b/src/activities/reader/EpubReaderActivity.h index 38ecc2a1..23849469 100644 --- a/src/activities/reader/EpubReaderActivity.h +++ b/src/activities/reader/EpubReaderActivity.h @@ -31,6 +31,9 @@ class EpubReaderActivity final : public Activity { bool pendingSyncSaveError = false; bool skipNextButtonCheck = false; // Skip button processing for one frame after subactivity exit bool automaticPageTurnActive = false; + // Tracks whether this book is currently removed from Recent Books by the + // removeReadBooksFromRecents feature (set at End-of-Book, cleared if paged back in). + bool recentsEntryRemoved = false; // Set when the reader is left at end-of-book and SETTINGS.moveFinishedToReadFolder is on. // Consumed in onExit() to relocate the finished book into /Read/. bool pendingReadFolderMove = false;