tcMenu
Toggle main menu visibility
Loading...
Searching...
No Matches
src
tcMenu.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2018 https://www.thecoderscorner.com (Dave Cherry).
3
* This product is licensed under an Apache license, see the LICENSE file in the top-level directory.
4
*/
5
6
#ifndef TCMENU_MANAGER_H
7
#define TCMENU_MANAGER_H
8
9
#include <IoAbstraction.h>
10
#include "
tcUtil.h
"
11
#include "
MenuItems.h
"
12
#include "
MenuHistoryNavigator.h
"
13
#include "
RuntimeMenuItem.h
"
14
#include "
BaseRenderers.h
"
15
#include "
RemoteAuthentication.h
"
16
#include "
EepromItemStorage.h
"
17
18
// forward reference
19
class
MenuRenderer
;
20
27
28
class
SecuredMenuPopup
;
29
34
class
MenuManagerObserver
{
35
public
:
40
virtual
void
structureHasChanged
()=0;
41
47
virtual
bool
menuEditStarting
(
MenuItem
* item)=0;
48
55
virtual
void
menuEditEnded
(
MenuItem
* item)=0;
56
62
virtual
void
activeItemHasChanged
(
MenuItem
*
/*newActive*/
) {}
63
};
64
68
class
CommitCallbackObserver :
public
MenuManagerObserver
{
69
private
:
70
MenuCallbackFn
commitCb;
71
public
:
72
explicit
CommitCallbackObserver(
MenuCallbackFn
callbackFn) {
73
commitCb = callbackFn;
74
}
75
76
void
structureHasChanged
()
override
{}
77
bool
menuEditStarting
(
MenuItem
*)
override
{
return
true
; }
78
void
menuEditEnded
(
MenuItem
* item)
override
{
79
commitCb(item->
getId
());
80
}
81
};
82
83
#ifndef MAX_MENU_NOTIFIERS
84
#define MAX_MENU_NOTIFIERS 4
85
#endif
86
90
class
EncoderWrapOverride {
91
private
:
92
menuid_t itemId;
93
bool
overrideValue;
94
public
:
95
EncoderWrapOverride() =
default
;
96
EncoderWrapOverride(
const
EncoderWrapOverride &other) =
default
;
97
EncoderWrapOverride &operator=(
const
EncoderWrapOverride &other) =
default
;
98
EncoderWrapOverride(menuid_t itemId,
bool
overrideValue) : itemId(itemId), overrideValue(overrideValue) {}
99
100
menuid_t getKey()
const
{
return
itemId; }
101
102
menuid_t getMenuId()
const
{
return
itemId; }
103
bool
getOverrideValue()
const
{
return
overrideValue; }
104
};
105
111
class
CurrentEditorRenderingHints {
112
public
:
116
enum
EditorRenderingType
{
117
EDITOR_REGULAR = 0,
118
EDITOR_WHOLE_ONLY = 0x0001, EDITOR_FRACTION_ONLY = 0x0002,
119
EDITOR_RUNTIME_TEXT = 0x0004,
120
EDITOR_OVERRIDE_LOCK = 0x8000
121
};
122
private
:
123
EditorRenderingType
renderingType = EDITOR_REGULAR;
124
int
editStart = 0;
125
int
editEnd = 0;
126
public
:
127
CurrentEditorRenderingHints
() =
default
;
128
void
changeEditingParams(
EditorRenderingType
ty,
int
startOffset,
int
endOffset);
129
void
lockEditor(
bool
lock) { renderingType = lock ? EDITOR_OVERRIDE_LOCK : EDITOR_REGULAR; }
130
EditorRenderingType
getEditorRenderingType()
const
{
return
renderingType; }
131
int
getStartIndex()
const
{
return
editStart; }
132
int
getEndIndex()
const
{
return
editEnd; }
133
};
134
139
class
MenuManager {
140
private
:
141
tcnav::MenuNavigationStore
navigator{};
142
MenuItem
* currentEditor;
143
MenuRenderer
* renderer;
144
SecuredMenuPopup
* securedMenuPopup;
145
AuthenticationManager
*authenticationManager;
146
EepromAbstraction* eepromRef;
147
MenuManagerObserver
* structureNotifier[MAX_MENU_NOTIFIERS];
148
bool
useWrapAroundByDefault =
false
;
149
BtreeList<menuid_t, EncoderWrapOverride> encoderWrapOverrides;
150
CurrentEditorRenderingHints
renderingHints;
151
public
:
152
static
SubMenuItem
ROOT;
153
MenuManager();
154
160
void
setUseWrapAroundEncoder
(
bool
wrapAround) {
161
useWrapAroundByDefault = wrapAround;
162
}
163
174
void
addEncoderWrapOverride
(
MenuItem
& item,
bool
override
);
175
183
bool
isWrapAroundEncoder
(
MenuItem
* item);
184
194
void
initForEncoder
(
MenuRenderer
* renderer,
MenuItem
* root, pinid_t encoderPinA, pinid_t encoderPinB, pinid_t encoderButton, EncoderType type = FULL_CYCLE);
195
205
void
initForUpDownOk
(
MenuRenderer
* renderer,
MenuItem
* root, pinid_t downPin, pinid_t upPin, pinid_t okPin,
int
speed=20);
206
219
void
initFor4WayJoystick
(
MenuRenderer
* renderer,
MenuItem
* root, pinid_t downPin, pinid_t upPin, pinid_t leftPin,
220
pinid_t rightPin, pinid_t okPin,
int
speed=20);
221
229
void
initForTwoButton
(
MenuRenderer
* renderer,
MenuItem
* root, pinid_t upPin, pinid_t downPin);
230
243
void
initWithoutInput
(
MenuRenderer
* renderer,
MenuItem
* root);
244
249
void
setBackButton
(pinid_t backButtonPin);
250
255
void
setNextButton
(pinid_t nextButtonPin);
256
261
void
setRootMenu
(
MenuItem
* menuItem) {
262
navigator.setRootItem(menuItem);
263
}
264
271
void
setAuthenticator
(
AuthenticationManager
* manager) { authenticationManager = manager; }
272
276
AuthenticationManager
*
getAuthenticator
() {
277
if
(authenticationManager ==
nullptr
) authenticationManager =
new
NoAuthenticationManager
();
278
return
authenticationManager;
279
}
280
287
void
setItemCommittedHook
(
MenuCallbackFn
commitCallback) {
288
addChangeNotification
(
new
CommitCallbackObserver
(commitCallback));
289
}
290
295
void
valueChanged
(
int
value);
296
301
void
onMenuSelect
(
bool
held);
302
308
void
performDirectionMove
(
bool
dirIsBack);
309
315
void
setItemsInCurrentMenu
(
int
size,
int
offs = 0);
316
317
EepromAbstraction* getEepromAbstraction() {
return
eepromRef; }
318
323
void
setEepromRef
(EepromAbstraction* globalRom) {
324
eepromRef = globalRom;
325
}
326
331
void
load
(EepromAbstraction& eeprom, uint16_t magicKey = 0xfade, TimerFn onEepromEmpty =
nullptr
);
332
333
338
void
load
(uint16_t magicKey = 0xfade, TimerFn onEepromEmpty =
nullptr
);
339
340
348
void
save
(uint16_t magicKey = 0xfade) {
if
(eepromRef) saveMenuStructure(eepromRef, magicKey); }
349
355
void
save
(EepromAbstraction& eeprom, uint16_t magicKey = 0xfade) { saveMenuStructure(&eeprom, magicKey); }
356
360
MenuItem
*
findCurrentActive
();
361
365
MenuItem
*
getRoot
() {
return
ROOT.getChild(); }
366
370
MenuRenderer
*
getRenderer
() {
return
renderer; }
371
375
MenuItem
*
getCurrentEditor
() {
return
currentEditor; }
376
381
void
setCurrentEditor
(
MenuItem
* editor);
382
388
void
setItemActive
(
MenuItem
* item);
389
394
void
changeMenu
(
MenuItem
* possibleActive=
nullptr
);
395
409
void
navigateToMenu
(
MenuItem
* theNewItem,
MenuItem
* possibleActive =
nullptr
,
bool
skipHistory =
false
);
410
414
void
resetMenu
(
bool
completeReset);
415
419
MenuItem
*
getCurrentMenu
() {
return
navigator.getCurrentRoot(); }
420
424
MenuItem
*
getCurrentSubMenu
() {
return
navigator.getCurrentSubMenu(); }
425
429
tcnav::MenuNavigationStore
&
getNavigationStore
() {
return
navigator; }
430
434
MenuItem
*
getParentAndReset
();
435
440
int
getCurrentRangeValue
() {
441
return
switches.getEncoder() !=
nullptr
? switches.getEncoder()->getCurrentReading() : 0;
442
}
443
449
SecuredMenuPopup
*
secureMenuInstance
();
450
456
void
stopEditingCurrentItem
(
bool
doMultiPartNext);
457
465
void
addMenuAfter
(
MenuItem
* existing,
MenuItem
* toAdd,
bool
silent =
false
);
466
471
void
notifyStructureChanged
();
472
477
void
addChangeNotification
(
MenuManagerObserver
* observer);
478
484
void
recalculateListIfOnDisplay
(
RuntimeMenuItem
* runtimeItem);
485
493
void
setEditorHints
(
CurrentEditorRenderingHints::EditorRenderingType
hint,
size_t
start=0,
size_t
end=0);
494
const
CurrentEditorRenderingHints
& getEditorHints() {
return
renderingHints; }
495
501
void
setEditorHintsLocked
(
bool
locked);
502
506
void
resetObservers
();
507
512
void
setupForEditing
(MenuItem* item);
513
514
protected
:
515
void
actionOnCurrentItem(MenuItem * toEdit);
516
void
actionOnSubMenu(MenuItem* nextSub);
517
518
void
notifyEditEnd(MenuItem *pItem);
519
bool
notifyEditStarting(MenuItem *pItem);
520
521
void
setRootItem(MenuItem *pItem);
522
};
523
524
inline
bool
editorHintNeedsCursor(
CurrentEditorRenderingHints::EditorRenderingType
ty) {
525
return
ty != CurrentEditorRenderingHints::EDITOR_REGULAR && ty != CurrentEditorRenderingHints::EDITOR_OVERRIDE_LOCK;
526
}
527
531
extern
MenuManager
menuMgr;
532
533
#endif
// TCMENU_MANAGER_H
BaseRenderers.h
The base definitions and classes shared by all TcMenu renderers.
EepromItemStorage.h
this file contains a series of helper methods for loading and saving menu item to eeprom.
MenuHistoryNavigator.h
contains the functionality to do with menu item navigation, including a stack of previous navigations
MenuItems.h
In TcMenu, MenuItem storage is shared between program memory and RAM. Usually each MenuItem has assoc...
MenuCallbackFn
void(* MenuCallbackFn)(int id)
Definition
MenuItems.h:45
RemoteAuthentication.h
Contains the base functionality for communication between the menu library and remote APIs.
RuntimeMenuItem.h
Contains definitions of menu items that can be fully defined at runtime with no need for prog mem str...
AuthenticationManager
Definition
RemoteAuthentication.h:38
CommitCallbackObserver
Definition
tcMenu.h:68
CommitCallbackObserver::menuEditEnded
void menuEditEnded(MenuItem *item) override
Definition
tcMenu.h:78
CommitCallbackObserver::structureHasChanged
void structureHasChanged() override
Definition
tcMenu.h:76
CommitCallbackObserver::menuEditStarting
bool menuEditStarting(MenuItem *) override
Definition
tcMenu.h:77
CurrentEditorRenderingHints
Definition
tcMenu.h:111
CurrentEditorRenderingHints::EditorRenderingType
EditorRenderingType
Definition
tcMenu.h:116
MenuItem
Definition
MenuItems.h:338
MenuItem::getId
menuid_t getId() const
Definition
MenuItems.cpp:81
MenuManager
Definition
tcMenu.h:139
MenuManager::addEncoderWrapOverride
void addEncoderWrapOverride(MenuItem &item, bool override)
Definition
tcMenu.cpp:509
MenuManager::performDirectionMove
void performDirectionMove(bool dirIsBack)
Definition
tcMenu.cpp:106
MenuManager::notifyStructureChanged
void notifyStructureChanged()
Definition
tcMenu.cpp:469
MenuManager::addMenuAfter
void addMenuAfter(MenuItem *existing, MenuItem *toAdd, bool silent=false)
Definition
tcMenu.cpp:404
MenuManager::setBackButton
void setBackButton(pinid_t backButtonPin)
Definition
tcMenu.cpp:94
MenuManager::getRenderer
MenuRenderer * getRenderer()
Definition
tcMenu.h:370
MenuManager::initForTwoButton
void initForTwoButton(MenuRenderer *renderer, MenuItem *root, pinid_t upPin, pinid_t downPin)
Definition
tcMenu.cpp:66
MenuManager::recalculateListIfOnDisplay
void recalculateListIfOnDisplay(RuntimeMenuItem *runtimeItem)
Definition
tcMenu.cpp:520
MenuManager::setCurrentEditor
void setCurrentEditor(MenuItem *editor)
Definition
tcMenu.cpp:354
MenuManager::addChangeNotification
void addChangeNotification(MenuManagerObserver *observer)
Definition
tcMenu.cpp:414
MenuManager::navigateToMenu
void navigateToMenu(MenuItem *theNewItem, MenuItem *possibleActive=nullptr, bool skipHistory=false)
Definition
tcMenu.cpp:504
MenuManager::setUseWrapAroundEncoder
void setUseWrapAroundEncoder(bool wrapAround)
Definition
tcMenu.h:160
MenuManager::save
void save(EepromAbstraction &eeprom, uint16_t magicKey=0xfade)
Definition
tcMenu.h:355
MenuManager::getCurrentMenu
MenuItem * getCurrentMenu()
Definition
tcMenu.h:419
MenuManager::getNavigationStore
tcnav::MenuNavigationStore & getNavigationStore()
Definition
tcMenu.h:429
MenuManager::initFor4WayJoystick
void initFor4WayJoystick(MenuRenderer *renderer, MenuItem *root, pinid_t downPin, pinid_t upPin, pinid_t leftPin, pinid_t rightPin, pinid_t okPin, int speed=20)
Definition
tcMenu.cpp:50
MenuManager::getCurrentEditor
MenuItem * getCurrentEditor()
Definition
tcMenu.h:375
MenuManager::setItemActive
void setItemActive(MenuItem *item)
Definition
tcMenu.cpp:180
MenuManager::load
void load(EepromAbstraction &eeprom, uint16_t magicKey=0xfade, TimerFn onEepromEmpty=nullptr)
Definition
tcMenu.cpp:436
MenuManager::stopEditingCurrentItem
void stopEditingCurrentItem(bool doMultiPartNext)
Definition
tcMenu.cpp:281
MenuManager::setupForEditing
void setupForEditing(MenuItem *item)
Definition
tcMenu.cpp:319
MenuManager::secureMenuInstance
SecuredMenuPopup * secureMenuInstance()
Definition
tcMenu.cpp:391
MenuManager::resetMenu
void resetMenu(bool completeReset)
Definition
tcMenu.cpp:490
MenuManager::setAuthenticator
void setAuthenticator(AuthenticationManager *manager)
Definition
tcMenu.h:271
MenuManager::initWithoutInput
void initWithoutInput(MenuRenderer *renderer, MenuItem *root)
Definition
tcMenu.cpp:134
MenuManager::getCurrentRangeValue
int getCurrentRangeValue()
Definition
tcMenu.h:440
MenuManager::changeMenu
void changeMenu(MenuItem *possibleActive=nullptr)
Definition
tcMenu.cpp:367
MenuManager::onMenuSelect
void onMenuSelect(bool held)
Definition
tcMenu.cpp:201
MenuManager::findCurrentActive
MenuItem * findCurrentActive()
Definition
tcMenu.cpp:541
MenuManager::isWrapAroundEncoder
bool isWrapAroundEncoder(MenuItem *item)
Definition
tcMenu.cpp:513
MenuManager::setEditorHintsLocked
void setEditorHintsLocked(bool locked)
Definition
tcMenu.cpp:536
MenuManager::save
void save(uint16_t magicKey=0xfade)
Definition
tcMenu.h:348
MenuManager::setEditorHints
void setEditorHints(CurrentEditorRenderingHints::EditorRenderingType hint, size_t start=0, size_t end=0)
Definition
tcMenu.cpp:531
MenuManager::getCurrentSubMenu
MenuItem * getCurrentSubMenu()
Definition
tcMenu.h:424
MenuManager::initForUpDownOk
void initForUpDownOk(MenuRenderer *renderer, MenuItem *root, pinid_t downPin, pinid_t upPin, pinid_t okPin, int speed=20)
Definition
tcMenu.cpp:73
MenuManager::initForEncoder
void initForEncoder(MenuRenderer *renderer, MenuItem *root, pinid_t encoderPinA, pinid_t encoderPinB, pinid_t encoderButton, EncoderType type=FULL_CYCLE)
Definition
tcMenu.cpp:83
MenuManager::resetObservers
void resetObservers()
Definition
tcMenu.cpp:423
MenuManager::setEepromRef
void setEepromRef(EepromAbstraction *globalRom)
Definition
tcMenu.h:323
MenuManager::setItemCommittedHook
void setItemCommittedHook(MenuCallbackFn commitCallback)
Definition
tcMenu.h:287
MenuManager::getParentAndReset
MenuItem * getParentAndReset()
Definition
tcMenu.cpp:308
MenuManager::setItemsInCurrentMenu
void setItemsInCurrentMenu(int size, int offs=0)
Definition
tcMenu.cpp:482
MenuManager::valueChanged
void valueChanged(int value)
Definition
tcMenu.cpp:153
MenuManager::setNextButton
void setNextButton(pinid_t nextButtonPin)
Definition
tcMenu.cpp:100
MenuManager::getRoot
MenuItem * getRoot()
Definition
tcMenu.h:365
MenuManager::setRootMenu
void setRootMenu(MenuItem *menuItem)
Definition
tcMenu.h:261
MenuManager::getAuthenticator
AuthenticationManager * getAuthenticator()
Definition
tcMenu.h:276
MenuManagerObserver
Definition
tcMenu.h:34
MenuManagerObserver::menuEditEnded
virtual void menuEditEnded(MenuItem *item)=0
MenuManagerObserver::structureHasChanged
virtual void structureHasChanged()=0
MenuManagerObserver::activeItemHasChanged
virtual void activeItemHasChanged(MenuItem *)
Definition
tcMenu.h:62
MenuManagerObserver::menuEditStarting
virtual bool menuEditStarting(MenuItem *item)=0
MenuRenderer
Definition
BaseRenderers.h:198
NoAuthenticationManager
Definition
RemoteAuthentication.h:171
RuntimeMenuItem
Definition
RuntimeMenuItem.h:75
SecuredMenuPopup
Definition
SecuredMenuPopup.h:40
SubMenuItem
Definition
RuntimeMenuItem.h:149
tcnav::MenuNavigationStore
Definition
MenuHistoryNavigator.h:30
tcUtil.h
A series of utilities that used throughout tcMenu.