mirror of
https://github.com/daveallie/crosspoint-reader.git
synced 2026-02-05 07:07:38 +03:00
## Summary * **What is the goal of this PR?** Add a new user setting for paragraph alignment, instead of hard-coding full justification. * **What changes are included?** One new line in the settings screen, with 4 options (justify/left/center/right). Default is justified since that's what it was already. I personally only wanted to disable justification and use "left", but I included the other options for completeness since they were already supported. ## Additional Context Tested on my X4 and looks as expected for each alignment. Co-authored-by: Maeve Andrews <maeve@git.mail.maeveandrews.com>
173 lines
5.0 KiB
C++
173 lines
5.0 KiB
C++
#include "CrossPointSettings.h"
|
|
|
|
#include <HardwareSerial.h>
|
|
#include <SDCardManager.h>
|
|
#include <Serialization.h>
|
|
|
|
#include "fontIds.h"
|
|
|
|
// Initialize the static instance
|
|
CrossPointSettings CrossPointSettings::instance;
|
|
|
|
namespace {
|
|
constexpr uint8_t SETTINGS_FILE_VERSION = 1;
|
|
// Increment this when adding new persisted settings fields
|
|
constexpr uint8_t SETTINGS_COUNT = 11;
|
|
constexpr char SETTINGS_FILE[] = "/.crosspoint/settings.bin";
|
|
} // namespace
|
|
|
|
bool CrossPointSettings::saveToFile() const {
|
|
// Make sure the directory exists
|
|
SdMan.mkdir("/.crosspoint");
|
|
|
|
FsFile outputFile;
|
|
if (!SdMan.openFileForWrite("CPS", SETTINGS_FILE, outputFile)) {
|
|
return false;
|
|
}
|
|
|
|
serialization::writePod(outputFile, SETTINGS_FILE_VERSION);
|
|
serialization::writePod(outputFile, SETTINGS_COUNT);
|
|
serialization::writePod(outputFile, sleepScreen);
|
|
serialization::writePod(outputFile, extraParagraphSpacing);
|
|
serialization::writePod(outputFile, shortPwrBtn);
|
|
serialization::writePod(outputFile, statusBar);
|
|
serialization::writePod(outputFile, orientation);
|
|
serialization::writePod(outputFile, frontButtonLayout);
|
|
serialization::writePod(outputFile, sideButtonLayout);
|
|
serialization::writePod(outputFile, fontFamily);
|
|
serialization::writePod(outputFile, fontSize);
|
|
serialization::writePod(outputFile, lineSpacing);
|
|
serialization::writePod(outputFile, paragraphAlignment);
|
|
outputFile.close();
|
|
|
|
Serial.printf("[%lu] [CPS] Settings saved to file\n", millis());
|
|
return true;
|
|
}
|
|
|
|
bool CrossPointSettings::loadFromFile() {
|
|
FsFile inputFile;
|
|
if (!SdMan.openFileForRead("CPS", SETTINGS_FILE, inputFile)) {
|
|
return false;
|
|
}
|
|
|
|
uint8_t version;
|
|
serialization::readPod(inputFile, version);
|
|
if (version != SETTINGS_FILE_VERSION) {
|
|
Serial.printf("[%lu] [CPS] Deserialization failed: Unknown version %u\n", millis(), version);
|
|
inputFile.close();
|
|
return false;
|
|
}
|
|
|
|
uint8_t fileSettingsCount = 0;
|
|
serialization::readPod(inputFile, fileSettingsCount);
|
|
|
|
// load settings that exist (support older files with fewer fields)
|
|
uint8_t settingsRead = 0;
|
|
do {
|
|
serialization::readPod(inputFile, sleepScreen);
|
|
if (++settingsRead >= fileSettingsCount) break;
|
|
serialization::readPod(inputFile, extraParagraphSpacing);
|
|
if (++settingsRead >= fileSettingsCount) break;
|
|
serialization::readPod(inputFile, shortPwrBtn);
|
|
if (++settingsRead >= fileSettingsCount) break;
|
|
serialization::readPod(inputFile, statusBar);
|
|
if (++settingsRead >= fileSettingsCount) break;
|
|
serialization::readPod(inputFile, orientation);
|
|
if (++settingsRead >= fileSettingsCount) break;
|
|
serialization::readPod(inputFile, frontButtonLayout);
|
|
if (++settingsRead >= fileSettingsCount) break;
|
|
serialization::readPod(inputFile, sideButtonLayout);
|
|
if (++settingsRead >= fileSettingsCount) break;
|
|
serialization::readPod(inputFile, fontFamily);
|
|
if (++settingsRead >= fileSettingsCount) break;
|
|
serialization::readPod(inputFile, fontSize);
|
|
if (++settingsRead >= fileSettingsCount) break;
|
|
serialization::readPod(inputFile, lineSpacing);
|
|
if (++settingsRead >= fileSettingsCount) break;
|
|
serialization::readPod(inputFile, paragraphAlignment);
|
|
if (++settingsRead >= fileSettingsCount) break;
|
|
} while (false);
|
|
|
|
inputFile.close();
|
|
Serial.printf("[%lu] [CPS] Settings loaded from file\n", millis());
|
|
return true;
|
|
}
|
|
|
|
float CrossPointSettings::getReaderLineCompression() const {
|
|
switch (fontFamily) {
|
|
case BOOKERLY:
|
|
default:
|
|
switch (lineSpacing) {
|
|
case TIGHT:
|
|
return 0.95f;
|
|
case NORMAL:
|
|
default:
|
|
return 1.0f;
|
|
case WIDE:
|
|
return 1.1f;
|
|
}
|
|
case NOTOSANS:
|
|
switch (lineSpacing) {
|
|
case TIGHT:
|
|
return 0.90f;
|
|
case NORMAL:
|
|
default:
|
|
return 0.95f;
|
|
case WIDE:
|
|
return 1.0f;
|
|
}
|
|
case OPENDYSLEXIC:
|
|
switch (lineSpacing) {
|
|
case TIGHT:
|
|
return 0.90f;
|
|
case NORMAL:
|
|
default:
|
|
return 0.95f;
|
|
case WIDE:
|
|
return 1.0f;
|
|
}
|
|
}
|
|
}
|
|
|
|
int CrossPointSettings::getReaderFontId() const {
|
|
switch (fontFamily) {
|
|
case BOOKERLY:
|
|
default:
|
|
switch (fontSize) {
|
|
case SMALL:
|
|
return BOOKERLY_12_FONT_ID;
|
|
case MEDIUM:
|
|
default:
|
|
return BOOKERLY_14_FONT_ID;
|
|
case LARGE:
|
|
return BOOKERLY_16_FONT_ID;
|
|
case EXTRA_LARGE:
|
|
return BOOKERLY_18_FONT_ID;
|
|
}
|
|
case NOTOSANS:
|
|
switch (fontSize) {
|
|
case SMALL:
|
|
return NOTOSANS_12_FONT_ID;
|
|
case MEDIUM:
|
|
default:
|
|
return NOTOSANS_14_FONT_ID;
|
|
case LARGE:
|
|
return NOTOSANS_16_FONT_ID;
|
|
case EXTRA_LARGE:
|
|
return NOTOSANS_18_FONT_ID;
|
|
}
|
|
case OPENDYSLEXIC:
|
|
switch (fontSize) {
|
|
case SMALL:
|
|
return OPENDYSLEXIC_8_FONT_ID;
|
|
case MEDIUM:
|
|
default:
|
|
return OPENDYSLEXIC_10_FONT_ID;
|
|
case LARGE:
|
|
return OPENDYSLEXIC_12_FONT_ID;
|
|
case EXTRA_LARGE:
|
|
return OPENDYSLEXIC_14_FONT_ID;
|
|
}
|
|
}
|
|
}
|