Skip to content

Commit 20a3aff

Browse files
author
dave
committed
#204 introduce a ROOT item so we can differentiate between menu outside of structure and ROOT.
1 parent ebdfaf7 commit 20a3aff

File tree

6 files changed

+29
-17
lines changed

6 files changed

+29
-17
lines changed

examples/arduino32/stm32DuinoDemo/stm32DuinoDemo.ino

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ void setup() {
125125
// lastly, we set the card layout for the main "root" menu. The last parameter is an optional touch screen interface
126126
// that the card layout will interact with, to "flip" between cards. Set to null when no touch screen available.
127127
renderer.enableCardLayout(iconLeft, iconRight, nullptr, true);
128-
renderer.setCardLayoutStatusForSubMenu(&rootMenuItem(), true);
129128

130129
// now we set up the layouts to make the card view look right.
131130
setupGridLayoutForCardView();

src/MenuHistoryNavigator.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
#include "MenuHistoryNavigator.h"
88
#include "MenuIterator.h"
99
#include "RuntimeMenuItem.h"
10+
#include "tcMenu.h"
1011

1112
void tcnav::MenuNavigationStore::setRootItem(MenuItem *item) {
1213
root = item;
1314
currentRoot = root;
14-
currentSub = nullptr;
15+
currentSub = &MenuManager::ROOT;
1516
navIdx = 0;
1617
currentIsCustom = false;
1718
triggerNavigationListener(false);
@@ -38,7 +39,7 @@ MenuItem *tcnav::MenuNavigationStore::popNavigationGetActive() {
3839
currentIsCustom = false;
3940
if(navIdx == 0) {
4041
serlogF(SER_TCMENU_INFO, "Nav pop root");
41-
currentSub = nullptr;
42+
currentSub = &MenuManager::ROOT;
4243
currentRoot = root;
4344
triggerNavigationListener(false);
4445
return root;

src/MenuIterator.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,6 @@ MenuItem* getSubRecurse(MenuItem* toSearch, MenuItem* subMenu, MenuItem* current
217217
}
218218

219219
MenuItem* getSubMenuFor(MenuItem* current) {
220-
if(current == nullptr) return nullptr;
221-
return getSubRecurse(menuMgr.getRoot(), nullptr, current);
220+
if(current == nullptr) return nullptr; // we cannot traverse: null -> null
221+
return getSubRecurse(&MenuManager::ROOT, nullptr, current);
222222
}

src/graphics/CardLayoutPanel.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,19 @@ CardLayoutPane::CardLayoutPane(const DrawableIcon *left, const DrawableIcon *rig
1616
}
1717

1818
bool CardLayoutPane::isSubMenuCardLayout(MenuItem *item) {
19-
menuid_t itemId = item != nullptr ? item->getId() : 0;
20-
SubMenuUsingCardLayout* sc = usingCardLayout.getByKey(itemId);
19+
if(item == nullptr) return false; // it is an unmanaged menu, so cannot be card layout.
20+
SubMenuUsingCardLayout* sc = usingCardLayout.getByKey(item->getId());
2121
return (sc && sc->getState());
2222
}
2323

2424
void CardLayoutPane::setEnablementForSub(MenuItem *item, bool onOrOff) {
25-
menuid_t itemId = item != nullptr ? item->getId() : 0;
26-
SubMenuUsingCardLayout* existing = usingCardLayout.getByKey(itemId);
25+
if(item == nullptr) return;
26+
27+
SubMenuUsingCardLayout* existing = usingCardLayout.getByKey(item->getId());
2728
if(existing != nullptr) {
2829
existing->setState(onOrOff);
2930
} else {
30-
usingCardLayout.add(SubMenuUsingCardLayout(itemId, onOrOff));
31+
usingCardLayout.add(SubMenuUsingCardLayout(item->getId(), onOrOff));
3132
}
3233
}
3334

src/tcMenu.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515

1616
MenuManager menuMgr;
1717

18+
const SubMenuInfo TCGLB_ROOT_SUB_INFO PROGMEM = { "ROOT", 0, (uint16_t)-1, 1, nullptr };
19+
SubMenuItem MenuManager::ROOT(&TCGLB_ROOT_SUB_INFO, nullptr);
20+
1821
class Digital4WayPassThruListener : public SwitchListener {
1922
private:
2023
pinid_t backPin = -1, nextPin = -1;
@@ -47,7 +50,7 @@ class Digital4WayPassThruListener : public SwitchListener {
4750
void MenuManager::initFor4WayJoystick(MenuRenderer* renderer, MenuItem* root, pinid_t downPin, pinid_t upPin, pinid_t leftPin,
4851
pinid_t rightPin, pinid_t okPin, int speed) {
4952
this->renderer = renderer;
50-
navigator.setRootItem(root);
53+
setRootItem(root);
5154
fourWayPassThru.init(leftPin, rightPin);
5255

5356
if(okPin == 0xffU) {
@@ -62,14 +65,14 @@ void MenuManager::initFor4WayJoystick(MenuRenderer* renderer, MenuItem* root, pi
6265

6366
void MenuManager::initForTwoButton(MenuRenderer *r, MenuItem *root, pinid_t upPin, pinid_t downPin) {
6467
this->renderer = r;
65-
navigator.setRootItem(root);
68+
setRootItem(root);
6669
switches.setEncoder(new TwoButtonSwitchEncoder(upPin, downPin, [](int v) { menuMgr.valueChanged(v); }));
6770
renderer->initialise();
6871
}
6972

7073
void MenuManager::initForUpDownOk(MenuRenderer* renderer, MenuItem* root, pinid_t pinDown, pinid_t pinUp, pinid_t pinOk, int speed) {
7174
this->renderer = renderer;
72-
navigator.setRootItem(root);
75+
setRootItem(root);
7376

7477
switches.addSwitch(pinOk, nullptr);
7578
switches.onRelease(pinOk, [](pinid_t /*key*/, bool held) { menuMgr.onMenuSelect(held); });
@@ -79,7 +82,7 @@ void MenuManager::initForUpDownOk(MenuRenderer* renderer, MenuItem* root, pinid_
7982

8083
void MenuManager::initForEncoder(MenuRenderer* renderer, MenuItem* root, pinid_t encoderPinA, pinid_t encoderPinB, pinid_t encoderButton, EncoderType type) {
8184
this->renderer = renderer;
82-
navigator.setRootItem(root);
85+
setRootItem(root);
8386

8487
switches.addSwitch(encoderButton, nullptr);
8588
switches.onRelease(encoderButton, [](pinid_t /*key*/, bool held) { menuMgr.onMenuSelect(held); });
@@ -130,7 +133,7 @@ void MenuManager::performDirectionMove(bool dirIsBack) {
130133

131134
void MenuManager::initWithoutInput(MenuRenderer* renderer, MenuItem* root) {
132135
this->renderer = renderer;
133-
navigator.setRootItem(root);
136+
setRootItem(root);
134137
renderer->initialise();
135138
}
136139

@@ -475,7 +478,7 @@ void MenuManager::resetMenu(bool completeReset) {
475478

476479
MenuItem* currentActive;
477480
if(completeReset) {
478-
navigator.setRootItem(navigator.getRoot());
481+
setRootItem(navigator.getRoot());
479482
currentActive = nullptr;
480483
} else {
481484
currentActive = navigator.popNavigationGetActive();
@@ -527,6 +530,11 @@ MenuItem *MenuManager::findCurrentActive() {
527530
return bmr->getMenuItemAtIndex(getCurrentMenu(), idx);
528531
}
529532

533+
void MenuManager::setRootItem(MenuItem *pItem) {
534+
ROOT.setChild(pItem);
535+
navigator.setRootItem(pItem);
536+
}
537+
530538
void CurrentEditorRenderingHints::changeEditingParams(CurrentEditorRenderingHints::EditorRenderingType ty, int startOffset, int endOffset) {
531539
if(renderingType == EDITOR_OVERRIDE_LOCK) return;
532540
renderingType = ty;

src/tcMenu.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ class MenuManager {
149149
BtreeList<menuid_t, EncoderWrapOverride> encoderWrapOverrides;
150150
CurrentEditorRenderingHints renderingHints;
151151
public:
152+
static SubMenuItem ROOT;
152153
MenuManager();
153154

154155
/**
@@ -361,7 +362,7 @@ class MenuManager {
361362
/**
362363
* Get the root of all menus, the first menu item basically
363364
*/
364-
MenuItem* getRoot() { return navigator.getRoot(); }
365+
MenuItem* getRoot() { return ROOT.getChild(); }
365366

366367
/**
367368
* Get the renderer that this menu is using
@@ -515,6 +516,8 @@ class MenuManager {
515516

516517
void notifyEditEnd(MenuItem *pItem);
517518
bool notifyEditStarting(MenuItem *pItem);
519+
520+
void setRootItem(MenuItem *pItem);
518521
};
519522

520523
inline bool editorHintNeedsCursor(CurrentEditorRenderingHints::EditorRenderingType ty) {

0 commit comments

Comments
 (0)