feat: allow removing book from recent list (#2045)

## Summary

Add ability to long press 'confirm' on a book in the recent books list
to be prompted to remove it from the list.

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? *Yes, Claude*

---------
This commit is contained in:
KemoNine
2026-05-18 22:16:33 -04:00
committed by GitHub
parent f2adefe729
commit df53faab91
26 changed files with 77 additions and 4 deletions
+1
View File
@@ -209,6 +209,7 @@ STR_REMAP_FRONT_BUTTONS: "Пераназначыць пярэднія кнопк
STR_OPDS_BROWSER: "OPDS браўзер" STR_OPDS_BROWSER: "OPDS браўзер"
STR_COVER_CUSTOM: "Вокладка + Свой" STR_COVER_CUSTOM: "Вокладка + Свой"
STR_MENU_RECENT_BOOKS: "Нядаўнія кнігі" STR_MENU_RECENT_BOOKS: "Нядаўнія кнігі"
STR_REMOVE_FROM_RECENTS: "Выдаліць з нядаўніх кніг?"
STR_NO_RECENT_BOOKS: "Няма нядаўніх кніг" STR_NO_RECENT_BOOKS: "Няма нядаўніх кніг"
STR_CALIBRE_DESC: "Выкарыстоўваць бесправадную перадачу Calibre" STR_CALIBRE_DESC: "Выкарыстоўваць бесправадную перадачу Calibre"
STR_FORGET_AND_REMOVE: "Забыць сетку і выдаліць захаваны пароль?" STR_FORGET_AND_REMOVE: "Забыць сетку і выдаліць захаваны пароль?"
+1
View File
@@ -237,6 +237,7 @@ STR_REMAP_FRONT_BUTTONS: "Reassigna els botons frontals"
STR_OPDS_BROWSER: "Navegador OPDS" STR_OPDS_BROWSER: "Navegador OPDS"
STR_COVER_CUSTOM: "Portada + Personalitzat" STR_COVER_CUSTOM: "Portada + Personalitzat"
STR_MENU_RECENT_BOOKS: "Llibres recents" STR_MENU_RECENT_BOOKS: "Llibres recents"
STR_REMOVE_FROM_RECENTS: "Voleu suprimir-lo de Llibres recents?"
STR_NO_RECENT_BOOKS: "No hi ha llibres recents" STR_NO_RECENT_BOOKS: "No hi ha llibres recents"
STR_CALIBRE_DESC: "Usa les transferències sense fils de Calibre" STR_CALIBRE_DESC: "Usa les transferències sense fils de Calibre"
STR_FORGET_AND_REMOVE: "Voleu suprimir la contrasenya desada?" STR_FORGET_AND_REMOVE: "Voleu suprimir la contrasenya desada?"
+1
View File
@@ -215,6 +215,7 @@ STR_REMAP_FRONT_BUTTONS: "Přemapovat přední tlačítka"
STR_OPDS_BROWSER: "Prohlížeč OPDS" STR_OPDS_BROWSER: "Prohlížeč OPDS"
STR_COVER_CUSTOM: "Obálka + Vlastní" STR_COVER_CUSTOM: "Obálka + Vlastní"
STR_MENU_RECENT_BOOKS: "Nedávné knihy" STR_MENU_RECENT_BOOKS: "Nedávné knihy"
STR_REMOVE_FROM_RECENTS: "Odebrat z nedávných knih?"
STR_NO_RECENT_BOOKS: "Žádné nedávné knihy" STR_NO_RECENT_BOOKS: "Žádné nedávné knihy"
STR_CALIBRE_DESC: "Používat přenosy bezdrátových zařízení Calibre" STR_CALIBRE_DESC: "Používat přenosy bezdrátových zařízení Calibre"
STR_FORGET_AND_REMOVE: "Zapomenout síť a odstranit uložené heslo?" STR_FORGET_AND_REMOVE: "Zapomenout síť a odstranit uložené heslo?"
+1
View File
@@ -237,6 +237,7 @@ STR_REMAP_FRONT_BUTTONS: "Omtildel frontknapper"
STR_OPDS_BROWSER: "OPDS Browser" STR_OPDS_BROWSER: "OPDS Browser"
STR_COVER_CUSTOM: "Omslag + Brugerdefineret" STR_COVER_CUSTOM: "Omslag + Brugerdefineret"
STR_MENU_RECENT_BOOKS: "Seneste bøger" STR_MENU_RECENT_BOOKS: "Seneste bøger"
STR_REMOVE_FROM_RECENTS: "Fjern fra Seneste bøger?"
STR_NO_RECENT_BOOKS: "Ingen seneste bøger" STR_NO_RECENT_BOOKS: "Ingen seneste bøger"
STR_CALIBRE_DESC: "Brug Calibre trådløs enhedsoverførelse" STR_CALIBRE_DESC: "Brug Calibre trådløs enhedsoverførelse"
STR_FORGET_AND_REMOVE: "Glem netværk og fjern gemt adgangskode?" STR_FORGET_AND_REMOVE: "Glem netværk og fjern gemt adgangskode?"
+1
View File
@@ -237,6 +237,7 @@ STR_REMAP_FRONT_BUTTONS: "Knoppen voorzijde wijzigen"
STR_OPDS_BROWSER: "OPDS-browser" STR_OPDS_BROWSER: "OPDS-browser"
STR_COVER_CUSTOM: "Omslag + Aangepast" STR_COVER_CUSTOM: "Omslag + Aangepast"
STR_MENU_RECENT_BOOKS: "Recente boeken" STR_MENU_RECENT_BOOKS: "Recente boeken"
STR_REMOVE_FROM_RECENTS: "Verwijderen uit Recente boeken?"
STR_NO_RECENT_BOOKS: "Geen recente boeken" STR_NO_RECENT_BOOKS: "Geen recente boeken"
STR_CALIBRE_DESC: "Gebruik Calibre draadloze overdracht" STR_CALIBRE_DESC: "Gebruik Calibre draadloze overdracht"
STR_FORGET_AND_REMOVE: "Netwerk vergeten en wachtwoord verwijderen?" STR_FORGET_AND_REMOVE: "Netwerk vergeten en wachtwoord verwijderen?"
+1
View File
@@ -261,6 +261,7 @@ STR_OPDS_BROWSER: "OPDS Browser"
STR_SEARCH: "Search" STR_SEARCH: "Search"
STR_COVER_CUSTOM: "Cover + Custom" STR_COVER_CUSTOM: "Cover + Custom"
STR_MENU_RECENT_BOOKS: "Recent Books" STR_MENU_RECENT_BOOKS: "Recent Books"
STR_REMOVE_FROM_RECENTS: "Remove from Recent Books?"
STR_NO_RECENT_BOOKS: "No recent books" STR_NO_RECENT_BOOKS: "No recent books"
STR_CALIBRE_DESC: "Use Calibre wireless device transfers" STR_CALIBRE_DESC: "Use Calibre wireless device transfers"
STR_FORGET_AND_REMOVE: "Forget network and remove saved password?" STR_FORGET_AND_REMOVE: "Forget network and remove saved password?"
+1
View File
@@ -214,6 +214,7 @@ STR_REMAP_FRONT_BUTTONS: "Uudelleenmääritä etupainikkeet"
STR_OPDS_BROWSER: "OPDS-selain" STR_OPDS_BROWSER: "OPDS-selain"
STR_COVER_CUSTOM: "Kansi + mukautettu" STR_COVER_CUSTOM: "Kansi + mukautettu"
STR_MENU_RECENT_BOOKS: "Viimeisimmät kirjat" STR_MENU_RECENT_BOOKS: "Viimeisimmät kirjat"
STR_REMOVE_FROM_RECENTS: "Poista viimeisimmistä kirjoista?"
STR_NO_RECENT_BOOKS: "Ei viimeisimpiä kirjoja" STR_NO_RECENT_BOOKS: "Ei viimeisimpiä kirjoja"
STR_CALIBRE_DESC: "Käytä Calibren langatonta laiteyhteyttä" STR_CALIBRE_DESC: "Käytä Calibren langatonta laiteyhteyttä"
STR_FORGET_AND_REMOVE: "Unohda verkko ja poista tallennettu salasana?" STR_FORGET_AND_REMOVE: "Unohda verkko ja poista tallennettu salasana?"
+1
View File
@@ -238,6 +238,7 @@ STR_REMAP_FRONT_BUTTONS: "Configurer boutons façade"
STR_OPDS_BROWSER: "Navigateur OPDS" STR_OPDS_BROWSER: "Navigateur OPDS"
STR_COVER_CUSTOM: "Couverture + Perso" STR_COVER_CUSTOM: "Couverture + Perso"
STR_MENU_RECENT_BOOKS: "Livres récents" STR_MENU_RECENT_BOOKS: "Livres récents"
STR_REMOVE_FROM_RECENTS: "Retirer des Livres récents ?"
STR_NO_RECENT_BOOKS: "Aucun livre récent" STR_NO_RECENT_BOOKS: "Aucun livre récent"
STR_CALIBRE_DESC: "Utiliser transfert sans fil Calibre" STR_CALIBRE_DESC: "Utiliser transfert sans fil Calibre"
STR_FORGET_AND_REMOVE: "Oublier le réseau et le mot de passe ?" STR_FORGET_AND_REMOVE: "Oublier le réseau et le mot de passe ?"
+1
View File
@@ -236,6 +236,7 @@ STR_REMAP_FRONT_BUTTONS: "Vordere Tasten belegen"
STR_OPDS_BROWSER: "OPDS-Browser" STR_OPDS_BROWSER: "OPDS-Browser"
STR_COVER_CUSTOM: "Umschlag + Eigenes" STR_COVER_CUSTOM: "Umschlag + Eigenes"
STR_MENU_RECENT_BOOKS: "Zuletzt gelesen" STR_MENU_RECENT_BOOKS: "Zuletzt gelesen"
STR_REMOVE_FROM_RECENTS: "Aus Zuletzt gelesen entfernen?"
STR_NO_RECENT_BOOKS: "Keine Bücher" STR_NO_RECENT_BOOKS: "Keine Bücher"
STR_CALIBRE_DESC: "Calibre-Übertragung (WLAN)" STR_CALIBRE_DESC: "Calibre-Übertragung (WLAN)"
STR_FORGET_AND_REMOVE: "WLAN entfernen & Passwort löschen?" STR_FORGET_AND_REMOVE: "WLAN entfernen & Passwort löschen?"
+1
View File
@@ -234,6 +234,7 @@ STR_REMAP_FRONT_BUTTONS: "Elülső gombok átállítása"
STR_OPDS_BROWSER: "OPDS böngésző" STR_OPDS_BROWSER: "OPDS böngésző"
STR_COVER_CUSTOM: "Borító + Egyéni" STR_COVER_CUSTOM: "Borító + Egyéni"
STR_MENU_RECENT_BOOKS: "Legutóbbi könyvek" STR_MENU_RECENT_BOOKS: "Legutóbbi könyvek"
STR_REMOVE_FROM_RECENTS: "Eltávolítás a legutóbbi könyvek közül?"
STR_NO_RECENT_BOOKS: "Nincsenek legutóbbi könyvek" STR_NO_RECENT_BOOKS: "Nincsenek legutóbbi könyvek"
STR_CALIBRE_DESC: "Calibre wireless eszköz átvitel használata" STR_CALIBRE_DESC: "Calibre wireless eszköz átvitel használata"
STR_FORGET_AND_REMOVE: "Hálózat elfelejtése és mentett jelszó törlése?" STR_FORGET_AND_REMOVE: "Hálózat elfelejtése és mentett jelszó törlése?"
+1
View File
@@ -246,6 +246,7 @@ STR_OPDS_BROWSER: "Browser OPDS"
STR_SEARCH: "Cerca" STR_SEARCH: "Cerca"
STR_COVER_CUSTOM: "Copertina + Wallpaper" STR_COVER_CUSTOM: "Copertina + Wallpaper"
STR_MENU_RECENT_BOOKS: "Libri recenti" STR_MENU_RECENT_BOOKS: "Libri recenti"
STR_REMOVE_FROM_RECENTS: "Rimuovere da Libri recenti?"
STR_NO_RECENT_BOOKS: "Nessun libro recente" STR_NO_RECENT_BOOKS: "Nessun libro recente"
STR_CALIBRE_DESC: "Trasferimento wireless con Calibre" STR_CALIBRE_DESC: "Trasferimento wireless con Calibre"
STR_FORGET_AND_REMOVE: "Eliminare la rete e la password salvata?" STR_FORGET_AND_REMOVE: "Eliminare la rete e la password salvata?"
+1
View File
@@ -210,6 +210,7 @@ STR_REMAP_FRONT_BUTTONS: "Алдыңғы түймелерді қайта бап
STR_OPDS_BROWSER: "OPDS шолғышы" STR_OPDS_BROWSER: "OPDS шолғышы"
STR_COVER_CUSTOM: "Мұқаба + Өзгертілген" STR_COVER_CUSTOM: "Мұқаба + Өзгертілген"
STR_MENU_RECENT_BOOKS: "Жуырда оқылған кітаптар" STR_MENU_RECENT_BOOKS: "Жуырда оқылған кітаптар"
STR_REMOVE_FROM_RECENTS: "Жуырда оқылған кітаптардан жою?"
STR_NO_RECENT_BOOKS: "Жуырда оқылған кітаптар жоқ" STR_NO_RECENT_BOOKS: "Жуырда оқылған кітаптар жоқ"
STR_CALIBRE_DESC: "Calibre сымсыз тасымалдауын пайдалану" STR_CALIBRE_DESC: "Calibre сымсыз тасымалдауын пайдалану"
STR_FORGET_AND_REMOVE: "Желіні ұмыту және сақталған құпия сөзді жою керек пе?" STR_FORGET_AND_REMOVE: "Желіні ұмыту және сақталған құпия сөзді жою керек пе?"
+1
View File
@@ -234,6 +234,7 @@ STR_REMAP_FRONT_BUTTONS: "Keisti mygtukus"
STR_OPDS_BROWSER: "OPDS naršyklė" STR_OPDS_BROWSER: "OPDS naršyklė"
STR_COVER_CUSTOM: "Viršelis + Kita" STR_COVER_CUSTOM: "Viršelis + Kita"
STR_MENU_RECENT_BOOKS: "Paskutinės" STR_MENU_RECENT_BOOKS: "Paskutinės"
STR_REMOVE_FROM_RECENTS: "Pašalinti iš paskutinių?"
STR_NO_RECENT_BOOKS: "Paskutinių nėra" STR_NO_RECENT_BOOKS: "Paskutinių nėra"
STR_CALIBRE_DESC: "Calibre belaidis ryšys" STR_CALIBRE_DESC: "Calibre belaidis ryšys"
STR_FORGET_AND_REMOVE: "Pamiršti tinklą?" STR_FORGET_AND_REMOVE: "Pamiršti tinklą?"
+1
View File
@@ -246,6 +246,7 @@ STR_OPDS_BROWSER: "OPDS Browser"
STR_SEARCH: "Szukaj" STR_SEARCH: "Szukaj"
STR_COVER_CUSTOM: "Okładka + Własne" STR_COVER_CUSTOM: "Okładka + Własne"
STR_MENU_RECENT_BOOKS: "Ostatnio czytane" STR_MENU_RECENT_BOOKS: "Ostatnio czytane"
STR_REMOVE_FROM_RECENTS: "Usunąć z ostatnio czytanych?"
STR_NO_RECENT_BOOKS: "Brak ostatnio czytanych" STR_NO_RECENT_BOOKS: "Brak ostatnio czytanych"
STR_CALIBRE_DESC: "Przesyłaj bezprzewodowo do Calibre" STR_CALIBRE_DESC: "Przesyłaj bezprzewodowo do Calibre"
STR_FORGET_AND_REMOVE: "Zapomnieć zapisane sieci oraz hasła?" STR_FORGET_AND_REMOVE: "Zapomnieć zapisane sieci oraz hasła?"
+1
View File
@@ -215,6 +215,7 @@ STR_REMAP_FRONT_BUTTONS: "Remapear botões frontais"
STR_OPDS_BROWSER: "Navegador OPDS" STR_OPDS_BROWSER: "Navegador OPDS"
STR_COVER_CUSTOM: "Capa + personalizado" STR_COVER_CUSTOM: "Capa + personalizado"
STR_MENU_RECENT_BOOKS: "Livros recentes" STR_MENU_RECENT_BOOKS: "Livros recentes"
STR_REMOVE_FROM_RECENTS: "Remover dos Livros recentes?"
STR_NO_RECENT_BOOKS: "Sem livros recentes" STR_NO_RECENT_BOOKS: "Sem livros recentes"
STR_CALIBRE_DESC: "Usar transferências sem fio Calibre" STR_CALIBRE_DESC: "Usar transferências sem fio Calibre"
STR_FORGET_AND_REMOVE: "Esquecer a rede e remover a senha salva?" STR_FORGET_AND_REMOVE: "Esquecer a rede e remover a senha salva?"
+1
View File
@@ -237,6 +237,7 @@ STR_REMAP_FRONT_BUTTONS: "Remapare butoane frontale"
STR_OPDS_BROWSER: "Browser OPDS" STR_OPDS_BROWSER: "Browser OPDS"
STR_COVER_CUSTOM: "Copertă + Personalizat" STR_COVER_CUSTOM: "Copertă + Personalizat"
STR_MENU_RECENT_BOOKS: "Cărţi recente" STR_MENU_RECENT_BOOKS: "Cărţi recente"
STR_REMOVE_FROM_RECENTS: "Eliminați din Cărţi recente?"
STR_NO_RECENT_BOOKS: "Nicio carte recentă" STR_NO_RECENT_BOOKS: "Nicio carte recentă"
STR_CALIBRE_DESC: "Utilizaţi transferurile wireless ale dispozitivului Calibre" STR_CALIBRE_DESC: "Utilizaţi transferurile wireless ale dispozitivului Calibre"
STR_FORGET_AND_REMOVE: "Uitaţi reţeaua şi eliminaţi parola salvată?" STR_FORGET_AND_REMOVE: "Uitaţi reţeaua şi eliminaţi parola salvată?"
+1
View File
@@ -246,6 +246,7 @@ STR_OPDS_BROWSER: "OPDS браузер"
STR_SEARCH: "Поиск" STR_SEARCH: "Поиск"
STR_COVER_CUSTOM: "Обложка + Свой" STR_COVER_CUSTOM: "Обложка + Свой"
STR_MENU_RECENT_BOOKS: "Недавние книги" STR_MENU_RECENT_BOOKS: "Недавние книги"
STR_REMOVE_FROM_RECENTS: "Удалить из недавних книг?"
STR_NO_RECENT_BOOKS: "Нет недавних книг" STR_NO_RECENT_BOOKS: "Нет недавних книг"
STR_CALIBRE_DESC: "Использовать беспроводную передачу Calibre" STR_CALIBRE_DESC: "Использовать беспроводную передачу Calibre"
STR_FORGET_AND_REMOVE: "Забыть сеть и удалить сохранённый пароль?" STR_FORGET_AND_REMOVE: "Забыть сеть и удалить сохранённый пароль?"
+1
View File
@@ -234,6 +234,7 @@ STR_REMAP_FRONT_BUTTONS: "Prenastavi sprednje gumbe"
STR_OPDS_BROWSER: "OPDS brskalnik" STR_OPDS_BROWSER: "OPDS brskalnik"
STR_COVER_CUSTOM: "Naslovnica + po meri" STR_COVER_CUSTOM: "Naslovnica + po meri"
STR_MENU_RECENT_BOOKS: "Zadnje knjige" STR_MENU_RECENT_BOOKS: "Zadnje knjige"
STR_REMOVE_FROM_RECENTS: "Odstrani iz zadnjih knjig?"
STR_NO_RECENT_BOOKS: "Ni zadnjih knjig" STR_NO_RECENT_BOOKS: "Ni zadnjih knjig"
STR_CALIBRE_DESC: "Uporabi brezžični prenos Calibre" STR_CALIBRE_DESC: "Uporabi brezžični prenos Calibre"
STR_FORGET_AND_REMOVE: "Pozabi omrežje in odstrani shranjeno geslo?" STR_FORGET_AND_REMOVE: "Pozabi omrežje in odstrani shranjeno geslo?"
+1
View File
@@ -246,6 +246,7 @@ STR_OPDS_BROWSER: "Navegador OPDS"
STR_SEARCH: "Buscar" STR_SEARCH: "Buscar"
STR_COVER_CUSTOM: "Portada + Pers." STR_COVER_CUSTOM: "Portada + Pers."
STR_MENU_RECENT_BOOKS: "Libros recientes" STR_MENU_RECENT_BOOKS: "Libros recientes"
STR_REMOVE_FROM_RECENTS: "¿Eliminar de Libros recientes?"
STR_NO_RECENT_BOOKS: "No hay libros recientes" STR_NO_RECENT_BOOKS: "No hay libros recientes"
STR_CALIBRE_DESC: "Transferir contenido a este dispositivo" STR_CALIBRE_DESC: "Transferir contenido a este dispositivo"
STR_FORGET_AND_REMOVE: "¿Desea olvidar la red y la contraseña guardada?" STR_FORGET_AND_REMOVE: "¿Desea olvidar la red y la contraseña guardada?"
+1
View File
@@ -246,6 +246,7 @@ STR_OPDS_BROWSER: "OPDS-webbläsare"
STR_SEARCH: "Sök" STR_SEARCH: "Sök"
STR_COVER_CUSTOM: "Omslag + Valfri" STR_COVER_CUSTOM: "Omslag + Valfri"
STR_MENU_RECENT_BOOKS: "Senaste böckerna" STR_MENU_RECENT_BOOKS: "Senaste böckerna"
STR_REMOVE_FROM_RECENTS: "Ta bort från Senaste böckerna?"
STR_NO_RECENT_BOOKS: "Inga senaste böcker" STR_NO_RECENT_BOOKS: "Inga senaste böcker"
STR_CALIBRE_DESC: "Använd Calibres trådlösa enhetsöverföring" STR_CALIBRE_DESC: "Använd Calibres trådlösa enhetsöverföring"
STR_FORGET_AND_REMOVE: "Glöm nätverk och ta bort sparat lösenord?" STR_FORGET_AND_REMOVE: "Glöm nätverk och ta bort sparat lösenord?"
+1
View File
@@ -214,6 +214,7 @@ STR_REMAP_FRONT_BUTTONS: "Ön Tuşları Yeniden Ata"
STR_OPDS_BROWSER: "OPDS Tarayıcı" STR_OPDS_BROWSER: "OPDS Tarayıcı"
STR_COVER_CUSTOM: "Kapak + Özel" STR_COVER_CUSTOM: "Kapak + Özel"
STR_MENU_RECENT_BOOKS: "Son Kitaplar" STR_MENU_RECENT_BOOKS: "Son Kitaplar"
STR_REMOVE_FROM_RECENTS: "Son Kitaplar listesinden kaldırılsın mı?"
STR_NO_RECENT_BOOKS: "Son okunan kitap yok" STR_NO_RECENT_BOOKS: "Son okunan kitap yok"
STR_CALIBRE_DESC: "Calibre kablosuz cihaz transferini kullan" STR_CALIBRE_DESC: "Calibre kablosuz cihaz transferini kullan"
STR_FORGET_AND_REMOVE: "Ağı unut ve kayıtlı şifreyi sil?" STR_FORGET_AND_REMOVE: "Ağı unut ve kayıtlı şifreyi sil?"
+1
View File
@@ -246,6 +246,7 @@ STR_OPDS_BROWSER: "Браузер OPDS"
STR_SEARCH: "Пошук" STR_SEARCH: "Пошук"
STR_COVER_CUSTOM: "Обкл. + власне" STR_COVER_CUSTOM: "Обкл. + власне"
STR_MENU_RECENT_BOOKS: "Останні книги" STR_MENU_RECENT_BOOKS: "Останні книги"
STR_REMOVE_FROM_RECENTS: "Видалити з останніх книг?"
STR_NO_RECENT_BOOKS: "Немає останніх книг" STR_NO_RECENT_BOOKS: "Немає останніх книг"
STR_CALIBRE_DESC: "Бездротова передача на пристрій із Calibre" STR_CALIBRE_DESC: "Бездротова передача на пристрій із Calibre"
STR_FORGET_AND_REMOVE: "Забути мережу та видалити збережений пароль?" STR_FORGET_AND_REMOVE: "Забути мережу та видалити збережений пароль?"
+1 -2
View File
@@ -9,6 +9,7 @@
#include <Xtc.h> #include <Xtc.h>
#include <algorithm> #include <algorithm>
#include <iterator>
namespace { namespace {
constexpr uint8_t RECENT_BOOKS_FILE_VERSION = 3; constexpr uint8_t RECENT_BOOKS_FILE_VERSION = 3;
@@ -64,8 +65,6 @@ bool RecentBooksStore::removeByPath(const std::string& path) {
} }
recentBooks.erase(it); recentBooks.erase(it);
if (!saveToFile()) { 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()); LOG_ERR("RBS", "Failed to persist removal of recent book: %s", path.c_str());
} }
return true; return true;
+1 -1
View File
@@ -37,7 +37,7 @@ class RecentBooksStore {
void updateBook(const std::string& path, const std::string& title, const std::string& author, void updateBook(const std::string& path, const std::string& title, const std::string& author,
const std::string& coverBmpPath); const std::string& coverBmpPath);
// Remove the entry whose path matches (used when a book is finished/read). // Remove the entry whose path matches (used when a book is removed from recents or finished/read).
// Returns true if an entry was found and removed (no-op + false otherwise). // 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. // Persistence is best-effort: a failed save is logged, not reflected in the return.
bool removeByPath(const std::string& path); bool removeByPath(const std::string& path);
+46 -1
View File
@@ -5,14 +5,17 @@
#include <I18n.h> #include <I18n.h>
#include <algorithm> #include <algorithm>
#include <memory>
#include "MappedInputManager.h" #include "MappedInputManager.h"
#include "RecentBooksStore.h" #include "RecentBooksStore.h"
#include "activities/util/ConfirmationActivity.h"
#include "components/UITheme.h" #include "components/UITheme.h"
#include "fontIds.h" #include "fontIds.h"
namespace { namespace {
constexpr unsigned long GO_HOME_MS = 1000; // Hold threshold for the long-press "remove from list" action (firmware convention).
constexpr unsigned long LONG_PRESS_MS = 1000;
} // namespace } // namespace
void RecentBooksActivity::loadRecentBooks() { recentBooks = RECENT_BOOKS.getBooks(); } void RecentBooksActivity::loadRecentBooks() { recentBooks = RECENT_BOOKS.getBooks(); }
@@ -41,6 +44,25 @@ void RecentBooksActivity::onExit() {
void RecentBooksActivity::loop() { void RecentBooksActivity::loop() {
const int pageItems = UITheme::getInstance().getNumberOfItemsPerPage(renderer, true, false, true, true); const int pageItems = UITheme::getInstance().getNumberOfItemsPerPage(renderer, true, false, true, true);
// After a long-press has fired, swallow input until Confirm is physically released
// (so the release doesn't also open the book; re-arm only once the button is up).
if (longPressFired) {
if (!mappedInput.isPressed(MappedInputManager::Button::Confirm)) {
longPressFired = false;
}
return;
}
// Long-press Confirm on the selected book: prompt to remove it from the list.
// Fires when the hold times out while still held (firmware hold-to-act pattern,
// cf. FileBrowserActivity BACK long-press).
if (!recentBooks.empty() && selectorIndex < recentBooks.size() &&
mappedInput.isPressed(MappedInputManager::Button::Confirm) && mappedInput.getHeldTime() >= LONG_PRESS_MS) {
longPressFired = true;
promptRemoveBook(recentBooks[selectorIndex].path, recentBooks[selectorIndex].title);
return;
}
if (mappedInput.wasReleased(MappedInputManager::Button::Confirm)) { if (mappedInput.wasReleased(MappedInputManager::Button::Confirm)) {
if (!recentBooks.empty() && selectorIndex < static_cast<int>(recentBooks.size())) { if (!recentBooks.empty() && selectorIndex < static_cast<int>(recentBooks.size())) {
LOG_DBG("RBA", "Selected recent book: %s", recentBooks[selectorIndex].path.c_str()); LOG_DBG("RBA", "Selected recent book: %s", recentBooks[selectorIndex].path.c_str());
@@ -76,6 +98,29 @@ void RecentBooksActivity::loop() {
}); });
} }
void RecentBooksActivity::promptRemoveBook(const std::string& path, const std::string& title) {
auto handler = [this, path](const ActivityResult& res) {
if (res.isCancelled) {
LOG_DBG("RBA", "Remove from recents cancelled");
return;
}
if (RECENT_BOOKS.removeByPath(path)) {
LOG_DBG("RBA", "Removed from recents: %s", path.c_str());
loadRecentBooks();
if (recentBooks.empty()) {
selectorIndex = 0;
} else if (selectorIndex >= recentBooks.size()) {
selectorIndex = recentBooks.size() - 1;
}
requestUpdate(true);
}
};
startActivityForResult(
std::make_unique<ConfirmationActivity>(renderer, mappedInput, tr(STR_REMOVE_FROM_RECENTS), title),
std::move(handler));
}
void RecentBooksActivity::render(RenderLock&&) { void RecentBooksActivity::render(RenderLock&&) {
renderer.clearScreen(); renderer.clearScreen();
@@ -15,12 +15,19 @@ class RecentBooksActivity final : public Activity {
size_t selectorIndex = 0; size_t selectorIndex = 0;
// Set when a long-press has fired; input is swallowed until Confirm is released
// again so the release doesn't also open the book.
bool longPressFired = false;
// Recent tab state // Recent tab state
std::vector<RecentBook> recentBooks; std::vector<RecentBook> recentBooks;
// Data loading // Data loading
void loadRecentBooks(); void loadRecentBooks();
// Show an OK/Cancel prompt to remove the given book from the Recent Books list.
void promptRemoveBook(const std::string& path, const std::string& title);
public: public:
explicit RecentBooksActivity(GfxRenderer& renderer, MappedInputManager& mappedInput) explicit RecentBooksActivity(GfxRenderer& renderer, MappedInputManager& mappedInput)
: Activity("RecentBooks", renderer, mappedInput) {} : Activity("RecentBooks", renderer, mappedInput) {}