Improved menu interfaces for better performance

This commit is contained in:
2020-06-27 20:37:19 +02:00
parent 06d3df0aea
commit 470eea0dbe
5 changed files with 68 additions and 10 deletions

View File

@ -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", "/");

View File

@ -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<void(MenuItem&)> &&callback) override
{
for (auto &item : vec)

View File

@ -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<void(MenuItem&)> &&callback) = 0;
virtual void runForEveryMenuItem(std::function<void(const MenuItem&)> &&callback) const = 0;
};

View File

@ -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();
}
}

View File

@ -10,6 +10,24 @@ template<typename T>
class StaticMenuDefinition<T> : 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<void(MenuItem&)> &&callback) override
{
callback(item);
@ -30,6 +48,24 @@ class StaticMenuDefinition<T, Tmore...> : public virtual StaticMenuDefinition<Tm
using Base = StaticMenuDefinition<Tmore...>;
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<void(MenuItem&)> &&callback) override
{
callback(item);