Improved menu interfaces for better performance
This commit is contained in:
@ -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", "/");
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user