diff --git a/radio/src/gui/horus/colors.h b/radio/src/gui/horus/colors.h index 8ea49b6bc..d01efb3b0 100644 --- a/radio/src/gui/horus/colors.h +++ b/radio/src/gui/horus/colors.h @@ -25,9 +25,9 @@ #undef OPAQUE #undef RGB -#define TO4BITS(x) ((x) >> 4) -#define TO5BITS(x) ((x) >> 3) -#define TO6BITS(x) ((x) >> 2) +#define TO4BITS(x) (uint32_t(limit(0, x, 255)) >> 4) +#define TO5BITS(x) (uint32_t(limit(0, x, 255)) >> 3) +#define TO6BITS(x) (uint32_t(limit(0, x, 255)) >> 2) #define RGB(r, g, b) ((TO5BITS(r) << 11) + (TO6BITS(g) << 5) + (TO5BITS(b) << 0)) #define ARGB(a, r, g, b) ((TO4BITS(a) << 12) + (TO4BITS(r) << 8) + (TO4BITS(g) << 4) + (TO4BITS(b) << 0)) #define WHITE RGB(0xFF, 0xFF, 0xFF) @@ -115,4 +115,13 @@ extern uint16_t lcdColorTable[LCD_COLOR_COUNT]; #define COLOR_JOIN(r, g, b) \ (((r) << 11) + ((g) << 5) + (b)) +#define GET_RED(color) \ + (((color) & 0xF800) >> 8) + +#define GET_GREEN(color) \ + (((color) & 0x07E0) >> 3) + +#define GET_BLUE(color) \ + (((color) & 0x001F) << 3) + #endif // _COLORS_H_ diff --git a/radio/src/gui/horus/layout.h b/radio/src/gui/horus/layout.h index eb2e3e675..00b89e680 100644 --- a/radio/src/gui/horus/layout.h +++ b/radio/src/gui/horus/layout.h @@ -44,6 +44,10 @@ class Layout: public WidgetsContainer return factory; } + virtual void update() + { + } + protected: const LayoutFactory * factory; }; diff --git a/radio/src/gui/horus/screens_setup.cpp b/radio/src/gui/horus/screens_setup.cpp index 847b28c93..3066661c9 100644 --- a/radio/src/gui/horus/screens_setup.cpp +++ b/radio/src/gui/horus/screens_setup.cpp @@ -67,7 +67,7 @@ int getZoneOptionColumns(const ZoneOption * option) } } -void editZoneOption(coord_t y, const ZoneOption * option, ZoneOptionValue * value, LcdFlags attr, uint32_t i_flags, evt_t event) +bool editZoneOption(coord_t y, const ZoneOption * option, ZoneOptionValue * value, LcdFlags attr, uint32_t i_flags, evt_t event) { lcdDrawText(MENUS_MARGIN_LEFT, y, option->name); @@ -150,6 +150,8 @@ void editZoneOption(coord_t y, const ZoneOption * option, ZoneOptionValue * valu value->unsignedValue = COLOR_JOIN(r, g, b); } } + + return (attr && checkIncDec_Ret); } int getOptionsCount(const ZoneOption * options) @@ -186,7 +188,9 @@ bool menuSettings(const char * title, const T * object, uint32_t i_flags, evt_t if (k < linesCount) { const ZoneOption * option = &options[k]; ZoneOptionValue * value = object->getOptionValue(k); - editZoneOption(y, option, value, attr, i_flags, event); + if (editZoneOption(y, option, value, attr, i_flags, event)) { + object->update(); + } } } @@ -446,7 +450,9 @@ bool menuScreensTheme(evt_t event) if (index < optionsCount) { const ZoneOption * option = &options[index]; ZoneOptionValue * value = theme->getOptionValue(index); - editZoneOption(y, option, value, attr, EE_GENERAL, event); + if (editZoneOption(y, option, value, attr, EE_GENERAL, event)) { + theme->update(); + } } else if (index == optionsCount) { lcdDrawText(MENUS_MARGIN_LEFT, y, "Top bar"); @@ -531,7 +537,9 @@ bool menuScreenSetup(int index, evt_t event) if (index < optionsCount) { const ZoneOption * option = &options[index]; ZoneOptionValue * value = currentScreen->getOptionValue(index); - editZoneOption(y, option, value, attr, EE_MODEL, event); + if (editZoneOption(y, option, value, attr, EE_MODEL, event)) { + currentScreen->update(); + } } break; } diff --git a/radio/src/gui/horus/theme.cpp b/radio/src/gui/horus/theme.cpp index 0a7cfdfbf..79b36e597 100644 --- a/radio/src/gui/horus/theme.cpp +++ b/radio/src/gui/horus/theme.cpp @@ -155,7 +155,6 @@ void loadTheme() loadTheme(new_theme); } else { - theme->init(); theme->load(); } } diff --git a/radio/src/gui/horus/theme.h b/radio/src/gui/horus/theme.h index 04251836c..8359fcc9f 100644 --- a/radio/src/gui/horus/theme.h +++ b/radio/src/gui/horus/theme.h @@ -59,6 +59,10 @@ class Theme void init() const; + virtual void update() const + { + } + ZoneOptionValue * getOptionValue(unsigned int index) const; virtual void load() const; diff --git a/radio/src/gui/horus/themes/default.cpp b/radio/src/gui/horus/themes/default.cpp index 59b17ffd1..ddba7a309 100644 --- a/radio/src/gui/horus/themes/default.cpp +++ b/radio/src/gui/horus/themes/default.cpp @@ -74,6 +74,22 @@ class DefaultTheme: public Theme Theme::load(); if (!backgroundBitmap) backgroundBitmap = BitmapBuffer::load(getThemePath("mainbg.bmp")); if (!aboutBackgroundBitmap) aboutBackgroundBitmap = BitmapBuffer::load(getThemePath("aboutbg.bmp")); + update(); + } + + virtual void update() const + { + uint32_t color = g_eeGeneral.themeData.options[1].unsignedValue; + lcdColorTable[TEXT_INVERTED_BGCOLOR_INDEX] = color; + lcdColorTable[SCROLLBOX_COLOR_INDEX] = color; + lcdColorTable[CURVE_COLOR_INDEX] = color; + lcdColorTable[CURVE_CURSOR_COLOR_INDEX] = color; + lcdColorTable[TITLE_BGCOLOR_INDEX] = color; + lcdColorTable[TRIM_BGCOLOR_INDEX] = color; + lcdColorTable[MAINVIEW_GRAPHICS_COLOR_INDEX] = color; + lcdColorTable[HEADER_BGCOLOR_INDEX] = RGB(GET_RED(color)-69, GET_GREEN(color)-32, GET_BLUE(color)-24); + lcdColorTable[HEADER_ICON_BGCOLOR_INDEX] = color; + lcdColorTable[HEADER_CURRENT_BGCOLOR_INDEX] = color; } virtual void drawBackground() const @@ -94,21 +110,6 @@ class DefaultTheme: public Theme virtual void drawTopbarBackground(const uint8_t * icon) const { - // TODO should be in updateOptions - if (lcdColorTable[TEXT_INVERTED_BGCOLOR_INDEX] != g_eeGeneral.themeData.options[1].unsignedValue) { - lcdColorTable[TEXT_INVERTED_BGCOLOR_INDEX] = g_eeGeneral.themeData.options[1].unsignedValue; - lcdColorTable[SCROLLBOX_COLOR_INDEX] = g_eeGeneral.themeData.options[1].unsignedValue; - lcdColorTable[CURVE_COLOR_INDEX] = g_eeGeneral.themeData.options[1].unsignedValue; - lcdColorTable[CURVE_CURSOR_COLOR_INDEX] = g_eeGeneral.themeData.options[1].unsignedValue; - lcdColorTable[TITLE_BGCOLOR_INDEX] = g_eeGeneral.themeData.options[1].unsignedValue; - lcdColorTable[TRIM_BGCOLOR_INDEX] = g_eeGeneral.themeData.options[1].unsignedValue; - lcdColorTable[MAINVIEW_GRAPHICS_COLOR_INDEX] = g_eeGeneral.themeData.options[1].unsignedValue; - lcdColorTable[HEADER_ICON_BGCOLOR_INDEX] = g_eeGeneral.themeData.options[1].unsignedValue; - lcdColorTable[HEADER_CURRENT_BGCOLOR_INDEX] = g_eeGeneral.themeData.options[1].unsignedValue; - // TODO quick and really dirty, create a new macro for that ... - lcdColorTable[HEADER_BGCOLOR_INDEX] = g_eeGeneral.themeData.options[1].unsignedValue - RGB(69, 32, 30); - } - lcdDrawSolidFilledRect(0, 0, LCD_W, MENU_HEADER_HEIGHT, HEADER_BGCOLOR); lcdDrawBitmapPattern(0, 0, LBM_TOPMENU_POLYGON, TITLE_BGCOLOR); diff --git a/radio/src/gui/horus/widget.h b/radio/src/gui/horus/widget.h index 69f9a0aaa..e08c72a24 100644 --- a/radio/src/gui/horus/widget.h +++ b/radio/src/gui/horus/widget.h @@ -90,6 +90,10 @@ class Widget { } + virtual void update() const + { + } + inline const WidgetFactory * getFactory() const { return factory;