From f10cb18dc47901b8e6dacc41a611a1d4d12379db Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Sat, 5 Feb 2022 21:35:19 +0100 Subject: [PATCH] WIP: Custom typesafe enum menu --- main/CMakeLists.txt | 4 +- main/actions/ledstripanimationactions.cpp | 8 +++ main/actions/ledstripanimationactions.h | 19 +++-- main/displays/menus/ledstripmenu.cpp | 4 +- .../menus/ledstripselectanimationmenu.cpp | 72 ------------------- .../menus/ledstripselectanimationmenu.h | 16 ----- .../displays/menus/typesafeenumchangemenu.cpp | 1 + main/displays/menus/typesafeenumchangemenu.h | 68 ++++++++++++++++++ 8 files changed, 94 insertions(+), 98 deletions(-) delete mode 100644 main/displays/menus/ledstripselectanimationmenu.cpp delete mode 100644 main/displays/menus/ledstripselectanimationmenu.h create mode 100644 main/displays/menus/typesafeenumchangemenu.cpp create mode 100644 main/displays/menus/typesafeenumchangemenu.h diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index f3bd8f6..eee51c8 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -105,7 +105,6 @@ set(headers displays/menus/invertmenu.h displays/menus/larsmmodesettingsmenu.h displays/menus/ledstripmenu.h - displays/menus/ledstripselectanimationmenu.h displays/menus/ledstripselectblinkmenu.h displays/menus/ledstripselectotamode.h displays/menus/limitssettingsmenu.h @@ -132,6 +131,7 @@ set(headers displays/menus/tempomatmodesettingsmenu.h displays/menus/timersmenu.h displays/menus/timesettingsmenu.h + displays/menus/typesafeenumchangemenu.h displays/menus/udpcloudsettingsmenu.h displays/menus/wifiapclientsmenu.h displays/menus/wifiapsettingsmenu.h @@ -336,7 +336,6 @@ set(sources displays/menus/invertmenu.cpp displays/menus/larsmmodesettingsmenu.cpp displays/menus/ledstripmenu.cpp - displays/menus/ledstripselectanimationmenu.cpp displays/menus/ledstripselectblinkmenu.cpp displays/menus/ledstripselectotamode.cpp displays/menus/limitssettingsmenu.cpp @@ -363,6 +362,7 @@ set(sources displays/menus/tempomatmodesettingsmenu.cpp displays/menus/timersmenu.cpp displays/menus/timesettingsmenu.cpp + displays/menus/typesafeenumchangemenu.cpp displays/menus/udpcloudsettingsmenu.cpp displays/menus/wifiapclientsmenu.cpp displays/menus/wifiapsettingsmenu.cpp diff --git a/main/actions/ledstripanimationactions.cpp b/main/actions/ledstripanimationactions.cpp index e69de29..4f39d63 100644 --- a/main/actions/ledstripanimationactions.cpp +++ b/main/actions/ledstripanimationactions.cpp @@ -0,0 +1,8 @@ +#include "ledstripanimationactions.h" +#ifdef FEATURE_LEDSTRIP +void LedStripSetAnimationAction::triggered() +{ + if (auto result = configs.write_config(configs.ledstrip.animationType, m_animation); !result) + BobbyErrorHandler{}.errorOccured(std::move(result).error()); +} +#endif diff --git a/main/actions/ledstripanimationactions.h b/main/actions/ledstripanimationactions.h index ce0ab14..8360721 100644 --- a/main/actions/ledstripanimationactions.h +++ b/main/actions/ledstripanimationactions.h @@ -11,16 +11,23 @@ #ifdef FEATURE_LEDSTRIP template +class LedStripSetAnimationActionStatic : public virtual espgui::ActionInterface +{ +public: + void triggered() override + { + if (auto result = configs.write_config(configs.ledstrip.animationType, type); !result) + BobbyErrorHandler{}.errorOccured(std::move(result).error()); + } +}; + class LedStripSetAnimationAction : public virtual espgui::ActionInterface { public: + LedStripSetAnimationAction(LedstripAnimation animation) : m_animation{animation} {}; void triggered() override; +private: + const LedstripAnimation m_animation; }; -template -void LedStripSetAnimationAction::triggered() -{ - if (auto result = configs.write_config(configs.ledstrip.animationType, type); !result) - BobbyErrorHandler{}.errorOccured(std::move(result).error()); -} #endif diff --git a/main/displays/menus/ledstripmenu.cpp b/main/displays/menus/ledstripmenu.cpp index 7ef971b..9389193 100644 --- a/main/displays/menus/ledstripmenu.cpp +++ b/main/displays/menus/ledstripmenu.cpp @@ -18,7 +18,7 @@ #include "displays/menus/mainmenu.h" #include "globals.h" #include "ledstrip.h" -#include "ledstripselectanimationmenu.h" +#include "displays/menus/typesafeenumchangemenu.h" #include "ledstripselectblinkmenu.h" #include "bobbycheckbox.h" @@ -149,7 +149,7 @@ LedstripMenu::LedstripMenu() constructMenuItem, BobbyCheckbox, EnableLedstripStVOFrontlight>>(); constructMenuItem, BobbyCheckbox, EnableLedAnimationAccessor>>(); - constructMenuItem, espgui::SwitchScreenAction>>(); + constructMenuItem, espgui::SwitchScreenAction>>>(); constructMenuItem, BobbyCheckbox, EnableBrakeLightsAccessor>>(); diff --git a/main/displays/menus/ledstripselectanimationmenu.cpp b/main/displays/menus/ledstripselectanimationmenu.cpp deleted file mode 100644 index 391a705..0000000 --- a/main/displays/menus/ledstripselectanimationmenu.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#include "ledstripselectanimationmenu.h" - -// Local includes -#include "actions/dummyaction.h" -#include "actions/ledstripanimationactions.h" -#include "actions/switchscreenaction.h" -#include "icons/back.h" -#include "ledstripdefines.h" -#include "ledstripmenu.h" -#include "newsettings.h" - -#ifdef FEATURE_LEDSTRIP -namespace { -constexpr char TEXT_SELECTANIMATION[] = "Select Animation"; -constexpr char TEXT_ANIMATION_DEFAULTRAINBOW[] = "Default Rainbow"; -constexpr char TEXT_ANIMATION_BETTERRAINBOW[] = "Better Rainbow"; -constexpr char TEXT_ANIMATION_SPEEDSYNCANIMATION[] = "Speed Sync"; -constexpr char TEXT_ANIMATION_CUSTOMCOLOR[] = "Custom Color"; -constexpr char TEXT_BACK[] = "Back"; - -class CurrentSelectedAnimationText : public virtual espgui::TextInterface -{ -public: - std::string text() const override; -}; - -} // namespace - -LedstripSelectAnimationMenu::LedstripSelectAnimationMenu() -{ - using namespace espgui; - - constructMenuItem>(); - constructMenuItem>(); - constructMenuItem, LedStripSetAnimationAction>>(); - constructMenuItem, LedStripSetAnimationAction>>(); - constructMenuItem, LedStripSetAnimationAction>>(); - constructMenuItem, LedStripSetAnimationAction>>(); - constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&espgui::icons::back>>>(); -} - -std::string LedstripSelectAnimationMenu::text() const -{ - return TEXT_SELECTANIMATION; -} - -void LedstripSelectAnimationMenu::back() -{ - espgui::switchScreen(); -} - -namespace { - -std::string CurrentSelectedAnimationText::text() const -{ - switch (configs.ledstrip.animationType.value) - { - case LedstripAnimation::DefaultRainbow: - return TEXT_ANIMATION_DEFAULTRAINBOW; - case LedstripAnimation::BetterRainbow: - return TEXT_ANIMATION_BETTERRAINBOW; - case LedstripAnimation::SpeedSync: - return TEXT_ANIMATION_SPEEDSYNCANIMATION; - case LedstripAnimation::CustomColor: - return TEXT_ANIMATION_CUSTOMCOLOR; - default: - return "Animation Unkown"; - } -} - -} // namespace -#endif diff --git a/main/displays/menus/ledstripselectanimationmenu.h b/main/displays/menus/ledstripselectanimationmenu.h deleted file mode 100644 index 334c25f..0000000 --- a/main/displays/menus/ledstripselectanimationmenu.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -// Local includes -#include "displays/bobbymenudisplay.h" - -#ifdef FEATURE_LEDSTRIP -class LedstripSelectAnimationMenu : public BobbyMenuDisplay -{ -public: - LedstripSelectAnimationMenu(); - - std::string text() const override; - - void back() override; -}; -#endif diff --git a/main/displays/menus/typesafeenumchangemenu.cpp b/main/displays/menus/typesafeenumchangemenu.cpp new file mode 100644 index 0000000..83e252b --- /dev/null +++ b/main/displays/menus/typesafeenumchangemenu.cpp @@ -0,0 +1 @@ +#include "typesafeenumchangemenu.h" diff --git a/main/displays/menus/typesafeenumchangemenu.h b/main/displays/menus/typesafeenumchangemenu.h new file mode 100644 index 0000000..f2796aa --- /dev/null +++ b/main/displays/menus/typesafeenumchangemenu.h @@ -0,0 +1,68 @@ +#pragma once + +// 3rdparty lib includes +#include +#include +#include + +// local includes +#include "globals.h" +#include "actions/dummyaction.h" +#include "actions/switchscreenaction.h" +#include "displays/bobbymenudisplay.h" + +namespace typesafeenumchangemenu { +constexpr char TEXT_BACK[] = "Back"; +} // namespace typesafeenumchangemenu + +template config> +class TypesafeEnumCurrentValueMenuItemText : + public espgui::TextInterface +{ + std::string text() const override + { + return toString(config.value); + } +}; + +template config> +class TypesafeEnumSetterMenuItem : + public espgui::MenuItem +{ + std::string text() const override + { + return toString(config.value); + } + + void triggered() override + { + + } +}; + +template config> +class TypeSafeChangeMenu : + public BobbyMenuDisplay +{ + TypeSafeChangeMenu() + { + using namespace espgui; + using namespace typesafeenumchangemenu; + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem>(); + iterate([&](TEnum enum_value, const auto &string_value){ // this line needs to be fixed, help required + constructMenuItem>(enum_value); + }); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&espgui::icons::back>>>(); + } +\ + std::string text() const override + { + return fmt::format("Select {}", config.nvsName()); + } +\ + void back() override + { + espgui::switchScreen(); + } +};