From ac1ffd3d2c181d35cecff8204497837812a4ddff Mon Sep 17 00:00:00 2001 From: Eliz Kilic Date: Fri, 23 Jan 2026 23:18:48 +0000 Subject: [PATCH] Add hide extension option --- src/CrossPointSettings.cpp | 5 ++++- src/CrossPointSettings.h | 2 ++ src/activities/home/MyLibraryActivity.cpp | 7 ++++++- src/activities/settings/SettingsActivity.cpp | 12 ++++++++++-- src/activities/settings/SettingsActivity.h | 2 +- src/util/StringUtils.cpp | 8 ++++++++ src/util/StringUtils.h | 6 ++++++ 7 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/CrossPointSettings.cpp b/src/CrossPointSettings.cpp index f5e8ded5..5938f5b1 100644 --- a/src/CrossPointSettings.cpp +++ b/src/CrossPointSettings.cpp @@ -14,7 +14,7 @@ CrossPointSettings CrossPointSettings::instance; namespace { constexpr uint8_t SETTINGS_FILE_VERSION = 1; // Increment this when adding new persisted settings fields -constexpr uint8_t SETTINGS_COUNT = 20; +constexpr uint8_t SETTINGS_COUNT = 21; constexpr char SETTINGS_FILE[] = "/.crosspoint/settings.bin"; } // namespace @@ -49,6 +49,7 @@ bool CrossPointSettings::saveToFile() const { serialization::writePod(outputFile, hideBatteryPercentage); serialization::writePod(outputFile, longPressChapterSkip); serialization::writePod(outputFile, hyphenationEnabled); + serialization::writePod(outputFile, displayFileExtensions); outputFile.close(); Serial.printf("[%lu] [CPS] Settings saved to file\n", millis()); @@ -120,6 +121,8 @@ bool CrossPointSettings::loadFromFile() { if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, hyphenationEnabled); if (++settingsRead >= fileSettingsCount) break; + serialization::readPod(inputFile, displayFileExtensions); + if (++settingsRead >= fileSettingsCount) break; } while (false); inputFile.close(); diff --git a/src/CrossPointSettings.h b/src/CrossPointSettings.h index 8ce32a2c..73f2410f 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -94,6 +94,8 @@ class CrossPointSettings { uint8_t hideBatteryPercentage = HIDE_NEVER; // Long-press chapter skip on side buttons uint8_t longPressChapterSkip = 1; + // Display file extensions in the file browser + uint8_t displayFileExtensions = 0; ~CrossPointSettings() = default; diff --git a/src/activities/home/MyLibraryActivity.cpp b/src/activities/home/MyLibraryActivity.cpp index c41e2277..db144747 100644 --- a/src/activities/home/MyLibraryActivity.cpp +++ b/src/activities/home/MyLibraryActivity.cpp @@ -10,6 +10,7 @@ #include "ScreenComponents.h" #include "fontIds.h" #include "util/StringUtils.h" +#include "CrossPointSettings.h" namespace { // Layout constants @@ -375,7 +376,11 @@ void MyLibraryActivity::renderFilesTab() const { // Draw items for (int i = pageStartIndex; i < fileCount && i < pageStartIndex + pageItems; i++) { - auto item = renderer.truncatedText(UI_10_FONT_ID, files[i].c_str(), pageWidth - LEFT_MARGIN - RIGHT_MARGIN); + std::string filename = files[i]; + if (SETTINGS.displayFileExtensions == 0 && filename.back() != '/') { + filename = StringUtils::stripFileExtension(filename); + } + auto item = renderer.truncatedText(UI_10_FONT_ID, filename.c_str(), pageWidth - LEFT_MARGIN - RIGHT_MARGIN); renderer.drawText(UI_10_FONT_ID, LEFT_MARGIN, CONTENT_START_Y + (i % pageItems) * LINE_HEIGHT, item.c_str(), i != selectorIndex); } diff --git a/src/activities/settings/SettingsActivity.cpp b/src/activities/settings/SettingsActivity.cpp index 943fdb4c..6a7d69dd 100644 --- a/src/activities/settings/SettingsActivity.cpp +++ b/src/activities/settings/SettingsActivity.cpp @@ -8,7 +8,7 @@ #include "MappedInputManager.h" #include "fontIds.h" -const char* SettingsActivity::categoryNames[categoryCount] = {"Display", "Reader", "Controls", "System"}; +const char* SettingsActivity::categoryNames[categoryCount] = {"Display", "Reader", "Controls", "Files", "System"}; namespace { constexpr int displaySettingsCount = 5; @@ -50,6 +50,10 @@ const SettingInfo systemSettings[systemSettingsCount] = { {"1 min", "5 min", "10 min", "15 min", "30 min"}), SettingInfo::Action("KOReader Sync"), SettingInfo::Action("Calibre Settings"), SettingInfo::Action("Clear Cache"), SettingInfo::Action("Check for updates")}; + +constexpr int filesSettingsCount = 1; +const SettingInfo filesSettings[filesSettingsCount] = { + SettingInfo::Toggle("Display File Extensions", &CrossPointSettings::displayFileExtensions)}; } // namespace void SettingsActivity::taskTrampoline(void* param) { @@ -144,7 +148,11 @@ void SettingsActivity::enterCategory(int categoryIndex) { settingsList = controlsSettings; settingsCount = controlsSettingsCount; break; - case 3: // System + case 3: // Files + settingsList = filesSettings; + settingsCount = filesSettingsCount; + break; + case 4: // System settingsList = systemSettings; settingsCount = systemSettingsCount; break; diff --git a/src/activities/settings/SettingsActivity.h b/src/activities/settings/SettingsActivity.h index 821dda42..f93b5d56 100644 --- a/src/activities/settings/SettingsActivity.h +++ b/src/activities/settings/SettingsActivity.h @@ -19,7 +19,7 @@ class SettingsActivity final : public ActivityWithSubactivity { int selectedCategoryIndex = 0; // Currently selected category const std::function onGoHome; - static constexpr int categoryCount = 4; + static constexpr int categoryCount = 5; static const char* categoryNames[categoryCount]; static void taskTrampoline(void* param); diff --git a/src/util/StringUtils.cpp b/src/util/StringUtils.cpp index 2426b687..3d7bc490 100644 --- a/src/util/StringUtils.cpp +++ b/src/util/StringUtils.cpp @@ -80,4 +80,12 @@ void utf8TruncateChars(std::string& str, const size_t numChars) { } } +std::string stripFileExtension(const std::string& filename) { + size_t last_dot = filename.find_last_of("."); + if (last_dot == std::string::npos) { + return filename; + } + return filename.substr(0, last_dot); +} + } // namespace StringUtils diff --git a/src/util/StringUtils.h b/src/util/StringUtils.h index 5c8332f0..d9117236 100644 --- a/src/util/StringUtils.h +++ b/src/util/StringUtils.h @@ -25,4 +25,10 @@ size_t utf8RemoveLastChar(std::string& str); // Truncate string by removing N UTF-8 characters from the end void utf8TruncateChars(std::string& str, size_t numChars); + +/** + * Strip the file extension from a filename. + * If there's no extension, it returns the original filename. + */ +std::string stripFileExtension(const std::string& filename); } // namespace StringUtils