Skip to content

Commit f763ab6

Browse files
author
dave
committed
Interim update midway through feature
1 parent 10ecbcd commit f763ab6

4 files changed

Lines changed: 137 additions & 0 deletions

File tree

src/MenuItems.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,15 @@ struct FloatMenuInfo {
192192
MenuCallbackFn callback;
193193
};
194194

195+
union AllMenuInfoTypes {
196+
AnyMenuInfo anyInfo;
197+
AnalogMenuInfo analogInfo;
198+
EnumMenuInfo enumInfo;
199+
BooleanMenuInfo booleanInfo;
200+
SubMenuInfo subInfo;
201+
FloatMenuInfo floatInfo;
202+
};
203+
195204
/**
196205
* Each menu item can be in the following states.
197206
*/

src/TcMenuBuilder.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
//
2+
// Created by David Cherry on 22/01/2026.
3+
//
4+
5+
#include "TcMenuBuilder.h"
6+
7+
#include "tcMenu.h"
8+
9+
void MenuFlags::setOnMenuItem(MenuItem &item) const {
10+
item.setReadOnly((flags & INT_MENU_FLAG_READ)!=0);
11+
item.setSecured((flags & INT_MENU_FLAG_SECURE)!=0);
12+
item.setLocalOnly((flags & INT_MENU_FLAG_LOCAL)!=0);
13+
if ((flags & INT_MENU_FLAG_HIDE)!=0) {
14+
item.setVisible(false);
15+
}
16+
}
17+
18+
BtreeList<menuid_t, AnyInfoReserve> infoAllocator;
19+
20+
void TcMenuBuilder::putAtEndOfMenu(MenuItem * toAdd) {
21+
int loopcount = 0;
22+
auto item = &localRoot;
23+
while (item && item->getNext() && loopcount < 100) {
24+
++loopcount;
25+
item = item->getNext();
26+
}
27+
if (item) {
28+
item->setNext(toAdd);
29+
}
30+
}
31+
32+
AnyInfoReserve* TcMenuBuilder::fillInAnyInfo(menuid_t id, const char *name, int eeprom, int maxVal, MenuCallbackFn callback_fn) {
33+
AnyInfoReserve reserve;
34+
reserve.getInfo()->anyInfo.id = id;
35+
strncpy(reserve.getInfo()->anyInfo.name, name, NAME_SIZE_T);
36+
reserve.getInfo()->anyInfo.eepromAddr = eepromPosition;
37+
reserve.getInfo()->anyInfo.callback = callbackFn;
38+
reserve.getInfo()->anyInfo.maxValue = maxVal;
39+
infoAllocator.add(reserve);
40+
return infoAllocator.getByKey(id);
41+
}
42+
43+
TcMenuBuilder & TcMenuBuilder::actionItem(menuid_t id, const char *name, MenuFlags flags, MenuCallbackFn callbackFn) {
44+
AnyInfoReserve* reserve = fillInAnyInfo(id, name, 0xFFFF, 0, callbackFn);
45+
auto item = new FloatMenuItem(&reserve.getInfo()->floatInfo, nullptr, false);
46+
flags.setOnMenuItem(*item);
47+
putAtEndOfMenu(item);
48+
return *this;
49+
}
50+
51+
TcMenuBuilder& TcMenuBuilder::floatItem(menuid_t id, const char *name, EepromPosition eepromPosition, uint16_t decimalPlaces, MenuFlags flags, MenuCallbackFn callbackFn) {
52+
AnyInfoReserve* reserve = fillInAnyInfo(id, name, 0xFFFF, decimalPlaces, );
53+
auto item = new FloatMenuItem(&reserve.getInfo()->floatInfo, nullptr, false);
54+
flags.setOnMenuItem(*item);
55+
putAtEndOfMenu(item);
56+
return *this;
57+
}
58+
59+
MenuFlags flags = MenuFlags().localOnly();
60+
61+
MenuItem item(MENUTYPE_FLOAT_VALUE, nullptr, nullptr, false);
62+
TcMenuBuilder builder(item);
63+
64+
void f() {
65+
builder.floatItem(1, "test", 0, 2, MenuFlags().localOnly())
66+
.floatItem(1, "test", 0, 2, NoMenuFlags);
67+
}

