35 lines
2.8 KiB
Markdown
35 lines
2.8 KiB
Markdown
|
|
# Per-book Letterbox Fill Override
|
||
|
|
|
||
|
|
**Date:** 2026-02-13
|
||
|
|
**Branch:** mod/fix-edge-fills
|
||
|
|
|
||
|
|
## Task
|
||
|
|
|
||
|
|
Add the ability to override the sleep cover "letterbox fill mode" on a per-book basis (EPUB only for the menu UI; all book types respected at sleep time).
|
||
|
|
|
||
|
|
## Changes Made
|
||
|
|
|
||
|
|
### New files
|
||
|
|
- `src/util/BookSettings.h` / `src/util/BookSettings.cpp` — Lightweight per-book settings utility. Stores a `letterboxFillOverride` field (0xFF = use global default) in `{cachePath}/book_settings.bin`. Versioned binary format with field count for forward compatibility, matching the pattern used by BookmarkStore and CrossPointSettings.
|
||
|
|
|
||
|
|
### Modified files
|
||
|
|
- `src/activities/reader/EpubReaderMenuActivity.h` — Added `LETTERBOX_FILL` to the `MenuAction` enum. Added `bookCachePath`, `pendingLetterboxFill`, letterbox fill labels, and helper methods (`letterboxFillToIndex`, `indexToLetterboxFill`, `saveLetterboxFill`). Constructor now accepts a `bookCachePath` parameter and loads the current per-book settings.
|
||
|
|
- `src/activities/reader/EpubReaderMenuActivity.cpp` — Handle `LETTERBOX_FILL` action: cycles through Default/Dithered/Solid/None on Confirm (handled locally like `ROTATE_SCREEN`), saves immediately. Renders the current value on the right side of the menu item.
|
||
|
|
- `src/activities/reader/EpubReaderActivity.cpp` — Passes `epub->getCachePath()` to the menu activity constructor. Added `ROTATE_SCREEN` and `LETTERBOX_FILL` to the `onReaderMenuConfirm` switch as no-ops to prevent compiler warnings.
|
||
|
|
- `src/activities/boot_sleep/SleepActivity.h` — Added `fillModeOverride` parameter to `renderBitmapSleepScreen()`.
|
||
|
|
- `src/activities/boot_sleep/SleepActivity.cpp` — `renderCoverSleepScreen()` now loads `BookSettings` from the book's cache path after determining the book type. Passes the per-book override to `renderBitmapSleepScreen()`. `renderBitmapSleepScreen()` uses the override if valid, otherwise falls back to the global `SETTINGS.sleepScreenLetterboxFill`.
|
||
|
|
|
||
|
|
## How It Works
|
||
|
|
|
||
|
|
1. User opens the EPUB reader menu (Confirm button while reading).
|
||
|
|
2. "Letterbox Fill" appears between "Reading Orientation" and "Table of Contents".
|
||
|
|
3. Pressing Confirm cycles: Default → Dithered → Solid → None → Default...
|
||
|
|
4. The selection is persisted immediately to `book_settings.bin` in the book's cache directory.
|
||
|
|
5. When the device enters sleep with the cover screen, the per-book override is loaded and used instead of the global setting (if set).
|
||
|
|
6. XTC and TXT books also have their per-book override checked at sleep time, but can only be configured for EPUB via the reader menu (XTC/TXT lack general menus).
|
||
|
|
|
||
|
|
## Follow-up Items
|
||
|
|
|
||
|
|
- Consider adding the letterbox fill override to XTC/TXT reader menus if those get general menus in the future.
|
||
|
|
- The `BookSettings` struct is extensible — other per-book overrides can be added by appending fields and incrementing `BOOK_SETTINGS_COUNT`.
|