// // Created by robtor on 09.12.22. // #ifndef FLOATPUMP_MENU_H #define FLOATPUMP_MENU_H #include #include #include "Menu_Entry.h" #include "LCD_I2C_Driver.h" namespace floatpump { namespace menu { class Menu { public: Menu(LCD_I2C_Driver &driver) : m_driver(driver) { } void addEntry(Menu_Entry entry) { m_entries.push_back(entry); } void addSubmenu(Menu *submenu) { submenu->m_parent = this; m_submenus.push_back(submenu); } std::string printLine() { return m_name; } std::vector getDisplayList() { std::vector list; //first show submenus for(auto it = m_submenus.begin(); it != m_submenus.end(); ++it) { list.push_back((*it)->printLine()); } for(auto it = m_entries.begin(); it != m_entries.end(); ++it) { list.push_back(it->printLine()); } if(m_parent != nullptr) { list.push_back("<- Go Back"); } return list; } int getAllEntriesNum() { return (m_entries.size() + m_submenus.size()) + ((m_parent != nullptr)? 1 : 0); } Menu *getSubmenu(int index) { if(index >= 0 && index < m_submenus.size()) { return m_submenus[index]; } else { return nullptr; } } Menu_Entry *getEntry(int index) { if(index >= m_submenus.size() && index < m_entries.size() + m_submenus.size()) { return &m_entries[index - m_submenus.size()]; } else { return nullptr; } } LCD_I2C_Driver &m_driver; std::vector m_entries; std::vector m_submenus; Menu *m_parent = nullptr; int m_current_index = 0; std::string m_name = "Menu"; private: }; } // floatpump } // menu #endif //FLOATPUMP_MENU_H