tcMenu
Loading...
Searching...
No Matches
GfxMenuConfig.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
12
13#ifndef _GFX_MENU_CONFIG_H_
14#define _GFX_MENU_CONFIG_H_
15
16#include <tcUtil.h>
17#include <BTreeList.h>
18#include "MenuItems.h"
19#include "DrawingPrimitives.h"
20#include <IoLogging.h>
21
22
23namespace tcgfx {
24
25#define SPECIAL_ID_EDIT_ICON 0xfffe
26#define SPECIAL_ID_ACTIVE_ICON 0xfffd
27
32 template<typename FONTPTR> struct ColorGfxMenuConfig {
33 color_t bgTitleColor;
34 color_t fgTitleColor;
35 MenuPadding titlePadding;
36 FONTPTR titleFont;
37
38 color_t bgItemColor;
39 color_t fgItemColor;
40 MenuPadding itemPadding;
41 FONTPTR itemFont;
42
43 color_t bgSelectColor;
44 color_t fgSelectColor;
45 color_t widgetColor;
46 MenuPadding widgetPadding;
47
48 const uint8_t* activeIcon;
49 const uint8_t* editIcon;
50 uint8_t editIconWidth;
51 uint8_t editIconHeight;
52
53 uint8_t titleBottomMargin;
54 uint8_t titleFontMagnification;
55 uint8_t itemFontMagnification;
56 };
57
62 void prepareDefaultGfxConfig(ColorGfxMenuConfig<void*>* config);
63
64
69 class GridPosition {
70 public:
88
127 private:
129 uint32_t gridSize: 3;
131 uint32_t gridPosition: 3;
133 uint32_t gridRowSpan: 2;
135 uint32_t gridHeight: 9;
137 uint32_t rowPosition: 7;
139 uint32_t drawingMode: 4;
141 uint32_t justification: 4;
142 public:
143 GridPosition() : gridSize(0), gridPosition(0), gridHeight(0), rowPosition(0), drawingMode(0),
144 justification(JUSTIFY_TITLE_LEFT_VALUE_RIGHT) {}
145
146 GridPosition(const GridPosition &other) = default;
147 GridPosition& operator=(const GridPosition &other) = default;
148
156 GridPosition(GridDrawingMode mode, GridJustification justification, int row, int height = 0)
157 : gridSize(1), gridPosition(1), gridHeight(height),rowPosition(row), drawingMode(mode), justification(justification) { }
158
169 GridPosition(GridDrawingMode mode, GridJustification just, int size, int pos, int row, int hei)
170 : gridSize(size), gridPosition(pos), gridHeight(hei), rowPosition(row), drawingMode(mode), justification(just) { }
171
172 GridDrawingMode getDrawingMode() const { return static_cast<GridDrawingMode>(drawingMode); }
173
174 GridJustification getJustification() const { return static_cast<GridJustification>(justification); }
175
176 int getGridSize() const { return gridSize; }
177
178 int getGridHeight() const { return gridHeight; }
179
180 int getGridPosition() const { return gridPosition; }
181
182 int getRow() const { return rowPosition; }
183 };
184
191 return justification == GridPosition::JUSTIFY_TITLE_LEFT_VALUE_RIGHT || (justification & GridPosition::CORE_JUSTIFY_VALUE_REQUIRED) != 0;
192 }
193
200 return (justification & GridPosition::CORE_JUSTIFY_NAME_REQUIRED) != 0;
201 }
202
211
218 class GridPositionWithId {
219 private:
220 uint16_t menuId;
221 GridPosition thePosition;
222 public:
223 GridPositionWithId() : menuId(0xffff), thePosition(GridPosition::DRAW_TEXTUAL_ITEM,
225
226 GridPositionWithId(const GridPositionWithId &other) = default;
227 GridPositionWithId& operator=(const GridPositionWithId &other) = default;
228
229 GridPositionWithId(uint16_t itemId, const GridPosition &pos) : menuId(itemId), thePosition(pos) {}
230
231 const GridPosition &getPosition() { return thePosition; }
232
233 uint16_t getKey() const { return menuId; }
234
235 void setNewPosition(GridPosition newPosition) {
236 thePosition = newPosition;
237 }
238 };
239
245 class ItemDisplayProperties {
246 public:
250 enum ColorType: uint8_t {
251 TEXT,
252 BACKGROUND,
253 HIGHLIGHT1,
254 HIGHLIGHT2,
255 SIZEOF_COLOR_ARRAY
256 };
257
261 COMPTYPE_TITLE,
262 COMPTYPE_ITEM,
263 COMPTYPE_ACTION,
264 };
265 private:
266 uint32_t propsKey;
267 color_t colors[SIZEOF_COLOR_ARRAY];
268 const void* fontData;
269 MenuPadding padding;
270 MenuBorder borderWidths;
271 GridPosition::GridJustification defaultJustification;
272 uint8_t spaceAfter;
273 uint8_t requiredHeight;
274 uint8_t fontMagnification;
275 public:
276 ItemDisplayProperties() : propsKey(0), colors{}, fontData(nullptr), borderWidths(), defaultJustification(GridPosition::JUSTIFY_TITLE_LEFT_VALUE_RIGHT),
277 spaceAfter(0), requiredHeight(0), fontMagnification(1) {}
278 ItemDisplayProperties(uint32_t key, const color_t* palette, const MenuPadding& pad, const void* font, uint8_t mag, uint8_t spacing,
279 uint8_t height, GridPosition::GridJustification defaultJustification, MenuBorder borderWidths)
280 : propsKey(key), fontData(font), padding{pad}, borderWidths(borderWidths), defaultJustification(defaultJustification), spaceAfter(spacing),
281 requiredHeight(height), fontMagnification(mag) {
282 memcpy(colors, palette, sizeof colors);
283 }
284 ItemDisplayProperties(const ItemDisplayProperties& other) = default;
285 ItemDisplayProperties& operator=(const ItemDisplayProperties& other) = default;
286
287 [[nodiscard]] uint32_t getKey() const { return propsKey; }
288
289 [[nodiscard]] GridPosition::GridJustification getDefaultJustification() const {
290 return defaultJustification;
291 }
292
293 void setDefaultJustification(GridPosition::GridJustification justification) { defaultJustification = justification; }
294
295 [[nodiscard]] uint8_t getSpaceAfter() const {return spaceAfter; }
296
297 void setSpaceAfter(uint8_t space) { spaceAfter = space; }
298
299 [[nodiscard]] uint8_t getRequiredHeight() const { return requiredHeight; }
300
301 void setRequiredHeight(uint8_t newHeight) { requiredHeight = newHeight; }
302
303 [[nodiscard]] color_t getColor(ColorType color) const {
304 return (color < SIZEOF_COLOR_ARRAY) ? colors[color] : RGB(0,0,0);
305 }
306
307 void setColor(ColorType color, color_t value) {
308 if(color >= SIZEOF_COLOR_ARRAY) return;
309 colors[color] = value;
310 }
311
312 void setColors(const color_t* palette) {
313 memcpy(colors, palette, sizeof colors);
314 }
315
316 [[nodiscard]] const MenuPadding& getPadding() const {
317 return padding;
318 }
319
320 void setPadding(const MenuPadding& pad) {
321 padding = pad;
322 }
323
324 [[nodiscard]] MenuBorder getBorder() const {
325 return borderWidths;
326 }
327
328 void setBorder(MenuBorder border) {
329 borderWidths = border;
330 }
331
332 [[nodiscard]] uint8_t getFontMagnification() const {
333 return fontMagnification;
334 }
335
336 void setFontInfo(const void* font, uint8_t mag) {
337 fontMagnification = mag;
338 fontData = font;
339 }
340
341 const void* getFont() {
342 return fontData;
343 }
344
345 color_t* getPalette() {
346 return colors;
347 }
348 };
349
359 public:
360 virtual ~ItemDisplayPropertiesFactory() = default;
368
377
383 virtual DrawableIcon* iconForMenuItem(uint16_t id) = 0;
384
391
397 virtual color_t getSelectedColor(ItemDisplayProperties::ColorType colorType, bool isUnderCursor = false) = 0;
398
404 virtual void addGridPosition(MenuItem* item, const GridPosition& position) = 0;
405 };
406
414 class NullItemDisplayPropertiesFactory : public ItemDisplayPropertiesFactory {
415 private:
416 color_t anEmptyPalette[4] = {0};
418 BtreeList<uint16_t, GridPositionWithId> gridByItem;
419 public:
420 NullItemDisplayPropertiesFactory() : gridByItem(4) {}
421
423 return &props;
424 }
425
427 return &props;
428 }
429
430 DrawableIcon* iconForMenuItem(uint16_t /*id*/) override{
431 return nullptr;
432 }
433
434 color_t getSelectedColor(ItemDisplayProperties::ColorType colorType, bool /*isUnderCursor*/ = false) override {
435 return 0;
436 }
437
439 if(!pItem) return nullptr;
440 return gridByItem.getByKey(pItem->getId());
441 }
442
443 void addGridPosition(MenuItem* pItem, const GridPosition& position) override {
444 if(!pItem) return;
445 auto* grid = gridByItem.getByKey(pItem->getId());
446 if(grid) {
447 grid->setNewPosition(position);
448 }
449 else {
450 serlogF2(SER_TCMENU_DEBUG, "Adding grid ", pItem->getId());
451 gridByItem.add(GridPositionWithId(pItem->getId(), position));
452 }
453 }
454 };
455
456#define MENUID_NOTSET 0xffff
457
458 inline uint32_t MakePropsKey(uint16_t menuId, bool parentKey, ItemDisplayProperties::ComponentType ty) {
459 return ((uint32_t)menuId) | (parentKey ? 0x10000UL : 0UL) | ((uint32_t)ty << 18UL);
460 }
461
471
480 class ConfigurableItemDisplayPropertiesFactory : public ItemDisplayPropertiesFactory {
481 private:
482 BtreeList<uint32_t, ItemDisplayProperties> displayProperties;
483 BtreeList<uint16_t, DrawableIcon> iconsByItem;
484 BtreeList<uint16_t, GridPositionWithId> gridByItem;
485 color_t selectedTextColor = RGB(0,0,0);
486 color_t selectedBackgroundColor = RGB(0, 100, 255);
487 color_t editCursorColor = RGB(255, 255, 255);
488 color_t editCursorTextColor = RGB(0, 0, 0);
489 EditCursorMode editCursorMode = CURSOR_MODE_UNDERLINE;
490 public:
491 ConfigurableItemDisplayPropertiesFactory()
492 : displayProperties(5, GROW_BY_5),
493 iconsByItem(6, GROW_BY_5) { }
494
500 DrawableIcon* iconForMenuItem(uint16_t id) override {
501 return iconsByItem.getByKey(id);
502 }
503
510 if(!pItem) return nullptr;
511 return gridByItem.getByKey(pItem->getId());
512 }
513
523
532
538 color_t getSelectedColor(ItemDisplayProperties::ColorType colorType, bool isUnderCursor = false) override {
539 if(isUnderCursor) {
540 return colorType == ItemDisplayProperties::BACKGROUND ? editCursorColor : editCursorTextColor;
541 }
542 return colorType == ItemDisplayProperties::BACKGROUND ? selectedBackgroundColor : selectedTextColor;
543 }
544
551 void addGridPosition(MenuItem* pItem, const GridPosition& position) override {
552 if(!pItem) return;
553 auto* grid = gridByItem.getByKey(pItem->getId());
554 if(grid) {
555 grid->setNewPosition(position);
556 }
557 else {
558 gridByItem.add(GridPositionWithId(pItem->getId(), position));
559 }
560 }
561
567 void addImageToCache(const DrawableIcon& toAdd) {
568 auto* current = iconsByItem.getByKey(toAdd.getKey());
569 if(current) {
570 current->setFromValues(toAdd.getDimensions(), toAdd.getIconType(), toAdd.getIcon(false), toAdd.getIcon(true));
571 }
572 else {
573 iconsByItem.add(toAdd);
574 }
575 }
576
589 void setDrawingPropertiesDefault(ItemDisplayProperties::ComponentType drawing, const color_t* palette, MenuPadding pad, const void *font, uint8_t mag,
590 uint8_t spacing, uint8_t requiredHeight, GridPosition::GridJustification defaultJustification, MenuBorder border) {
591
592 auto key = MakePropsKey(MENUID_NOTSET, false, drawing);
593 serlogF2(SER_TCMENU_DEBUG, "Add def prop: ", key);
594 setDrawingProperties(key, palette, pad, font, mag, spacing, requiredHeight, defaultJustification, border);
595 }
596
610 void setDrawingPropertiesForItem(ItemDisplayProperties::ComponentType drawing, uint16_t id, const color_t* palette, MenuPadding pad, const void *font, uint8_t mag,
611 uint8_t spacing, uint8_t requiredHeight, GridPosition::GridJustification defaultJustification, MenuBorder border) {
612 auto key = MakePropsKey(id, false, drawing);
613 serlogF3(SER_TCMENU_DEBUG, "Add item prop: ", key, id);
614 setDrawingProperties(key, palette, pad, font, mag, spacing, requiredHeight, defaultJustification, border);
615 }
616
630 void setDrawingPropertiesAllInSub(ItemDisplayProperties::ComponentType drawing, uint16_t id, const color_t* palette, MenuPadding pad, const void *font, uint8_t mag,
631 uint8_t spacing, uint8_t requiredHeight, GridPosition::GridJustification defaultJustification, MenuBorder border) {
632 auto key = MakePropsKey(id, true, drawing);
633 serlogF3(SER_TCMENU_DEBUG, "Add sub prop: ", key, id);
634 setDrawingProperties(key, palette, pad, font, mag, spacing, requiredHeight, defaultJustification, border);
635 }
636
642 void setSelectedColors(color_t background, color_t text) {
643 selectedBackgroundColor = background;
644 selectedTextColor = text;
645 }
646
653 void setEditCursorMode(EditCursorMode mode, color_t cursorCol, color_t textCol) {
654 editCursorMode = mode;
655 editCursorColor = cursorCol;
656 editCursorTextColor = textCol;
657 }
658
663 static void refreshCache();
664
665 private:
666 void setDrawingProperties(uint32_t key, const color_t* palette, MenuPadding pad, const void* font, uint8_t mag, uint8_t spacing,
667 uint8_t requiredHeight, GridPosition::GridJustification defaultJustification, MenuBorder border);
668
669 };
670
671} // namespace tcgfx
672
676extern const uint8_t PROGMEM loResEditingIcon[];
677
681extern const uint8_t PROGMEM loResActiveIcon[];
682
686extern const uint8_t PROGMEM defActiveIcon[];
687
691extern const uint8_t PROGMEM defEditingIcon[];
692
693#endif // _GFX_MENU_CONFIG_H_
contains a series of core components needed by all graphical renderers
uint32_t color_t
Definition DrawingPrimitives.h:29
In TcMenu, MenuItem storage is shared between program memory and RAM. Usually each MenuItem has assoc...
Definition MenuItems.h:338
menuid_t getId() const
Definition MenuItems.cpp:81
void setDrawingPropertiesAllInSub(ItemDisplayProperties::ComponentType drawing, uint16_t id, const color_t *palette, MenuPadding pad, const void *font, uint8_t mag, uint8_t spacing, uint8_t requiredHeight, GridPosition::GridJustification defaultJustification, MenuBorder border)
Definition GfxMenuConfig.h:630
static void refreshCache()
Definition GfxMenuConfig.cpp:126
ItemDisplayProperties * configFor(MenuItem *pItem, ItemDisplayProperties::ComponentType compType) override
Definition GfxMenuConfig.cpp:66
void setEditCursorMode(EditCursorMode mode, color_t cursorCol, color_t textCol)
Definition GfxMenuConfig.h:653
color_t getSelectedColor(ItemDisplayProperties::ColorType colorType, bool isUnderCursor=false) override
Definition GfxMenuConfig.h:538
GridPositionWithId * gridPositionForItem(MenuItem *pItem) override
Definition GfxMenuConfig.h:509
void addImageToCache(const DrawableIcon &toAdd)
Definition GfxMenuConfig.h:567
void addGridPosition(MenuItem *pItem, const GridPosition &position) override
Definition GfxMenuConfig.h:551
DrawableIcon * iconForMenuItem(uint16_t id) override
Definition GfxMenuConfig.h:500
void setDrawingPropertiesForItem(ItemDisplayProperties::ComponentType drawing, uint16_t id, const color_t *palette, MenuPadding pad, const void *font, uint8_t mag, uint8_t spacing, uint8_t requiredHeight, GridPosition::GridJustification defaultJustification, MenuBorder border)
Definition GfxMenuConfig.h:610
void setSelectedColors(color_t background, color_t text)
Definition GfxMenuConfig.h:642
void setDrawingPropertiesDefault(ItemDisplayProperties::ComponentType drawing, const color_t *palette, MenuPadding pad, const void *font, uint8_t mag, uint8_t spacing, uint8_t requiredHeight, GridPosition::GridJustification defaultJustification, MenuBorder border)
Definition GfxMenuConfig.h:589
ItemDisplayProperties * configForCurrentSub(ItemDisplayProperties::ComponentType compType) override
Definition GfxMenuConfig.cpp:85
Definition DrawingPrimitives.h:178
Coord getDimensions() const
Definition DrawingPrimitives.h:269
const uint8_t * getIcon(bool selected) const
Definition DrawingPrimitives.h:254
IconType getIconType() const
Definition DrawingPrimitives.h:276
Definition GfxMenuConfig.h:69
GridJustification
Definition GfxMenuConfig.h:93
@ JUSTIFY_TITLE_LEFT_VALUE_RIGHT
Definition GfxMenuConfig.h:107
@ CORE_JUSTIFY_VALUE_REQUIRED
Definition GfxMenuConfig.h:102
@ JUSTIFY_LEFT_NO_VALUE
Definition GfxMenuConfig.h:115
@ JUSTIFY_CENTER_WITH_VALUE
Definition GfxMenuConfig.h:111
@ CORE_JUSTIFY_RIGHT
Definition GfxMenuConfig.h:97
@ JUSTIFY_RIGHT_WITH_VALUE
Definition GfxMenuConfig.h:113
@ JUSTIFY_RIGHT_NO_VALUE
Definition GfxMenuConfig.h:119
@ CORE_JUSTIFY_CENTER
Definition GfxMenuConfig.h:99
@ JUSTIFY_LEFT_VALUE_ONLY
Definition GfxMenuConfig.h:121
@ JUSTIFY_CENTER_VALUE_ONLY
Definition GfxMenuConfig.h:123
@ JUSTIFY_CENTER_NO_VALUE
Definition GfxMenuConfig.h:117
@ CORE_JUSTIFY_NAME_REQUIRED
Definition GfxMenuConfig.h:104
@ CORE_JUSTIFY_LEFT
Definition GfxMenuConfig.h:95
@ JUSTIFY_TITLE_LEFT_WITH_VALUE
Definition GfxMenuConfig.h:109
@ JUSTIFY_RIGHT_VALUE_ONLY
Definition GfxMenuConfig.h:125
GridPosition(GridDrawingMode mode, GridJustification justification, int row, int height=0)
Definition GfxMenuConfig.h:156
GridDrawingMode
Definition GfxMenuConfig.h:74
@ DRAW_TEXTUAL_ITEM
Definition GfxMenuConfig.h:76
@ DRAW_AS_ICON_TEXT
Definition GfxMenuConfig.h:84
@ DRAW_TITLE_ITEM
Definition GfxMenuConfig.h:86
@ DRAW_INTEGER_AS_UP_DOWN
Definition GfxMenuConfig.h:78
@ DRAW_AS_ICON_ONLY
Definition GfxMenuConfig.h:82
@ DRAW_INTEGER_AS_SCROLL
Definition GfxMenuConfig.h:80
GridPosition(GridDrawingMode mode, GridJustification just, int size, int pos, int row, int hei)
Definition GfxMenuConfig.h:169
Definition GfxMenuConfig.h:218
Definition GfxMenuConfig.h:358
virtual DrawableIcon * iconForMenuItem(uint16_t id)=0
virtual color_t getSelectedColor(ItemDisplayProperties::ColorType colorType, bool isUnderCursor=false)=0
virtual GridPositionWithId * gridPositionForItem(MenuItem *pItem)=0
virtual ItemDisplayProperties * configFor(MenuItem *pItem, ItemDisplayProperties::ComponentType compType)=0
virtual ItemDisplayProperties * configForCurrentSub(ItemDisplayProperties::ComponentType compType)=0
virtual void addGridPosition(MenuItem *item, const GridPosition &position)=0
Definition GfxMenuConfig.h:245
ComponentType
Definition GfxMenuConfig.h:260
ColorType
Definition GfxMenuConfig.h:250
void addGridPosition(MenuItem *pItem, const GridPosition &position) override
Definition GfxMenuConfig.h:443
DrawableIcon * iconForMenuItem(uint16_t) override
Definition GfxMenuConfig.h:430
ItemDisplayProperties * configForCurrentSub(ItemDisplayProperties::ComponentType) override
Definition GfxMenuConfig.h:426
ItemDisplayProperties * configFor(MenuItem *pItem, ItemDisplayProperties::ComponentType) override
Definition GfxMenuConfig.h:422
color_t getSelectedColor(ItemDisplayProperties::ColorType colorType, bool=false) override
Definition GfxMenuConfig.h:434
GridPositionWithId * gridPositionForItem(MenuItem *pItem) override
Definition GfxMenuConfig.h:438
GridPosition::GridJustification coreJustification(GridPosition::GridJustification j)
Definition GfxMenuConfig.h:208
const uint8_t PROGMEM loResActiveIcon[]
Definition GfxMenuConfig.cpp:36
const uint8_t PROGMEM loResEditingIcon[]
Definition GfxMenuConfig.cpp:31
const uint8_t PROGMEM defEditingIcon[]
bool itemNeedsValue(GridPosition::GridJustification justification)
Definition GfxMenuConfig.h:190
EditCursorMode
Definition GfxMenuConfig.h:465
@ CURSOR_MODE_BACKGROUND_BOX
Definition GfxMenuConfig.h:469
@ CURSOR_MODE_UNDERLINE
Definition GfxMenuConfig.h:467
bool itemNeedsName(GridPosition::GridJustification justification)
Definition GfxMenuConfig.h:199
const uint8_t PROGMEM defActiveIcon[]
Definition GfxMenuConfig.cpp:23
Definition GfxMenuConfig.h:32
Definition DrawingPrimitives.h:107
Definition DrawingPrimitives.h:56
A series of utilities that used throughout tcMenu.