diff --git a/src/bobby_webserver.h b/src/bobby_webserver.h index 9112bf8..923b033 100644 --- a/src/bobby_webserver.h +++ b/src/bobby_webserver.h @@ -177,7 +177,13 @@ void initWebserver() return; } - menuDisplay->itemPressed(index); + if (index < 0 || index >= menuDisplay->size()) + { + webServer.send(400, "text/plain", "index out of range"); + return; + } + + menuDisplay->getMenuItem(index).triggered(); webServer.sendHeader("Connection", "close"); webServer.sendHeader("Location", "/"); diff --git a/src/displays/menus/wifiscanmenu.h b/src/displays/menus/wifiscanmenu.h index 09985ec..7ca7666 100644 --- a/src/displays/menus/wifiscanmenu.h +++ b/src/displays/menus/wifiscanmenu.h @@ -30,6 +30,24 @@ public: void update() override; void stop() override; + std::size_t size() const override { return 1 + vec.size(); } + + MenuItem& getMenuItem(std::size_t index) override + { + if (index == vec.size()) + return m_backItem; + + return vec[index]; + } + + const MenuItem& getMenuItem(std::size_t index) const override + { + if (index == vec.size()) + return m_backItem; + + return vec[index]; + } + void runForEveryMenuItem(std::function &&callback) override { for (auto &item : vec) diff --git a/src/menudefinitioninterface.h b/src/menudefinitioninterface.h index 6e6ebe6..cc08847 100644 --- a/src/menudefinitioninterface.h +++ b/src/menudefinitioninterface.h @@ -8,6 +8,11 @@ namespace { class MenuDefinitionInterface { public: + virtual std::size_t size() const = 0; + + virtual MenuItem& getMenuItem(std::size_t index) = 0; + virtual const MenuItem& getMenuItem(std::size_t index) const = 0; + virtual void runForEveryMenuItem(std::function &&callback) = 0; virtual void runForEveryMenuItem(std::function &&callback) const = 0; }; diff --git a/src/menudisplay.h b/src/menudisplay.h index b522330..45f475b 100644 --- a/src/menudisplay.h +++ b/src/menudisplay.h @@ -104,11 +104,7 @@ void MenuDisplay::update() const auto offset = m_rotateOffset; m_rotateOffset = 0; - const auto itemCount = [&](){ - int i{0}; - runForEveryMenuItem([&](MenuItem&){ i++; }); - return i; - }(); + const auto itemCount = size(); if (itemCount) { @@ -251,9 +247,6 @@ void MenuDisplay::itemPressed(int index) { int i{0}; - runForEveryMenuItem([&](MenuItem &item){ - if (i++ == index) - item.triggered(); - }); + getMenuItem(index).triggered(); } } diff --git a/src/staticmenudefinition.h b/src/staticmenudefinition.h index 6f3d189..83143ef 100644 --- a/src/staticmenudefinition.h +++ b/src/staticmenudefinition.h @@ -10,6 +10,24 @@ template class StaticMenuDefinition : public virtual MenuDefinitionInterface { public: + std::size_t size() const override { return 1; } + + MenuItem& getMenuItem(std::size_t index) override + { + if (index == 0) + return item; + + throw "aua"; + } + + const MenuItem& getMenuItem(std::size_t index) const override + { + if (index == 0) + return item; + + throw "aua"; + } + void runForEveryMenuItem(std::function &&callback) override { callback(item); @@ -30,6 +48,24 @@ class StaticMenuDefinition : public virtual StaticMenuDefinition; public: + std::size_t size() const override { return 1 + sizeof...(Tmore); } + + MenuItem& getMenuItem(std::size_t index) override + { + if (index == 0) + return item; + + return Base::getMenuItem(index - 1); + } + + const MenuItem& getMenuItem(std::size_t index) const override + { + if (index == 0) + return item; + + return Base::getMenuItem(index - 1); + } + void runForEveryMenuItem(std::function &&callback) override { callback(item);