mirror of
https://github.com/daveallie/crosspoint-reader.git
synced 2026-02-04 14:47:37 +03:00
feat: add sleep screen selection
This commit is contained in:
parent
d4036bf1f7
commit
78ebcf7856
@ -24,6 +24,21 @@ constexpr uint8_t SETTINGS_FILE_VERSION = 1;
|
||||
// Increment this when adding new persisted settings fields
|
||||
constexpr uint8_t SETTINGS_COUNT = 24;
|
||||
constexpr char SETTINGS_FILE[] = "/.crosspoint/settings.bin";
|
||||
|
||||
const uint8_t SCREEN_MARGIN_PIXEL_VALUES[CrossPointSettings::SCREEN_MARGIN_COUNT] = {
|
||||
#define X(val, str) val,
|
||||
SCREEN_MARGIN_DATA
|
||||
#undef X
|
||||
};
|
||||
|
||||
int screenMarginPixelToIndex(uint8_t pixelValue) {
|
||||
for (size_t i = 0; i < CrossPointSettings::SCREEN_MARGIN_COUNT; i++) {
|
||||
if (SCREEN_MARGIN_PIXEL_VALUES[i] == pixelValue) {
|
||||
return static_cast<int>(i);
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
bool CrossPointSettings::saveToFile() const {
|
||||
@ -114,6 +129,11 @@ bool CrossPointSettings::loadFromFile() {
|
||||
readAndValidate(inputFile, refreshFrequency, REFRESH_FREQUENCY_COUNT);
|
||||
if (++settingsRead >= fileSettingsCount) break;
|
||||
serialization::readPod(inputFile, screenMargin);
|
||||
// Migrate old format: stored pixel value (5,10,15...) → index (0,1,2...)
|
||||
if (screenMargin >= SCREEN_MARGIN_COUNT) {
|
||||
const int idx = screenMarginPixelToIndex(screenMargin);
|
||||
screenMargin = (idx >= 0) ? static_cast<uint8_t>(idx) : 0;
|
||||
}
|
||||
if (++settingsRead >= fileSettingsCount) break;
|
||||
readAndValidate(inputFile, sleepScreenCoverMode, SLEEP_SCREEN_COVER_MODE_COUNT);
|
||||
if (++settingsRead >= fileSettingsCount) break;
|
||||
@ -326,12 +346,10 @@ const char* CrossPointSettings::getScreenMarginString(uint8_t index) {
|
||||
return SCREEN_MARGIN_OPTIONS[MARGIN_5];
|
||||
}
|
||||
|
||||
int CrossPointSettings::getScreenMarginIndex(uint8_t pixelValue) {
|
||||
for (size_t i = 0; i < SCREEN_MARGIN_COUNT; i++) {
|
||||
if (SCREEN_MARGIN_VALUES[i] == pixelValue) {
|
||||
return static_cast<int>(i);
|
||||
uint8_t CrossPointSettings::getScreenMarginPixels() const {
|
||||
if (screenMargin < SCREEN_MARGIN_COUNT) {
|
||||
return SCREEN_MARGIN_PIXEL_VALUES[screenMargin];
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
return SCREEN_MARGIN_PIXEL_VALUES[MARGIN_5];
|
||||
}
|
||||
|
||||
|
||||
@ -124,11 +124,6 @@ class CrossPointSettings {
|
||||
#undef X
|
||||
SCREEN_MARGIN_COUNT
|
||||
};
|
||||
static inline constexpr uint8_t SCREEN_MARGIN_VALUES[SCREEN_MARGIN_COUNT] = {
|
||||
#define X(val, str) val,
|
||||
SCREEN_MARGIN_DATA
|
||||
#undef X
|
||||
};
|
||||
|
||||
// Short power button press actions
|
||||
enum SHORT_PWRBTN { IGNORE = 0, SLEEP = 1, PAGE_TURN = 2, SHORT_PWRBTN_COUNT };
|
||||
@ -166,8 +161,8 @@ class CrossPointSettings {
|
||||
uint8_t refreshFrequency = REFRESH_15;
|
||||
uint8_t hyphenationEnabled = 0;
|
||||
|
||||
// Reader screen margin settings
|
||||
uint8_t screenMargin = 5;
|
||||
// Reader screen margin (enum index; use getScreenMarginPixels() for pixel value)
|
||||
uint8_t screenMargin = MARGIN_5;
|
||||
// OPDS browser settings
|
||||
char opdsServerUrl[128] = "";
|
||||
char opdsUsername[64] = "";
|
||||
@ -197,8 +192,8 @@ class CrossPointSettings {
|
||||
static const char* getSleepScreenString(uint8_t value);
|
||||
static const char* getSleepTimeoutString(uint8_t value);
|
||||
static const char* getScreenMarginString(uint8_t index);
|
||||
/** Returns index for pixel value, or -1 if not in allowed list. */
|
||||
static int getScreenMarginIndex(uint8_t pixelValue);
|
||||
/** Returns pixel margin for current screenMargin index (e.g. 5, 10, 15...). */
|
||||
uint8_t getScreenMarginPixels() const;
|
||||
|
||||
float getReaderLineCompression() const;
|
||||
unsigned long getSleepTimeoutMs() const;
|
||||
|
||||
@ -281,17 +281,17 @@ void EpubReaderActivity::renderScreen() {
|
||||
int orientedMarginTop, orientedMarginRight, orientedMarginBottom, orientedMarginLeft;
|
||||
renderer.getOrientedViewableTRBL(&orientedMarginTop, &orientedMarginRight, &orientedMarginBottom,
|
||||
&orientedMarginLeft);
|
||||
orientedMarginTop += SETTINGS.screenMargin;
|
||||
orientedMarginLeft += SETTINGS.screenMargin;
|
||||
orientedMarginRight += SETTINGS.screenMargin;
|
||||
orientedMarginBottom += SETTINGS.screenMargin;
|
||||
orientedMarginTop += SETTINGS.getScreenMarginPixels();
|
||||
orientedMarginLeft += SETTINGS.getScreenMarginPixels();
|
||||
orientedMarginRight += SETTINGS.getScreenMarginPixels();
|
||||
orientedMarginBottom += SETTINGS.getScreenMarginPixels();
|
||||
|
||||
// Add status bar margin
|
||||
if (SETTINGS.statusBar != CrossPointSettings::STATUS_BAR_MODE::NONE) {
|
||||
// Add additional margin for status bar if progress bar is shown
|
||||
const bool showProgressBar = SETTINGS.statusBar == CrossPointSettings::STATUS_BAR_MODE::FULL_WITH_PROGRESS_BAR ||
|
||||
SETTINGS.statusBar == CrossPointSettings::STATUS_BAR_MODE::ONLY_PROGRESS_BAR;
|
||||
orientedMarginBottom += statusBarMargin - SETTINGS.screenMargin +
|
||||
orientedMarginBottom += statusBarMargin - SETTINGS.getScreenMarginPixels() +
|
||||
(showProgressBar ? (ScreenComponents::BOOK_PROGRESS_BAR_HEIGHT + progressBarMarginTop) : 0);
|
||||
}
|
||||
|
||||
|
||||
@ -156,7 +156,7 @@ void TxtReaderActivity::initializeReader() {
|
||||
|
||||
// Store current settings for cache validation
|
||||
cachedFontId = SETTINGS.getReaderFontId();
|
||||
cachedScreenMargin = SETTINGS.screenMargin;
|
||||
cachedScreenMargin = SETTINGS.getScreenMarginPixels();
|
||||
cachedParagraphAlignment = SETTINGS.paragraphAlignment;
|
||||
|
||||
// Calculate viewport dimensions
|
||||
|
||||
@ -312,7 +312,7 @@ void CategorySettingsActivity::render() const {
|
||||
valueText = CrossPointSettings::getRefreshFrequencyString(SETTINGS.refreshFrequency);
|
||||
} else if (settingsList[i].type == SettingType::ACTION && strcmp(settingsList[i].name, "Screen Margin") == 0) {
|
||||
// Format margin value as "X px"
|
||||
valueText = std::to_string(SETTINGS.screenMargin) + " px";
|
||||
valueText = CrossPointSettings::getScreenMarginString(SETTINGS.screenMargin);
|
||||
} else if (settingsList[i].type == SettingType::ACTION && strcmp(settingsList[i].name, "Time to Sleep") == 0) {
|
||||
valueText = CrossPointSettings::getSleepTimeoutString(SETTINGS.sleepTimeout);
|
||||
} else if (settingsList[i].type == SettingType::ACTION && strcmp(settingsList[i].name, "Select Sleep BMP") == 0) {
|
||||
|
||||
@ -14,7 +14,7 @@ ScreenMarginSelectionActivity::ScreenMarginSelectionActivity(GfxRenderer& render
|
||||
if (index >= options.size()) {
|
||||
return;
|
||||
}
|
||||
SETTINGS.screenMargin = CrossPointSettings::SCREEN_MARGIN_VALUES[index];
|
||||
SETTINGS.screenMargin = static_cast<uint8_t>(index);
|
||||
SETTINGS.saveToFile();
|
||||
onBack();
|
||||
},
|
||||
@ -25,9 +25,8 @@ ScreenMarginSelectionActivity::ScreenMarginSelectionActivity(GfxRenderer& render
|
||||
}
|
||||
|
||||
void ScreenMarginSelectionActivity::loadItems() {
|
||||
const int idx = CrossPointSettings::getScreenMarginIndex(SETTINGS.screenMargin);
|
||||
if (idx >= 0 && static_cast<size_t>(idx) < options.size()) {
|
||||
selectorIndex = static_cast<size_t>(idx);
|
||||
if (SETTINGS.screenMargin < options.size()) {
|
||||
selectorIndex = SETTINGS.screenMargin;
|
||||
} else {
|
||||
selectorIndex = 0;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user