diff --git a/src/activities/settings/SettingsActivity.cpp b/src/activities/settings/SettingsActivity.cpp index 100996d..a510e8f 100644 --- a/src/activities/settings/SettingsActivity.cpp +++ b/src/activities/settings/SettingsActivity.cpp @@ -8,8 +8,9 @@ // Define the static settings list const SettingInfo SettingsActivity::settingsList[settingsCount] = { - {"White Sleep Screen", &CrossPointSettings::whiteSleepScreen}, - {"Extra Paragraph Spacing", &CrossPointSettings::extraParagraphSpacing}}; + {"White Sleep Screen", SettingType::TOGGLE, &CrossPointSettings::whiteSleepScreen}, + {"Extra Paragraph Spacing", SettingType::TOGGLE, &CrossPointSettings::extraParagraphSpacing}, + {"WiFi", SettingType::ACTION, nullptr}}; void SettingsActivity::taskTrampoline(void* param) { auto* self = static_cast(param); @@ -47,7 +48,7 @@ void SettingsActivity::onExit() { void SettingsActivity::loop() { // Handle actions with early return if (inputManager.wasPressed(InputManager::BTN_CONFIRM)) { - toggleCurrentSetting(); + activateCurrentSetting(); updateRequired = true; return; } @@ -72,6 +73,26 @@ void SettingsActivity::loop() { } } +void SettingsActivity::activateCurrentSetting() { + // Validate index + if (selectedSettingIndex < 0 || selectedSettingIndex >= settingsCount) { + return; + } + + const auto& setting = settingsList[selectedSettingIndex]; + + if (setting.type == SettingType::TOGGLE) { + toggleCurrentSetting(); + // Trigger a redraw of the entire screen + updateRequired = true; + } else if (setting.type == SettingType::ACTION) { + // Handle action settings + if (std::string(setting.name) == "WiFi") { + onGoWifi(); + } + } +} + void SettingsActivity::toggleCurrentSetting() { // Validate index if (selectedSettingIndex < 0 || selectedSettingIndex >= settingsCount) { @@ -80,6 +101,11 @@ void SettingsActivity::toggleCurrentSetting() { const auto& setting = settingsList[selectedSettingIndex]; + // Only toggle if it's a toggle type and has a value pointer + if (setting.type != SettingType::TOGGLE || setting.valuePtr == nullptr) { + return; + } + // Toggle the boolean value using the member pointer bool currentValue = SETTINGS.*(setting.valuePtr); SETTINGS.*(setting.valuePtr) = !currentValue; @@ -123,10 +149,12 @@ void SettingsActivity::render() const { // Draw setting name renderer.drawText(UI_FONT_ID, 20, settingY, settingsList[i].name); - // Draw value (all settings are toggles now) - if (settingsList[i].valuePtr != nullptr) { + // Draw value based on setting type + if (settingsList[i].type == SettingType::TOGGLE && settingsList[i].valuePtr != nullptr) { bool value = SETTINGS.*(settingsList[i].valuePtr); renderer.drawText(UI_FONT_ID, pageWidth - 80, settingY, value ? "ON" : "OFF"); + } else if (settingsList[i].type == SettingType::ACTION) { + renderer.drawText(UI_FONT_ID, pageWidth - 80, settingY, ">"); } } diff --git a/src/activities/settings/SettingsActivity.h b/src/activities/settings/SettingsActivity.h index d1d5b99..b68ace8 100644 --- a/src/activities/settings/SettingsActivity.h +++ b/src/activities/settings/SettingsActivity.h @@ -12,10 +12,13 @@ class CrossPointSettings; +enum class SettingType { TOGGLE, ACTION }; + // Structure to hold setting information struct SettingInfo { const char* name; // Display name of the setting - uint8_t CrossPointSettings::* valuePtr; // Pointer to member in CrossPointSettings + SettingType type; // Type of setting + uint8_t CrossPointSettings::* valuePtr; // Pointer to member in CrossPointSettings (for TOGGLE) }; class SettingsActivity final : public Activity { @@ -24,19 +27,22 @@ class SettingsActivity final : public Activity { bool updateRequired = false; int selectedSettingIndex = 0; // Currently selected setting const std::function onGoHome; + const std::function onGoWifi; // Static settings list - static constexpr int settingsCount = 2; // Number of settings + static constexpr int settingsCount = 3; // Number of settings static const SettingInfo settingsList[settingsCount]; static void taskTrampoline(void* param); [[noreturn]] void displayTaskLoop(); void render() const; void toggleCurrentSetting(); + void activateCurrentSetting(); public: - explicit SettingsActivity(GfxRenderer& renderer, InputManager& inputManager, const std::function& onGoHome) - : Activity(renderer, inputManager), onGoHome(onGoHome) {} + explicit SettingsActivity(GfxRenderer& renderer, InputManager& inputManager, const std::function& onGoHome, + const std::function& onGoWifi) + : Activity(renderer, inputManager), onGoHome(onGoHome), onGoWifi(onGoWifi) {} void onEnter() override; void onExit() override; void loop() override; diff --git a/src/main.cpp b/src/main.cpp index 81598d4..12aa701 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,6 +20,7 @@ #include "activities/boot_sleep/BootActivity.h" #include "activities/boot_sleep/SleepActivity.h" #include "activities/home/HomeActivity.h" +#include "activities/network/WifiScreen.h" #include "activities/reader/ReaderActivity.h" #include "activities/settings/SettingsActivity.h" #include "activities/util/FullScreenMessageActivity.h" @@ -141,9 +142,16 @@ void onGoToReader(const std::string& initialEpubPath) { } void onGoToReaderHome() { onGoToReader(std::string()); } +void onGoToSettings(); + +void onGoToWifi() { + exitActivity(); + enterNewActivity(new WifiScreen(renderer, inputManager, onGoToSettings)); +} + void onGoToSettings() { exitActivity(); - enterNewActivity(new SettingsActivity(renderer, inputManager, onGoHome)); + enterNewActivity(new SettingsActivity(renderer, inputManager, onGoHome, onGoToWifi)); } void onGoHome() {