Improved menu interfaces for better performance
This commit is contained in:
@@ -177,7 +177,13 @@ void initWebserver()
|
|||||||
return;
|
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("Connection", "close");
|
||||||
webServer.sendHeader("Location", "/");
|
webServer.sendHeader("Location", "/");
|
||||||
|
@@ -30,6 +30,24 @@ public:
|
|||||||
void update() override;
|
void update() override;
|
||||||
void stop() 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
|
void runForEveryMenuItem(std::function<void(MenuItem&)> &&callback) override
|
||||||
{
|
{
|
||||||
for (auto &item : vec)
|
for (auto &item : vec)
|
||||||
|
@@ -8,6 +8,11 @@ namespace {
|
|||||||
class MenuDefinitionInterface
|
class MenuDefinitionInterface
|
||||||
{
|
{
|
||||||
public:
|
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(MenuItem&)> &&callback) = 0;
|
||||||
virtual void runForEveryMenuItem(std::function<void(const MenuItem&)> &&callback) const = 0;
|
virtual void runForEveryMenuItem(std::function<void(const MenuItem&)> &&callback) const = 0;
|
||||||
};
|
};
|
||||||
|
@@ -104,11 +104,7 @@ void MenuDisplay::update()
|
|||||||
const auto offset = m_rotateOffset;
|
const auto offset = m_rotateOffset;
|
||||||
m_rotateOffset = 0;
|
m_rotateOffset = 0;
|
||||||
|
|
||||||
const auto itemCount = [&](){
|
const auto itemCount = size();
|
||||||
int i{0};
|
|
||||||
runForEveryMenuItem([&](MenuItem&){ i++; });
|
|
||||||
return i;
|
|
||||||
}();
|
|
||||||
|
|
||||||
if (itemCount)
|
if (itemCount)
|
||||||
{
|
{
|
||||||
@@ -251,9 +247,6 @@ void MenuDisplay::itemPressed(int index)
|
|||||||
{
|
{
|
||||||
int i{0};
|
int i{0};
|
||||||
|
|
||||||
runForEveryMenuItem([&](MenuItem &item){
|
getMenuItem(index).triggered();
|
||||||
if (i++ == index)
|
|
||||||
item.triggered();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -10,6 +10,24 @@ template<typename T>
|
|||||||
class StaticMenuDefinition<T> : public virtual MenuDefinitionInterface
|
class StaticMenuDefinition<T> : public virtual MenuDefinitionInterface
|
||||||
{
|
{
|
||||||
public:
|
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
|
void runForEveryMenuItem(std::function<void(MenuItem&)> &&callback) override
|
||||||
{
|
{
|
||||||
callback(item);
|
callback(item);
|
||||||
@@ -30,6 +48,24 @@ class StaticMenuDefinition<T, Tmore...> : public virtual StaticMenuDefinition<Tm
|
|||||||
using Base = StaticMenuDefinition<Tmore...>;
|
using Base = StaticMenuDefinition<Tmore...>;
|
||||||
|
|
||||||
public:
|
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
|
void runForEveryMenuItem(std::function<void(MenuItem&)> &&callback) override
|
||||||
{
|
{
|
||||||
callback(item);
|
callback(item);
|
||||||
|
Reference in New Issue
Block a user