src/TcMenuBuilder.h

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
2+
#ifndef TCLIBRARYDEV_TCMENUBUILDER_H
3+
#define TCLIBRARYDEV_TCMENUBUILDER_H
4+
#include "EepromAbstraction.h"
5+
#include "MenuItems.h"
6+
7+
8+
class MenuManager;
9+
10+
#define INT_MENU_FLAG_READ 0x01
11+
#define INT_MENU_FLAG_HIDE 0x02
12+
#define INT_MENU_FLAG_LOCAL 0x04
13+
#define INT_MENU_FLAG_SECURE 0x08
14+
15+
class MenuFlags {
16+
uint8_t flags;
17+
public:
18+
MenuFlags() = default;
19+
~MenuFlags() = default;
20+
21+
MenuFlags& readOnly() { flags |= INT_MENU_FLAG_READ; return *this; }
22+
MenuFlags& hide() { flags |= INT_MENU_FLAG_HIDE; return *this; }
23+
MenuFlags& localOnly() { flags |= INT_MENU_FLAG_LOCAL; return *this; }
24+
MenuFlags& securePin() { flags |= INT_MENU_FLAG_SECURE; return *this; }
25+
26+
void setOnMenuItem(MenuItem& item) const;
27+
};
28+
29+
const MenuFlags NoMenuFlags;
30+
31+
class AnyInfoReserve {
32+
AllMenuInfoTypes info;
33+
public:
34+
AnyInfoReserve() : info() {}
35+
AnyInfoReserve(const AnyInfoReserve&) = default;
36+
AnyInfoReserve& operator=(const AnyInfoReserve&) = default;
37+
~AnyInfoReserve() = default;
38+
menuid_t getKey() const { return info.anyInfo.id; }
39+
bool isInUse() const { return info.anyInfo.id > 0;}
40+
AllMenuInfoTypes* getInfo() { return &info; }
41+
};
42+
43+
class TcMenuBuilder {
44+
private:
45+
MenuItem& localRoot;
46+
public:
47+
TcMenuBuilder(MenuItem& root) : localRoot(root) {}
48+
~TcMenuBuilder() = default;
49+
50+
void putAtEndOfMenu(MenuItem * item);
51+
AnyInfoReserve* fillInAnyInfo(menuid_t id, const char *name, int eeprom, int maxVal, MenuCallbackFn callback_fn);
52+
53+
TcMenuBuilder& floatItem(menuid_t id, const char *name, EepromPosition eepromPosition, uint16_t decimalPlaces, MenuFlags flags, float value = 0.0F, MenuCallbackFn callbackFn = nullptr);
54+
TcMenuBuilder& actionItem(menuid_t id, const char *name, MenuFlags flags, MenuCallbackFn callbackFn = nullptr);
55+
TcMenuBuilder& boolItem(menuid_t id, const char *name, EepromPosition eepromPosition, BooleanNaming naming, MenuFlags flags, bool initial = false, MenuCallbackFn callbackFn = nullptr);
56+
void build(MenuManager& mgr);
57+
};
58+
59+
60+
#endif //TCLIBRARYDEV_TCMENUBUILDER_H

src/tcMenu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,7 @@ class MenuManager {
510510
* @param item the item to become the active edit, the right submenu should have already been enabled first
511511
*/
512512
void setupForEditing(MenuItem* item);
513+
513514
protected:
514515
void actionOnCurrentItem(MenuItem * toEdit);
515516
void actionOnSubMenu(MenuItem* nextSub);

0 commit comments

Comments
 (0)