From 9806d4c9ae6bffeba2157b1d411c2016b3d601d8 Mon Sep 17 00:00:00 2001 From: Peter Siegmund Date: Sun, 15 Jun 2025 17:17:26 +0200 Subject: [PATCH] more callback functions Signed-off-by: Peter Siegmund --- components/insa/include/common/Menu.h | 4 ++-- components/insa/src/common/Menu.cpp | 26 +++++++++++++++++-------- components/insa/src/ui/LightMenu.cpp | 18 +++++++++++++++-- components/insa/src/ui/SettingsMenu.cpp | 7 ++++++- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/components/insa/include/common/Menu.h b/components/insa/include/common/Menu.h index f73e8e1..a0a8895 100644 --- a/components/insa/include/common/Menu.h +++ b/components/insa/include/common/Menu.h @@ -187,10 +187,10 @@ class Menu : public Widget * * @note The modified item replaces the original in the menu's item collection */ - void switchValue(const MenuItem &menuItem, ButtonType button); + MenuItem switchValue(const MenuItem &menuItem, ButtonType button); private: - void replaceItem(int index, const MenuItem &item); + MenuItem replaceItem(int index, const MenuItem &item); void render() override; diff --git a/components/insa/src/common/Menu.cpp b/components/insa/src/common/Menu.cpp index 93fecff..c0d6835 100644 --- a/components/insa/src/common/Menu.cpp +++ b/components/insa/src/common/Menu.cpp @@ -58,7 +58,7 @@ void Menu::setItemSize(const size_t size) { for (size_t i = m_items.size() - 1; i < size; i++) { - auto caption = std::string("Section ") + std::to_string(i + 1); + auto caption = std::string("Bereich ") + std::to_string(i + 1); addSelection(i + 1, caption, m_items.at(0).getValues(), 0); } } @@ -75,20 +75,21 @@ void Menu::toggle(const MenuItem &menuItem) replaceItem(menuItem.getId(), item); } -void Menu::switchValue(const MenuItem& menuItem, ButtonType button) +MenuItem Menu::switchValue(const MenuItem &menuItem, ButtonType button) { + MenuItem result = menuItem; switch (button) { case ButtonType::LEFT: if (menuItem.getIndex() > 0) { const auto item = menuItem.copyWith(menuItem.getIndex() - 1); - replaceItem(menuItem.getId(), item); + result = replaceItem(menuItem.getId(), item); } else { const auto item = menuItem.copyWith(menuItem.getItemCount() - 1); - replaceItem(menuItem.getId(), item); + result = replaceItem(menuItem.getId(), item); } break; @@ -96,23 +97,26 @@ void Menu::switchValue(const MenuItem& menuItem, ButtonType button) if (menuItem.getIndex() < menuItem.getItemCount() - 1) { const auto item = menuItem.copyWith(menuItem.getIndex() + 1); - replaceItem(menuItem.getId(), item); + result = replaceItem(menuItem.getId(), item); } else { const auto item = menuItem.copyWith(0); - replaceItem(menuItem.getId(), item); + result = replaceItem(menuItem.getId(), item); } break; default: break; } + + return result; } -void Menu::replaceItem(const int index, const MenuItem &item) +MenuItem Menu::replaceItem(const int index, const MenuItem &item) { m_items.at(index) = item; + return item; } void Menu::render() @@ -172,6 +176,13 @@ void Menu::renderWidget(const MenuItem *item, const uint8_t *font, const int x, // Render type-specific elements switch (item->getType()) { + case MenuItemTypes::TEXT: { + const std::string formattedValue = ">"; + const u8g2_uint_t textWidth = u8g2_GetStrWidth(u8g2, formattedValue.c_str()); + u8g2_DrawStr(u8g2, u8g2->width - textWidth - UIConstants::SELECTION_MARGIN, y, formattedValue.c_str()); + break; + } + case MenuItemTypes::SELECTION: { // Format selection value with angle brackets const std::string formattedValue = "< " + item->getValue() + " >"; @@ -201,7 +212,6 @@ void Menu::renderWidget(const MenuItem *item, const uint8_t *font, const int x, break; } - case MenuItemTypes::TEXT: default: // No additional rendering needed for text and number types break; diff --git a/components/insa/src/ui/LightMenu.cpp b/components/insa/src/ui/LightMenu.cpp index ffc0aa8..9135cd6 100644 --- a/components/insa/src/ui/LightMenu.cpp +++ b/components/insa/src/ui/LightMenu.cpp @@ -25,11 +25,12 @@ LightMenu::LightMenu(menu_options_t *options) : Menu(options), m_options(options addSelection(LightMenuItem::MODE, "Modus", values, 0); // Add menu item for accessing LED settings submenu - addText(LightMenuItem::LED_SETTINGS, "LED Einstellungen"); + addText(LightMenuItem::LED_SETTINGS, "Einstellungen"); } void LightMenu::onButtonPressed(const MenuItem &menuItem, const ButtonType button) { + MenuItem item = menuItem; std::shared_ptr widget; // Handle different menu items based on their ID @@ -41,12 +42,25 @@ void LightMenu::onButtonPressed(const MenuItem &menuItem, const ButtonType butto { toggle(menuItem); } + if (m_options && m_options->persistence && m_options->persistence->save) + { + const auto value = getItem(item.getId()).getValue(); + m_options->persistence->save("light_activated", value.c_str()); + } break; } case LightMenuItem::MODE: { // Switch between day/night modes using left/right buttons - switchValue(menuItem, button); + item = switchValue(menuItem, button); + if (button == ButtonType::LEFT || button == ButtonType::RIGHT) + { + if (m_options && m_options->persistence && m_options->persistence->save) + { + const auto value = std::to_string(getItem(item.getId()).getIndex()); + m_options->persistence->save("light_mode", value.c_str()); + } + } break; } diff --git a/components/insa/src/ui/SettingsMenu.cpp b/components/insa/src/ui/SettingsMenu.cpp index 395c3bc..6f874d8 100644 --- a/components/insa/src/ui/SettingsMenu.cpp +++ b/components/insa/src/ui/SettingsMenu.cpp @@ -1,6 +1,11 @@ #include "ui/SettingsMenu.h" +namespace SettingsMenuItem +{ +constexpr uint8_t OTA_UPLOAD = 0; +} + SettingsMenu::SettingsMenu(menu_options_t *options) : Menu(options) { - addText(1, "OTA Einspielen"); + addText(SettingsMenuItem::OTA_UPLOAD, "OTA Einspielen"); } \ No newline at end of file