From d89b37cd10b1e7aca5172fbd2a523465a70a91b7 Mon Sep 17 00:00:00 2001 From: pablohc Date: Thu, 29 Jan 2026 03:35:09 +0100 Subject: [PATCH] refactor: Unify sleep screen settings and simplify UI - Merge SLEEP_SCREEN_COVER_MODE into SLEEP_SCREEN_MODE with new values: * DARK -> LOGO * COVER -> COVER_CROP and COVER_FIT - Rename SLEEP_SCREEN_COVER_FILTER to SLEEP_SCREEN_FILTER: * INVERTED_BLACK_AND_WHITE -> NEGATIVE * BLACK_AND_WHITE -> CONTRAST * NO_FILTER -> NONE - Update UI labels to reflect new structure - Remove deprecated SLEEP_SCREEN_COVER_MODE setting - LOGO, CUSTOM, COVER_CROP and COVER_FIT now support Original and Negative filters - Only CUSTOM, COVER_CROP and COVER_FIT modes support Contrast filter --- src/CrossPointSettings.cpp | 11 ++++------ src/CrossPointSettings.h | 21 +++++++++----------- src/activities/boot_sleep/SleepActivity.cpp | 21 ++++++++++---------- src/activities/settings/SettingsActivity.cpp | 9 ++++----- 4 files changed, 28 insertions(+), 34 deletions(-) diff --git a/src/CrossPointSettings.cpp b/src/CrossPointSettings.cpp index 232c7c57..a98aa9ab 100644 --- a/src/CrossPointSettings.cpp +++ b/src/CrossPointSettings.cpp @@ -37,7 +37,7 @@ bool CrossPointSettings::saveToFile() const { serialization::writePod(outputFile, SETTINGS_FILE_VERSION); serialization::writePod(outputFile, SETTINGS_COUNT); - serialization::writePod(outputFile, sleepScreen); + serialization::writePod(outputFile, sleepScreenMode); serialization::writePod(outputFile, extraParagraphSpacing); serialization::writePod(outputFile, shortPwrBtn); serialization::writePod(outputFile, statusBar); @@ -51,7 +51,6 @@ bool CrossPointSettings::saveToFile() const { serialization::writePod(outputFile, sleepTimeout); serialization::writePod(outputFile, refreshFrequency); serialization::writePod(outputFile, screenMargin); - serialization::writePod(outputFile, sleepScreenCoverMode); serialization::writeString(outputFile, std::string(opdsServerUrl)); serialization::writePod(outputFile, textAntiAliasing); serialization::writePod(outputFile, hideBatteryPercentage); @@ -59,7 +58,7 @@ bool CrossPointSettings::saveToFile() const { serialization::writePod(outputFile, hyphenationEnabled); serialization::writeString(outputFile, std::string(opdsUsername)); serialization::writeString(outputFile, std::string(opdsPassword)); - serialization::writePod(outputFile, sleepScreenCoverFilter); + serialization::writePod(outputFile, sleepScreenFilter); // New fields added at end for backward compatibility outputFile.close(); @@ -87,7 +86,7 @@ bool CrossPointSettings::loadFromFile() { // load settings that exist (support older files with fewer fields) uint8_t settingsRead = 0; do { - readAndValidate(inputFile, sleepScreen, SLEEP_SCREEN_MODE_COUNT); + readAndValidate(inputFile, sleepScreenMode, SLEEP_SCREEN_MODE_COUNT); if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, extraParagraphSpacing); if (++settingsRead >= fileSettingsCount) break; @@ -115,8 +114,6 @@ bool CrossPointSettings::loadFromFile() { if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, screenMargin); if (++settingsRead >= fileSettingsCount) break; - readAndValidate(inputFile, sleepScreenCoverMode, SLEEP_SCREEN_COVER_MODE_COUNT); - if (++settingsRead >= fileSettingsCount) break; { std::string urlStr; serialization::readString(inputFile, urlStr); @@ -146,7 +143,7 @@ bool CrossPointSettings::loadFromFile() { opdsPassword[sizeof(opdsPassword) - 1] = '\0'; } if (++settingsRead >= fileSettingsCount) break; - readAndValidate(inputFile, sleepScreenCoverFilter, SLEEP_SCREEN_COVER_FILTER_COUNT); + readAndValidate(inputFile, sleepScreenFilter, SLEEP_SCREEN_FILTER_COUNT); if (++settingsRead >= fileSettingsCount) break; // New fields added at end for backward compatibility } while (false); diff --git a/src/CrossPointSettings.h b/src/CrossPointSettings.h index c450d348..b9249e96 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -15,13 +15,12 @@ class CrossPointSettings { CrossPointSettings(const CrossPointSettings&) = delete; CrossPointSettings& operator=(const CrossPointSettings&) = delete; - enum SLEEP_SCREEN_MODE { DARK = 0, LIGHT = 1, CUSTOM = 2, COVER = 3, BLANK = 4, SLEEP_SCREEN_MODE_COUNT }; - enum SLEEP_SCREEN_COVER_MODE { FIT = 0, CROP = 1, SLEEP_SCREEN_COVER_MODE_COUNT }; - enum SLEEP_SCREEN_COVER_FILTER { - NO_FILTER = 0, - BLACK_AND_WHITE = 1, - INVERTED_BLACK_AND_WHITE = 2, - SLEEP_SCREEN_COVER_FILTER_COUNT + enum SLEEP_SCREEN_MODE { LOGO = 0, CUSTOM = 1, COVER_CROP = 2, COVER_FIT = 3, BLANK = 4, SLEEP_SCREEN_MODE_COUNT }; + enum SLEEP_SCREEN_FILTER { + ORIGINAL = 0, + CONTRAST = 1, + NEGATIVE = 2, + SLEEP_SCREEN_FILTER_COUNT }; // Status bar display type enum @@ -98,11 +97,9 @@ class CrossPointSettings { enum HIDE_BATTERY_PERCENTAGE { HIDE_NEVER = 0, HIDE_READER = 1, HIDE_ALWAYS = 2, HIDE_BATTERY_PERCENTAGE_COUNT }; // Sleep screen settings - uint8_t sleepScreen = DARK; - // Sleep screen cover mode settings - uint8_t sleepScreenCoverMode = FIT; - // Sleep screen cover filter - uint8_t sleepScreenCoverFilter = NO_FILTER; + uint8_t sleepScreenMode = LOGO; + // Sleep screen filter + uint8_t sleepScreenFilter = NONE; // Status bar settings uint8_t statusBar = FULL; // Text rendering settings diff --git a/src/activities/boot_sleep/SleepActivity.cpp b/src/activities/boot_sleep/SleepActivity.cpp index 95fe742f..2de14187 100644 --- a/src/activities/boot_sleep/SleepActivity.cpp +++ b/src/activities/boot_sleep/SleepActivity.cpp @@ -16,15 +16,16 @@ void SleepActivity::onEnter() { Activity::onEnter(); renderPopup("Entering Sleep..."); - if (SETTINGS.sleepScreen == CrossPointSettings::SLEEP_SCREEN_MODE::BLANK) { + if (SETTINGS.sleepScreenMode == CrossPointSettings::SLEEP_SCREEN_MODE::BLANK) { return renderBlankSleepScreen(); } - if (SETTINGS.sleepScreen == CrossPointSettings::SLEEP_SCREEN_MODE::CUSTOM) { + if (SETTINGS.sleepScreenMode == CrossPointSettings::SLEEP_SCREEN_MODE::CUSTOM) { return renderCustomSleepScreen(); } - if (SETTINGS.sleepScreen == CrossPointSettings::SLEEP_SCREEN_MODE::COVER) { + if (SETTINGS.sleepScreenMode == CrossPointSettings::SLEEP_SCREEN_MODE::COVER_CROP || + SETTINGS.sleepScreenMode == CrossPointSettings::SLEEP_SCREEN_MODE::COVER_FIT) { return renderCoverSleepScreen(); } @@ -128,8 +129,8 @@ void SleepActivity::renderDefaultSleepScreen() const { renderer.drawCenteredText(UI_10_FONT_ID, pageHeight / 2 + 70, "CrossPoint", true, EpdFontFamily::BOLD); renderer.drawCenteredText(SMALL_FONT_ID, pageHeight / 2 + 95, "SLEEPING"); - // Make sleep screen dark unless light is selected in settings - if (SETTINGS.sleepScreen != CrossPointSettings::SLEEP_SCREEN_MODE::LIGHT) { + // Make sleep screen negative + if (SETTINGS.sleepScreenFilter == CrossPointSettings::SLEEP_SCREEN_FILTER::NEGATIVE) { renderer.invertScreen(); } @@ -152,7 +153,7 @@ void SleepActivity::renderBitmapSleepScreen(const Bitmap& bitmap) const { Serial.printf("[%lu] [SLP] bitmap ratio: %f, screen ratio: %f\n", millis(), ratio, screenRatio); if (ratio > screenRatio) { // image wider than viewport ratio, scaled down image needs to be centered vertically - if (SETTINGS.sleepScreenCoverMode == CrossPointSettings::SLEEP_SCREEN_COVER_MODE::CROP) { + if (SETTINGS.sleepScreenMode == CrossPointSettings::SLEEP_SCREEN_MODE::COVER_CROP) { cropX = 1.0f - (screenRatio / ratio); Serial.printf("[%lu] [SLP] Cropping bitmap x: %f\n", millis(), cropX); ratio = (1.0f - cropX) * static_cast(bitmap.getWidth()) / static_cast(bitmap.getHeight()); @@ -162,7 +163,7 @@ void SleepActivity::renderBitmapSleepScreen(const Bitmap& bitmap) const { Serial.printf("[%lu] [SLP] Centering with ratio %f to y=%d\n", millis(), ratio, y); } else { // image taller than viewport ratio, scaled down image needs to be centered horizontally - if (SETTINGS.sleepScreenCoverMode == CrossPointSettings::SLEEP_SCREEN_COVER_MODE::CROP) { + if (SETTINGS.sleepScreenMode == CrossPointSettings::SLEEP_SCREEN_MODE::COVER_CROP) { cropY = 1.0f - (ratio / screenRatio); Serial.printf("[%lu] [SLP] Cropping bitmap y: %f\n", millis(), cropY); ratio = static_cast(bitmap.getWidth()) / ((1.0f - cropY) * static_cast(bitmap.getHeight())); @@ -181,11 +182,11 @@ void SleepActivity::renderBitmapSleepScreen(const Bitmap& bitmap) const { renderer.clearScreen(); const bool hasGreyscale = bitmap.hasGreyscale() && - SETTINGS.sleepScreenCoverFilter == CrossPointSettings::SLEEP_SCREEN_COVER_FILTER::NO_FILTER; + SETTINGS.sleepScreenFilter == CrossPointSettings::SLEEP_SCREEN_FILTER::ORIGINAL; renderer.drawBitmap(bitmap, x, y, pageWidth, pageHeight, cropX, cropY); - if (SETTINGS.sleepScreenCoverFilter == CrossPointSettings::SLEEP_SCREEN_COVER_FILTER::INVERTED_BLACK_AND_WHITE) { + if (SETTINGS.sleepScreenFilter == CrossPointSettings::SLEEP_SCREEN_FILTER::NEGATIVE) { renderer.invertScreen(); } @@ -215,7 +216,7 @@ void SleepActivity::renderCoverSleepScreen() const { } std::string coverBmpPath; - bool cropped = SETTINGS.sleepScreenCoverMode == CrossPointSettings::SLEEP_SCREEN_COVER_MODE::CROP; + bool cropped = SETTINGS.sleepScreenMode == CrossPointSettings::SLEEP_SCREEN_MODE::COVER_CROP; // Check if the current book is XTC, TXT, or EPUB if (StringUtils::checkFileExtension(APP_STATE.openEpubPath, ".xtc") || diff --git a/src/activities/settings/SettingsActivity.cpp b/src/activities/settings/SettingsActivity.cpp index 7316db05..6436abef 100644 --- a/src/activities/settings/SettingsActivity.cpp +++ b/src/activities/settings/SettingsActivity.cpp @@ -11,13 +11,12 @@ const char* SettingsActivity::categoryNames[categoryCount] = {"Display", "Reader", "Controls", "System"}; namespace { -constexpr int displaySettingsCount = 6; +constexpr int displaySettingsCount = 5; const SettingInfo displaySettings[displaySettingsCount] = { // Should match with SLEEP_SCREEN_MODE - SettingInfo::Enum("Sleep Screen", &CrossPointSettings::sleepScreen, {"Dark", "Light", "Custom", "Cover", "None"}), - SettingInfo::Enum("Sleep Screen Cover Mode", &CrossPointSettings::sleepScreenCoverMode, {"Fit", "Crop"}), - SettingInfo::Enum("Sleep Screen Cover Filter", &CrossPointSettings::sleepScreenCoverFilter, - {"None", "Contrast", "Inverted"}), + SettingInfo::Enum("Sleep Screen", &CrossPointSettings::sleepScreenMode, {"Logo", "Custom", "Cover Crop", "Cover Fit", "None"}), + SettingInfo::Enum("Sleep Screen Filter", &CrossPointSettings::sleepScreenFilter, + {"None", "Contrast", "Negative"}), SettingInfo::Enum("Status Bar", &CrossPointSettings::statusBar, {"None", "No Progress", "Full w/ Percentage", "Full w/ Progress Bar", "Progress Bar"}), SettingInfo::Enum("Hide Battery %", &CrossPointSettings::hideBatteryPercentage, {"Never", "In Reader", "Always"}),