Byggern
menu.h
1 #pragma once
2 
3 #include <avr/io.h>
4 #include <stdio.h>
5 
6 #include "../oled/oled.h"
7 
19 namespace Menu {
20 
27  struct Item {
28 
32  char *label = nullptr;
33 
37  uint8_t label_length;
38 
43  void *action = nullptr;
44 
48  bool has_sub_menu = false;
49 
53  Item *next = nullptr;
54 
55  Item(char *label, uint8_t label_length);
56 
61  void AddAction(void (*fn)());
62  };
63 
64 
68  struct Menu {
69 
73  Menu *parent = nullptr;
74 
78  Item *first = nullptr;
79  };
80 
84  class Controller {
85 
86  private:
87 
91  OLED *oled = nullptr;
92 
96  uint8_t num_lines;
97 
102 
108  Menu *current_menu_control = nullptr;
109 
113  Item *current_item_control = nullptr;
114 
115 
120  Menu *current_menu_navigate = nullptr;
121 
125  Item *current_item_navigate = nullptr;
126 
135  uint8_t current_index_navigate = 0;
136 
140  uint8_t current_index_selected = 0;
141 
150  uint8_t GetMenuLength(Menu *menu);
151 
159  void GoToItem(uint8_t index);
160 
165  bool GoToNextItem();
166 
167 
168  public:
169 
175  Controller(OLED& oled, uint8_t num_lines);
176 
182  void Initialize(OLED &oled, uint8_t num_lines);
183 
187  void ControlGoToRoot();
188 
193  void ControlGoToItem(uint8_t index);
194 
198  void ControlEnterSubMenu();
199 
205  void ControlEnterSubMenu(uint8_t index);
206 
211  void ControlGoToParent();
212 
213 
223  void AddMenu(Item **items, uint8_t length);
224 
230  void AddMenuItems(Item **items, uint8_t length);
231 
237  void AddMenuItem(Item *item);
238 
245  void AddMenuItem(Item *item, uint8_t index);
246 
252  void GoToMenu(Menu *menu);
253 
259  void GoToRoot();
260 
265  void GoToParent();
266 
271  void SelectNext();
272 
277  void SelectPrevious();
278 
283  void ExecuteItem();
284 
285 
292  void Render();
293  };
294 }
This class contains everything needed to create and manage a menu and display it on an OLED...
Definition: menu.h:84
This is a namespace containing everything needed to implement a menu.
Definition: menu.cpp:21
Item * next
Definition: menu.h:53
char * label
Definition: menu.h:32
Struct containing a sigle menu item.
Definition: menu.h:27
bool has_sub_menu
Definition: menu.h:48
An interface to communicate with the OLED display.
Definition: oled.h:10
uint8_t label_length
Definition: menu.h:37
void AddAction(void(*fn)())
Definition: menu.cpp:27
void * action
Definition: menu.h:43
Menu * root
Definition: menu.h:101
uint8_t num_lines
Definition: menu.h:96