Skip to content

Commit 2d729e2

Browse files
committed
Fix menu reset bug
`select` can no longer be used to reset the menu. Instead, a separate `reset` function is provided. Fixes #14
1 parent 7f642d1 commit 2d729e2

File tree

3 files changed

+39
-30
lines changed

3 files changed

+39
-30
lines changed

MenuSystem.cpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,14 @@ MenuComponent* Menu::select()
9292
return this;
9393
}
9494

95+
void Menu::reset()
96+
{
97+
for (int i = 0; i < _num_menu_components; ++i)
98+
_menu_components[i]->reset();
99+
_cur_menu_component_num = 0;
100+
_p_sel_menu_component = _menu_components[0];
101+
}
102+
95103
void Menu::add_item(MenuItem* pItem, void (*on_select)(MenuItem*))
96104
{
97105
// Resize menu component list, keeping existing items.
@@ -187,6 +195,11 @@ MenuComponent* MenuItem::select()
187195
return 0;
188196
}
189197

198+
void MenuItem::reset()
199+
{
200+
// Do nothing.
201+
}
202+
190203
// *********************************************************
191204
// MenuSystem
192205
// *********************************************************
@@ -207,22 +220,18 @@ boolean MenuSystem::prev(boolean loop)
207220
return _p_curr_menu->prev(loop);
208221
}
209222

210-
void MenuSystem::select(boolean return_to_root)
223+
void MenuSystem::reset()
224+
{
225+
_p_curr_menu = _p_root_menu;
226+
_p_root_menu->reset();
227+
}
228+
229+
void MenuSystem::select()
211230
{
212231
MenuComponent* pComponent = _p_curr_menu->activate();
213232

214233
if (pComponent != NULL)
215-
{
216234
_p_curr_menu = (Menu*) pComponent;
217-
}
218-
else
219-
{
220-
// A menu item was selected.
221-
// If return_to_root is true, reset the menu ready for when it's used
222-
// again; otherwise, the current menu is remembered.
223-
if (return_to_root)
224-
_p_curr_menu = _p_root_menu;
225-
}
226235
}
227236

228237
boolean MenuSystem::back()

MenuSystem.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class MenuComponent
2121
const char* get_name() const;
2222

2323
virtual MenuComponent* select() = 0;
24+
virtual void reset() = 0;
2425

2526
protected:
2627
const char* _name;
@@ -35,6 +36,7 @@ class MenuItem : public MenuComponent
3536
void set_select_function(void (*on_select)(MenuItem*));
3637

3738
virtual MenuComponent* select();
39+
virtual void reset();
3840

3941
private:
4042
void (*_on_select)(MenuItem*);
@@ -50,6 +52,7 @@ class Menu : public MenuComponent
5052
boolean prev(boolean loop=false);
5153
MenuComponent* activate();
5254
virtual MenuComponent* select();
55+
virtual void reset();
5356

5457
void add_item(MenuItem* pItem, void (*on_select)(MenuItem*));
5558
Menu const* add_menu(Menu* pMenu);
@@ -79,7 +82,8 @@ class MenuSystem
7982

8083
boolean next(boolean loop=false);
8184
boolean prev(boolean loop=false);
82-
void select(boolean return_to_root=true);
85+
void reset();
86+
void select();
8387
boolean back();
8488

8589
void set_root_menu(Menu* p_root_menu);

examples/current_item/current_item.ino

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,17 @@ MenuItem mm_mi1("Level 1 - Item 1 (Item)");
1616
MenuItem mm_mi2("Level 1 - Item 2 (Item)");
1717
Menu mu1("Level 1 - Item 3 (Menu)");
1818
MenuItem mu1_mi1("Level 2 - Item 1 (Item)");
19-
20-
// Example variables
21-
bool bRanCallback = false;
22-
bool bForward = true;
19+
MenuItem mu1_mi2("Level 2 - Item 2 (Item)");
2320

2421
// Menu callback function
2522
// In this example all menu items use the same callback.
2623

24+
bool bRanCallback = false;
25+
2726
void on_item1_selected(MenuItem* p_menu_item)
2827
{
2928
Serial.println("Item1 Selected");
3029
bRanCallback = true;
31-
bForward = true;
3230
}
3331

3432
void on_item2_selected(MenuItem* p_menu_item)
@@ -41,42 +39,40 @@ void on_item3_selected(MenuItem* p_menu_item)
4139
{
4240
Serial.println("Item3 Selected");
4341
bRanCallback = true;
44-
bForward = false;
42+
}
43+
44+
void on_item4_selected(MenuItem* p_menu_item)
45+
{
46+
Serial.println("Item4 Selected");
47+
bRanCallback = false;
48+
ms.reset();
4549
}
4650

4751
// Standard arduino functions
4852

4953
void setup()
5054
{
5155
Serial.begin(9600);
52-
56+
5357
// Menu setup
5458
mm.add_item(&mm_mi1, &on_item1_selected);
5559
mm.add_item(&mm_mi2, &on_item2_selected);
5660
mm.add_menu(&mu1);
5761
mu1.add_item(&mu1_mi1, &on_item3_selected);
62+
mu1.add_item(&mu1_mi2, &on_item4_selected);
5863
ms.set_root_menu(&mm);
5964
}
6065

6166
void loop()
6267
{
63-
Serial.println("");
64-
65-
// Display the menu
6668
Serial.println(ms.get_current_menu()->get_selected()->get_name());
67-
68-
// Simulate using the menu by walking over the entire structure.
6969
ms.select();
70-
7170
if (bRanCallback)
7271
{
73-
if (bForward)
7472
ms.next();
75-
else
76-
ms.prev();
77-
bRanCallback = false;
73+
bRanCallback = false;
7874
}
79-
75+
8076
// Wait for two seconds so the output is viewable
8177
delay(2000);
8278
}

0 commit comments

Comments
 (0)