tcMenu
TcThemeBuilder.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 
11 #ifndef TCCLIBSDK_TCTHEMEBUILDER_H
12 #define TCCLIBSDK_TCTHEMEBUILDER_H
13 
14 #include "GfxMenuConfig.h"
16 
17 #define COL_COUNT_FLAG_BULK_MODE 0x80
18 
19 namespace tcgfx {
20  class TcThemeBuilder;
21 
29  public:
30  enum ThemeLevel : uint8_t {
31  THEME_GLOBAL, THEME_SUB, THEME_ITEM, THEME_ITEM_NEEDS_PROPS, THEME_ITEM_NEEDS_GRID, THEME_ITEM_NEEDS_BOTH
32  };
33  private:
34  // do not reorder these fields, they are ordered this way to reduce the size, IE the packing overhead.
35  TcThemeBuilder *themeBuilder;
36  color_t palette[4]{};
37  const void* fontData{};
38  MenuItem* menuItem = nullptr;
39  MenuPadding padding {};
40  MenuBorder border{};
41  uint16_t gridHeight {};
42  ItemDisplayProperties::ComponentType componentType = ItemDisplayProperties::COMPTYPE_ITEM;
43  ThemeLevel currentLevel = THEME_GLOBAL;
44  uint8_t fontMag{};
45  uint8_t spacing{};
46  GridPosition::GridDrawingMode drawingMode{};
48  uint8_t row {};
49  uint8_t colPos {};
50  uint8_t colCount {};
51  public:
52  explicit ThemePropertiesBuilder(TcThemeBuilder *themeBuilder): themeBuilder(themeBuilder) {}
53 
60  border = b;
61  needsProps();
62  return *this;
63  }
64 
71  ThemePropertiesBuilder& withAdaFont(const GFXfont* font, int mag = 1) {
72  fontData = font;
73  fontMag = min(1, mag);
74  needsProps();
75  return *this;
76  }
77 
83  ThemePropertiesBuilder& withTcUnicodeFont(const UnicodeFont* font) {
84  fontData = font;
85  fontMag = 0;
86  needsProps();
87  return *this;
88  }
89 
96  ThemePropertiesBuilder& withNativeFont(const void* data, uint8_t mag) {
97  fontData = data;
98  fontMag = mag;
99  needsProps();
100  return *this;
101  }
102 
109  padding = p;
110  needsProps();
111  return *this;
112  }
113 
120  spacing = s;
121  needsGrid(true);
122  return *this;
123  }
124 
131  justification = j;
132  needsGrid(true);
133  return *this;
134  }
135 
142  needsProps();
143  memcpy(palette, p, sizeof(palette));
144  return *this;
145  }
146 
154  gridHeight = height;
155  needsGrid(false);
156  return *this;
157  }
158 
162  ThemePropertiesBuilder& withImageOfType(Coord size, DrawableIcon::IconType iconType, const uint8_t* regIcon,
163  const uint8_t* selIcon, const color_t* palette = nullptr);
164 
173  ThemePropertiesBuilder& withImageXbmp(Coord size, const uint8_t* regIcon, const uint8_t* selIcon = nullptr) {
174  withImageOfType(size, DrawableIcon::ICON_XBITMAP, regIcon, selIcon);
175  return *this;
176  }
177 
187  ThemePropertiesBuilder& withImage2bpp(Coord size, const color_t* imgPalette, const uint8_t* regIcon, const uint8_t* selIcon = nullptr) {
188  withImageOfType(size, DrawableIcon::ICON_PALLETE_2BPP, regIcon, selIcon, imgPalette);
189  return *this;
190  }
191 
201  ThemePropertiesBuilder& withImage4bpp(Coord size, const color_t* imgPalette, const uint8_t* regIcon, const uint8_t* selIcon = nullptr) {
202  withImageOfType(size, DrawableIcon::ICON_PALLETE_4BPP, regIcon, selIcon, imgPalette);
203  return *this;
204  }
205 
214  ThemePropertiesBuilder& withMonoBitmap(Coord size, const uint8_t* regIcon, const uint8_t* selIcon = nullptr) {
215  withImageOfType(size, DrawableIcon::ICON_MONO, regIcon, selIcon);
216  return *this;
217  }
218 
219 
226  drawingMode = dm;
227  needsGrid(false);
228  return *this;
229  }
230 
239  ThemePropertiesBuilder& onRowCol(uint8_t actRow, uint8_t column, uint8_t numberOfCols) {
240  row = actRow;
241  colPos = column;
242  colCount = numberOfCols;
243  return *this;
244  }
245 
252  ThemePropertiesBuilder& onRow(uint8_t actualRow) {
253  colPos = 1;
254  colCount = 1;
255  row = actualRow;
256  return *this;
257  }
258 
263  void apply();
264 
265  protected:
266  void initForLevel(TcThemeBuilder *b, ItemDisplayProperties::ComponentType compType, ThemeLevel level, MenuItem *item = nullptr);
267 
268  void needsProps() {
269  if(currentLevel == THEME_SUB || currentLevel == THEME_GLOBAL) return;
270  if(currentLevel == THEME_ITEM) currentLevel = THEME_ITEM_NEEDS_PROPS;
271  else currentLevel = THEME_ITEM_NEEDS_BOTH;
272  }
273 
274  void needsGrid(bool propsOk) {
275  if(currentLevel == THEME_SUB || currentLevel == THEME_GLOBAL) return;
276  if(currentLevel == THEME_ITEM_NEEDS_PROPS && propsOk) return;
277  if(currentLevel == THEME_ITEM) currentLevel = THEME_ITEM_NEEDS_GRID;
278  else currentLevel = THEME_ITEM_NEEDS_BOTH;
279  }
280 
281  friend TcThemeBuilder;
282  };
283 
291  private:
292  GraphicsDeviceRenderer &renderer;
294  ThemePropertiesBuilder propertiesBuilder;
295  color_t defaultPalette[4] = {};
296  MenuPadding globalItemPadding = MenuPadding(1);
297  MenuPadding globalTitlePadding = MenuPadding(2);
298  const void *fontData = nullptr;
299  uint8_t fontMag = 1;
300  uint8_t defaultSpacing = 1;
301  public:
306  explicit TcThemeBuilder(GraphicsDeviceRenderer& renderer) : renderer(renderer), factory(renderer.getGraphicsPropertiesFactory()),
307  propertiesBuilder(this) {
308  }
309 
317  factory.setSelectedColors(bg, fg);
318  return *this;
319  }
320 
328  TcThemeBuilder& withAdaFont(const GFXfont* font, int mag = 1) {
329  fontData = font;
330  fontMag = min(1, mag);
331  return *this;
332  }
333 
339  TcThemeBuilder& withTcUnicodeFont(const UnicodeFont* font) {
340  fontData = font;
341  fontMag = 0;
342  return *this;
343  }
344 
352  TcThemeBuilder& withNativeFont(const void* data, uint8_t mag) {
353  fontData = data;
354  fontMag = mag;
355  return *this;
356  }
357 
365 
371 
381  TcThemeBuilder &withCursorIconsXbmp(Coord size, const uint8_t *editIcon, const uint8_t *activeIcon);
382 
389 
396 
402  TcThemeBuilder &withSpacing(uint8_t spacing) {
403  defaultSpacing = spacing;
404  return *this;
405  }
406 
413  globalItemPadding = padding;
414  return *this;
415  }
416 
423  globalTitlePadding = padding;
424  return *this;
425  }
426 
432  propertiesBuilder.initForLevel(this, ItemDisplayProperties::COMPTYPE_ITEM, ThemePropertiesBuilder::THEME_GLOBAL);
433  return propertiesBuilder;
434  }
435 
441  propertiesBuilder.initForLevel(this, ItemDisplayProperties::COMPTYPE_TITLE, ThemePropertiesBuilder::THEME_GLOBAL);
442  return propertiesBuilder;
443  }
444 
450  propertiesBuilder.initForLevel(this, ItemDisplayProperties::COMPTYPE_ACTION, ThemePropertiesBuilder::THEME_GLOBAL);
451  return propertiesBuilder;
452  }
453 
460 
468  propertiesBuilder.initForLevel(this, ItemDisplayProperties::COMPTYPE_ITEM, ThemePropertiesBuilder::THEME_SUB, &item);
469  return propertiesBuilder;
470  }
471 
479  propertiesBuilder.initForLevel(this, ItemDisplayProperties::COMPTYPE_ACTION, ThemePropertiesBuilder::THEME_SUB, &item);
480  return propertiesBuilder;
481  }
482 
490  propertiesBuilder.initForLevel(this, ItemDisplayProperties::COMPTYPE_TITLE, ThemePropertiesBuilder::THEME_SUB, &item);
491  return propertiesBuilder;
492  }
493 
499  TcThemeBuilder& withPalette(const color_t* cols);
500 
509  renderer.setTitleMode(mode);
510  renderer.setUseSliderForAnalog(useAnalogSliders);
511  return *this;
512  }
513 
520 
527  TcThemeBuilder& manualDimensions(int x, int y);
528 
538  TcThemeBuilder& enableCardLayoutWithXbmImages(Coord iconSize, const uint8_t* leftIcon, const uint8_t* rightIcon, bool isMono);
545  TcThemeBuilder& setMenuAsCard(SubMenuItem& item, bool on);
546 
550  void apply();
551 
552  ConfigurableItemDisplayPropertiesFactory& getItemFactory() { return factory; }
553 
554  MenuPadding getPaddingFor(ItemDisplayProperties::ComponentType type) {
555  return type == ItemDisplayProperties::COMPTYPE_TITLE ? globalTitlePadding : globalItemPadding;
556  }
557 
558  uint8_t getDefaultSpacing() const {
559  return defaultSpacing;
560  }
561 
562  GraphicsDeviceRenderer& getRenderer() {
563  return renderer;
564  }
565 
566  const color_t* getDefaultPalette() {
567  return defaultPalette;
568  }
569 
570  const void* getDefaultFontData() {
571  return fontData;
572  }
573 
574  uint8_t getDefaultFontMag() const {
575  return fontMag;
576  }
577  };
578 
579 }
580 #endif //TCCLIBSDK_TCTHEMEBUILDER_H
uint32_t color_t
Definition: DrawingPrimitives.h:29
the interface that all graphics devices should implement to do the actual graphics rendering.
Definition: MenuItems.h:329
Definition: RuntimeMenuItem.h:147
void setUseSliderForAnalog(bool useSlider)
Definition: BaseGraphicalRenderer.h:195
TitleMode
Definition: BaseGraphicalRenderer.h:136
void setSelectedColors(color_t background, color_t text)
Definition: GfxMenuConfig.h:634
IconType
Definition: DrawingPrimitives.h:154
@ ICON_XBITMAP
Definition: DrawingPrimitives.h:156
@ ICON_MONO
Definition: DrawingPrimitives.h:158
@ ICON_PALLETE_2BPP
Definition: DrawingPrimitives.h:161
@ ICON_PALLETE_4BPP
Definition: DrawingPrimitives.h:164
Definition: GraphicsDeviceRenderer.h:59
GridJustification
Definition: GfxMenuConfig.h:93
@ JUSTIFY_TITLE_LEFT_VALUE_RIGHT
Definition: GfxMenuConfig.h:107
GridDrawingMode
Definition: GfxMenuConfig.h:74
ComponentType
Definition: GfxMenuConfig.h:260
Definition: TcThemeBuilder.h:290
ThemePropertiesBuilder & defaultActionProperties()
Definition: TcThemeBuilder.h:449
TcThemeBuilder & withSpacing(uint8_t spacing)
Definition: TcThemeBuilder.h:402
TcThemeBuilder & withRenderingSettings(BaseGraphicalRenderer::TitleMode mode, bool useAnalogSliders)
Definition: TcThemeBuilder.h:508
TcThemeBuilder & withSelectedColors(color_t bg, color_t fg)
Definition: TcThemeBuilder.h:316
TcThemeBuilder & withStandardLowResCursorIcons()
Definition: TcThemeBuilder.cpp:116
TcThemeBuilder & withPalette(const color_t *cols)
Definition: TcThemeBuilder.cpp:93
ThemePropertiesBuilder & defaultItemProperties()
Definition: TcThemeBuilder.h:431
ThemePropertiesBuilder & menuItemOverride(MenuItem &item)
Definition: TcThemeBuilder.cpp:98
TcThemeBuilder & enableTcUnicode()
Definition: TcThemeBuilder.cpp:124
TcThemeBuilder & dimensionsFromRenderer()
Definition: TcThemeBuilder.cpp:129
ThemePropertiesBuilder & submenuPropertiesItemOverride(SubMenuItem &item)
Definition: TcThemeBuilder.h:467
TcThemeBuilder(GraphicsDeviceRenderer &renderer)
Definition: TcThemeBuilder.h:306
TcThemeBuilder & withTcUnicodeFont(const UnicodeFont *font)
Definition: TcThemeBuilder.h:339
TcThemeBuilder & withAdaFont(const GFXfont *font, int mag=1)
Definition: TcThemeBuilder.h:328
TcThemeBuilder & enableCardLayoutWithXbmImages(Coord iconSize, const uint8_t *leftIcon, const uint8_t *rightIcon, bool isMono)
Definition: TcThemeBuilder.cpp:104
TcThemeBuilder & manualDimensions(int x, int y)
Definition: TcThemeBuilder.cpp:135
TcThemeBuilder & enablingTcUnicode()
Definition: TcThemeBuilder.h:370
ThemePropertiesBuilder & submenuPropertiesActionOverride(SubMenuItem &item)
Definition: TcThemeBuilder.h:478
TcThemeBuilder & withStandardMedResCursorIcons()
Definition: TcThemeBuilder.cpp:120
TcThemeBuilder & withCursorIconsXbmp(Coord size, const uint8_t *editIcon, const uint8_t *activeIcon)
Definition: TcThemeBuilder.cpp:83
void apply()
Definition: TcThemeBuilder.cpp:89
TcThemeBuilder & withNativeFont(const void *data, uint8_t mag)
Definition: TcThemeBuilder.h:352
TcThemeBuilder & withTitlePadding(MenuPadding padding)
Definition: TcThemeBuilder.h:422
ThemePropertiesBuilder & defaultTitleProperties()
Definition: TcThemeBuilder.h:440
ThemePropertiesBuilder & submenuPropertiesTitleOverride(SubMenuItem &item)
Definition: TcThemeBuilder.h:489
TcThemeBuilder & setMenuAsCard(SubMenuItem &item, bool on)
Definition: TcThemeBuilder.cpp:111
TcThemeBuilder & withItemPadding(MenuPadding padding)
Definition: TcThemeBuilder.h:412
Definition: TcThemeBuilder.h:28
ThemePropertiesBuilder & withPadding(MenuPadding p)
Definition: TcThemeBuilder.h:108
ThemePropertiesBuilder & withRowHeight(uint16_t height)
Definition: TcThemeBuilder.h:153
ThemePropertiesBuilder & withSpacing(uint8_t s)
Definition: TcThemeBuilder.h:119
ThemePropertiesBuilder & onRowCol(uint8_t actRow, uint8_t column, uint8_t numberOfCols)
Definition: TcThemeBuilder.h:239
ThemePropertiesBuilder & withImage2bpp(Coord size, const color_t *imgPalette, const uint8_t *regIcon, const uint8_t *selIcon=nullptr)
Definition: TcThemeBuilder.h:187
ThemePropertiesBuilder & withBorder(const MenuBorder &b)
Definition: TcThemeBuilder.h:59
ThemePropertiesBuilder & withImage4bpp(Coord size, const color_t *imgPalette, const uint8_t *regIcon, const uint8_t *selIcon=nullptr)
Definition: TcThemeBuilder.h:201
ThemePropertiesBuilder & withNativeFont(const void *data, uint8_t mag)
Definition: TcThemeBuilder.h:96
ThemePropertiesBuilder & withImageOfType(Coord size, DrawableIcon::IconType iconType, const uint8_t *regIcon, const uint8_t *selIcon, const color_t *palette=nullptr)
Definition: TcThemeBuilder.cpp:76
ThemePropertiesBuilder & withPalette(const color_t *p)
Definition: TcThemeBuilder.h:141
ThemePropertiesBuilder & withTcUnicodeFont(const UnicodeFont *font)
Definition: TcThemeBuilder.h:83
ThemePropertiesBuilder & withJustification(GridPosition::GridJustification j)
Definition: TcThemeBuilder.h:130
ThemePropertiesBuilder & withMonoBitmap(Coord size, const uint8_t *regIcon, const uint8_t *selIcon=nullptr)
Definition: TcThemeBuilder.h:214
ThemePropertiesBuilder & onRow(uint8_t actualRow)
Definition: TcThemeBuilder.h:252
ThemePropertiesBuilder & withImageXbmp(Coord size, const uint8_t *regIcon, const uint8_t *selIcon=nullptr)
Definition: TcThemeBuilder.h:173
ThemePropertiesBuilder & withDrawingMode(GridPosition::GridDrawingMode dm)
Definition: TcThemeBuilder.h:225
void apply()
Definition: TcThemeBuilder.cpp:8
ThemePropertiesBuilder & withAdaFont(const GFXfont *font, int mag=1)
Definition: TcThemeBuilder.h:71
Definition: DrawingPrimitives.h:123
Definition: DrawingPrimitives.h:92
Definition: DrawingPrimitives.h:56