more callback functions

Signed-off-by: Peter Siegmund <developer@mars3142.org>
This commit is contained in:
2025-06-15 17:17:26 +02:00
parent d9a0dfb8bd
commit 9806d4c9ae
4 changed files with 42 additions and 13 deletions

View File

@@ -187,10 +187,10 @@ class Menu : public Widget
* *
* @note The modified item replaces the original in the menu's item collection * @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: private:
void replaceItem(int index, const MenuItem &item); MenuItem replaceItem(int index, const MenuItem &item);
void render() override; void render() override;

View File

@@ -58,7 +58,7 @@ void Menu::setItemSize(const size_t size)
{ {
for (size_t i = m_items.size() - 1; i < size; i++) 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); addSelection(i + 1, caption, m_items.at(0).getValues(), 0);
} }
} }
@@ -75,20 +75,21 @@ void Menu::toggle(const MenuItem &menuItem)
replaceItem(menuItem.getId(), item); 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) switch (button)
{ {
case ButtonType::LEFT: case ButtonType::LEFT:
if (menuItem.getIndex() > 0) if (menuItem.getIndex() > 0)
{ {
const auto item = menuItem.copyWith(menuItem.getIndex() - 1); const auto item = menuItem.copyWith(menuItem.getIndex() - 1);
replaceItem(menuItem.getId(), item); result = replaceItem(menuItem.getId(), item);
} }
else else
{ {
const auto item = menuItem.copyWith(menuItem.getItemCount() - 1); const auto item = menuItem.copyWith(menuItem.getItemCount() - 1);
replaceItem(menuItem.getId(), item); result = replaceItem(menuItem.getId(), item);
} }
break; break;
@@ -96,23 +97,26 @@ void Menu::switchValue(const MenuItem& menuItem, ButtonType button)
if (menuItem.getIndex() < menuItem.getItemCount() - 1) if (menuItem.getIndex() < menuItem.getItemCount() - 1)
{ {
const auto item = menuItem.copyWith(menuItem.getIndex() + 1); const auto item = menuItem.copyWith(menuItem.getIndex() + 1);
replaceItem(menuItem.getId(), item); result = replaceItem(menuItem.getId(), item);
} }
else else
{ {
const auto item = menuItem.copyWith(0); const auto item = menuItem.copyWith(0);
replaceItem(menuItem.getId(), item); result = replaceItem(menuItem.getId(), item);
} }
break; break;
default: default:
break; 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; m_items.at(index) = item;
return item;
} }
void Menu::render() void Menu::render()
@@ -172,6 +176,13 @@ void Menu::renderWidget(const MenuItem *item, const uint8_t *font, const int x,
// Render type-specific elements // Render type-specific elements
switch (item->getType()) 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: { case MenuItemTypes::SELECTION: {
// Format selection value with angle brackets // Format selection value with angle brackets
const std::string formattedValue = "< " + item->getValue() + " >"; const std::string formattedValue = "< " + item->getValue() + " >";
@@ -201,7 +212,6 @@ void Menu::renderWidget(const MenuItem *item, const uint8_t *font, const int x,
break; break;
} }
case MenuItemTypes::TEXT:
default: default:
// No additional rendering needed for text and number types // No additional rendering needed for text and number types
break; break;

View File

@@ -25,11 +25,12 @@ LightMenu::LightMenu(menu_options_t *options) : Menu(options), m_options(options
addSelection(LightMenuItem::MODE, "Modus", values, 0); addSelection(LightMenuItem::MODE, "Modus", values, 0);
// Add menu item for accessing LED settings submenu // 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) void LightMenu::onButtonPressed(const MenuItem &menuItem, const ButtonType button)
{ {
MenuItem item = menuItem;
std::shared_ptr<Widget> widget; std::shared_ptr<Widget> widget;
// Handle different menu items based on their ID // Handle different menu items based on their ID
@@ -41,12 +42,25 @@ void LightMenu::onButtonPressed(const MenuItem &menuItem, const ButtonType butto
{ {
toggle(menuItem); 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; break;
} }
case LightMenuItem::MODE: { case LightMenuItem::MODE: {
// Switch between day/night modes using left/right buttons // 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; break;
} }

View File

@@ -1,6 +1,11 @@
#include "ui/SettingsMenu.h" #include "ui/SettingsMenu.h"
namespace SettingsMenuItem
{
constexpr uint8_t OTA_UPLOAD = 0;
}
SettingsMenu::SettingsMenu(menu_options_t *options) : Menu(options) SettingsMenu::SettingsMenu(menu_options_t *options) : Menu(options)
{ {
addText(1, "OTA Einspielen"); addText(SettingsMenuItem::OTA_UPLOAD, "OTA Einspielen");
} }