tcMenu
Loading...
Searching...
No Matches
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"
13#include "RuntimeMenuItem.h"
14#include "BaseRenderers.h"
16#include "EepromItemStorage.h"
17
18// forward reference
19class MenuRenderer;
20
27
29
35public:
36 virtual ~MenuManagerObserver() = default;
41 virtual void structureHasChanged()=0;
42
48 virtual bool menuEditStarting(MenuItem* item)=0;
49
56 virtual void menuEditEnded(MenuItem* item)=0;
57
63 virtual void activeItemHasChanged(MenuItem* /*newActive*/) {}
64};
65
69class CommitCallbackObserver : public MenuManagerObserver {
70private:
71 MenuCallbackFn commitCb;
72public:
73 explicit CommitCallbackObserver(MenuCallbackFn callbackFn) {
74 commitCb = callbackFn;
75 }
76
77 void structureHasChanged() override {}
78 bool menuEditStarting(MenuItem*) override { return true; }
79 void menuEditEnded(MenuItem* item) override {
80 commitCb(item->getId());
81 }
82};
83
84#ifndef MAX_MENU_NOTIFIERS
85#define MAX_MENU_NOTIFIERS 4
86#endif
87
91class EncoderWrapOverride {
92private:
93 menuid_t itemId;
94 bool overrideValue;
95public:
96 EncoderWrapOverride() = default;
97 EncoderWrapOverride(const EncoderWrapOverride &other) = default;
98 EncoderWrapOverride &operator=(const EncoderWrapOverride &other) = default;
99 EncoderWrapOverride(menuid_t itemId, bool overrideValue) : itemId(itemId), overrideValue(overrideValue) {}
100
101 menuid_t getKey() const { return itemId; }
102
103 menuid_t getMenuId() const { return itemId; }
104 bool getOverrideValue() const { return overrideValue; }
105};
106
112class CurrentEditorRenderingHints {
113public:
118 EDITOR_REGULAR = 0,
119 EDITOR_WHOLE_ONLY = 0x0001, EDITOR_FRACTION_ONLY = 0x0002,
120 EDITOR_RUNTIME_TEXT = 0x0004,
121 EDITOR_OVERRIDE_LOCK = 0x8000
122 };
123private:
124 EditorRenderingType renderingType = EDITOR_REGULAR;
125 int editStart = 0;
126 int editEnd = 0;
127public:
128 CurrentEditorRenderingHints() = default;
129 void changeEditingParams(EditorRenderingType ty, int startOffset, int endOffset);
130 void lockEditor(bool lock) { renderingType = lock ? EDITOR_OVERRIDE_LOCK : EDITOR_REGULAR; }
131 EditorRenderingType getEditorRenderingType() const { return renderingType; }
132 int getStartIndex() const { return editStart; }
133 int getEndIndex() const { return editEnd; }
134};
135
140class MenuManager {
141private:
142 tcnav::MenuNavigationStore navigator{};
143 MenuItem* currentEditor;
144 MenuRenderer* renderer;
145 SecuredMenuPopup* securedMenuPopup;
146 AuthenticationManager *authenticationManager;
147 EepromAbstraction* eepromRef;
148 MenuManagerObserver* structureNotifier[MAX_MENU_NOTIFIERS];
149 bool useWrapAroundByDefault = false;
150 BtreeList<menuid_t, EncoderWrapOverride> encoderWrapOverrides;
151 CurrentEditorRenderingHints renderingHints;
152public:
153 static SubMenuItem ROOT;
154 MenuManager();
155
161 void setUseWrapAroundEncoder(bool wrapAround) {
162 useWrapAroundByDefault = wrapAround;
163 }
164
175 void addEncoderWrapOverride(MenuItem& item, bool override);
176
184 bool isWrapAroundEncoder(MenuItem* item);
185
195 void initForEncoder(MenuRenderer* renderer, MenuItem* root, pinid_t encoderPinA, pinid_t encoderPinB, pinid_t encoderButton, EncoderType type = FULL_CYCLE);
196
206 void initForUpDownOk(MenuRenderer* renderer, MenuItem* root, pinid_t downPin, pinid_t upPin, pinid_t okPin, int speed=20);
207
220 void initFor4WayJoystick(MenuRenderer* renderer, MenuItem* root, pinid_t downPin, pinid_t upPin, pinid_t leftPin,
221 pinid_t rightPin, pinid_t okPin, int speed=20);
222
230 void initForTwoButton(MenuRenderer* renderer, MenuItem* root, pinid_t upPin, pinid_t downPin);
231
244 void initWithoutInput(MenuRenderer* renderer, MenuItem* root);
245
250 void setBackButton(pinid_t backButtonPin);
251
256 void setNextButton(pinid_t nextButtonPin);
257
262 void setRootMenu(MenuItem* menuItem) {
263 navigator.setRootItem(menuItem);
264 }
265
272 void setAuthenticator(AuthenticationManager* manager) { authenticationManager = manager; }
273
278 if(authenticationManager == nullptr) authenticationManager = new NoAuthenticationManager();
279 return authenticationManager;
280 }
281
290 }
291
296 void valueChanged(int value);
297
302 void onMenuSelect(bool held);
303
309 void performDirectionMove(bool dirIsBack);
310
316 void setItemsInCurrentMenu(int size, int offs = 0);
317
318 EepromAbstraction* getEepromAbstraction() { return eepromRef; }
319
324 void setEepromRef(EepromAbstraction* globalRom) {
325 eepromRef = globalRom;
326 }
327
332 void load(EepromAbstraction& eeprom, uint16_t magicKey = 0xfade, TimerFn onEepromEmpty = nullptr);
333
334
339 void load(uint16_t magicKey = 0xfade, TimerFn onEepromEmpty = nullptr);
340
341
349 void save(uint16_t magicKey = 0xfade) { if(eepromRef) saveMenuStructure(eepromRef, magicKey); }
350
356 void save(EepromAbstraction& eeprom, uint16_t magicKey = 0xfade) { saveMenuStructure(&eeprom, magicKey); }
357
362
366 MenuItem* getRoot() { return ROOT.getChild(); }
367
371 MenuRenderer* getRenderer() { return renderer; }
372
376 MenuItem* getCurrentEditor() { return currentEditor; }
377
382 void setCurrentEditor(MenuItem* editor);
383
389 void setItemActive(MenuItem* item);
390
395 void changeMenu(MenuItem* possibleActive=nullptr);
396
410 void navigateToMenu(MenuItem* theNewItem, MenuItem* possibleActive = nullptr, bool skipHistory = false);
411
415 void resetMenu(bool completeReset);
416
420 MenuItem* getCurrentMenu() { return navigator.getCurrentRoot(); }
421
425 MenuItem* getCurrentSubMenu() { return navigator.getCurrentSubMenu(); }
426
431
436
442 return switches.getEncoder() != nullptr ? switches.getEncoder()->getCurrentReading() : 0;
443 }
444
451
457 void stopEditingCurrentItem(bool doMultiPartNext);
458
466 void addMenuAfter(MenuItem* existing, MenuItem* toAdd, bool silent = false);
467
473
479
486
494 void setEditorHints(CurrentEditorRenderingHints::EditorRenderingType hint, size_t start=0, size_t end=0);
495 const CurrentEditorRenderingHints& getEditorHints() { return renderingHints; }
496
502 void setEditorHintsLocked(bool locked);
503
507 void resetObservers();
508
513 void setupForEditing(MenuItem* item);
514
515protected:
516 void actionOnCurrentItem(MenuItem * toEdit);
517 void actionOnSubMenu(MenuItem* nextSub);
518
519 void notifyEditEnd(MenuItem *pItem);
520 bool notifyEditStarting(MenuItem *pItem);
521
522 void setRootItem(MenuItem *pItem);
523};
524
525inline bool editorHintNeedsCursor(CurrentEditorRenderingHints::EditorRenderingType ty) {
526 return ty != CurrentEditorRenderingHints::EDITOR_REGULAR && ty != CurrentEditorRenderingHints::EDITOR_OVERRIDE_LOCK;
527}
528
532extern MenuManager menuMgr;
533
534#endif // TCMENU_MANAGER_H
The base definitions and classes shared by all TcMenu renderers.
this file contains a series of helper methods for loading and saving menu item to eeprom.
contains the functionality to do with menu item navigation, including a stack of previous navigations
In TcMenu, MenuItem storage is shared between program memory and RAM. Usually each MenuItem has assoc...
void(* MenuCallbackFn)(int id)
Definition MenuItems.h:45
Contains the base functionality for communication between the menu library and remote APIs.
Contains definitions of menu items that can be fully defined at runtime with no need for prog mem str...
Definition RemoteAuthentication.h:38
Definition tcMenu.h:69
void menuEditEnded(MenuItem *item) override
Definition tcMenu.h:79
void structureHasChanged() override
Definition tcMenu.h:77
bool menuEditStarting(MenuItem *) override
Definition tcMenu.h:78
Definition tcMenu.h:112
EditorRenderingType
Definition tcMenu.h:117
Definition MenuItems.h:338
menuid_t getId() const
Definition MenuItems.cpp:81
Definition tcMenu.h:140
void addEncoderWrapOverride(MenuItem &item, bool override)
Definition tcMenu.cpp:509
void performDirectionMove(bool dirIsBack)
Definition tcMenu.cpp:106
void notifyStructureChanged()
Definition tcMenu.cpp:469
void addMenuAfter(MenuItem *existing, MenuItem *toAdd, bool silent=false)
Definition tcMenu.cpp:404
void setBackButton(pinid_t backButtonPin)
Definition tcMenu.cpp:94
MenuRenderer * getRenderer()
Definition tcMenu.h:371
void initForTwoButton(MenuRenderer *renderer, MenuItem *root, pinid_t upPin, pinid_t downPin)
Definition tcMenu.cpp:66
void recalculateListIfOnDisplay(RuntimeMenuItem *runtimeItem)
Definition tcMenu.cpp:520
void setCurrentEditor(MenuItem *editor)
Definition tcMenu.cpp:354
void addChangeNotification(MenuManagerObserver *observer)
Definition tcMenu.cpp:414
void navigateToMenu(MenuItem *theNewItem, MenuItem *possibleActive=nullptr, bool skipHistory=false)
Definition tcMenu.cpp:504
void setUseWrapAroundEncoder(bool wrapAround)
Definition tcMenu.h:161
void save(EepromAbstraction &eeprom, uint16_t magicKey=0xfade)
Definition tcMenu.h:356
MenuItem * getCurrentMenu()
Definition tcMenu.h:420
tcnav::MenuNavigationStore & getNavigationStore()
Definition tcMenu.h:430
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
MenuItem * getCurrentEditor()
Definition tcMenu.h:376
void setItemActive(MenuItem *item)
Definition tcMenu.cpp:180
void load(EepromAbstraction &eeprom, uint16_t magicKey=0xfade, TimerFn onEepromEmpty=nullptr)
Definition tcMenu.cpp:436
void stopEditingCurrentItem(bool doMultiPartNext)
Definition tcMenu.cpp:281
void setupForEditing(MenuItem *item)
Definition tcMenu.cpp:319
SecuredMenuPopup * secureMenuInstance()
Definition tcMenu.cpp:391
void resetMenu(bool completeReset)
Definition tcMenu.cpp:490
void setAuthenticator(AuthenticationManager *manager)
Definition tcMenu.h:272
void initWithoutInput(MenuRenderer *renderer, MenuItem *root)
Definition tcMenu.cpp:134
int getCurrentRangeValue()
Definition tcMenu.h:441
void changeMenu(MenuItem *possibleActive=nullptr)
Definition tcMenu.cpp:367
void onMenuSelect(bool held)
Definition tcMenu.cpp:201
MenuItem * findCurrentActive()
Definition tcMenu.cpp:541
bool isWrapAroundEncoder(MenuItem *item)
Definition tcMenu.cpp:513
void setEditorHintsLocked(bool locked)
Definition tcMenu.cpp:536
void save(uint16_t magicKey=0xfade)
Definition tcMenu.h:349
void setEditorHints(CurrentEditorRenderingHints::EditorRenderingType hint, size_t start=0, size_t end=0)
Definition tcMenu.cpp:531
MenuItem * getCurrentSubMenu()
Definition tcMenu.h:425
void initForUpDownOk(MenuRenderer *renderer, MenuItem *root, pinid_t downPin, pinid_t upPin, pinid_t okPin, int speed=20)
Definition tcMenu.cpp:73
void initForEncoder(MenuRenderer *renderer, MenuItem *root, pinid_t encoderPinA, pinid_t encoderPinB, pinid_t encoderButton, EncoderType type=FULL_CYCLE)
Definition tcMenu.cpp:83
void resetObservers()
Definition tcMenu.cpp:423
void setEepromRef(EepromAbstraction *globalRom)
Definition tcMenu.h:324
void setItemCommittedHook(MenuCallbackFn commitCallback)
Definition tcMenu.h:288
MenuItem * getParentAndReset()
Definition tcMenu.cpp:308
void setItemsInCurrentMenu(int size, int offs=0)
Definition tcMenu.cpp:482
void valueChanged(int value)
Definition tcMenu.cpp:153
void setNextButton(pinid_t nextButtonPin)
Definition tcMenu.cpp:100
MenuItem * getRoot()
Definition tcMenu.h:366
void setRootMenu(MenuItem *menuItem)
Definition tcMenu.h:262
AuthenticationManager * getAuthenticator()
Definition tcMenu.h:277
Definition tcMenu.h:34
virtual void menuEditEnded(MenuItem *item)=0
virtual void structureHasChanged()=0
virtual void activeItemHasChanged(MenuItem *)
Definition tcMenu.h:63
virtual bool menuEditStarting(MenuItem *item)=0
Definition BaseRenderers.h:198
Definition RemoteAuthentication.h:171
Definition RuntimeMenuItem.h:72
Definition SecuredMenuPopup.h:40
Definition RuntimeMenuItem.h:146
Definition MenuHistoryNavigator.h:30
A series of utilities that used throughout tcMenu.