[Horus] Better handling of theme options
This commit is contained in:
@@ -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<int>(0, x, 255)) >> 4)
|
||||
#define TO5BITS(x) (uint32_t(limit<int>(0, x, 255)) >> 3)
|
||||
#define TO6BITS(x) (uint32_t(limit<int>(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_
|
||||
|
||||
@@ -44,6 +44,10 @@ class Layout: public WidgetsContainer<MAX_LAYOUT_ZONES, MAX_LAYOUT_OPTIONS>
|
||||
return factory;
|
||||
}
|
||||
|
||||
virtual void update()
|
||||
{
|
||||
}
|
||||
|
||||
protected:
|
||||
const LayoutFactory * factory;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -155,7 +155,6 @@ void loadTheme()
|
||||
loadTheme(new_theme);
|
||||
}
|
||||
else {
|
||||
theme->init();
|
||||
theme->load();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,6 +59,10 @@ class Theme
|
||||
|
||||
void init() const;
|
||||
|
||||
virtual void update() const
|
||||
{
|
||||
}
|
||||
|
||||
ZoneOptionValue * getOptionValue(unsigned int index) const;
|
||||
|
||||
virtual void load() const;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -90,6 +90,10 @@ class Widget
|
||||
{
|
||||
}
|
||||
|
||||
virtual void update() const
|
||||
{
|
||||
}
|
||||
|
||||
inline const WidgetFactory * getFactory() const
|
||||
{
|
||||
return factory;
|
||||
|
||||
Reference in New Issue
Block a user