From e6697639c7c3de3c770d70056ead096d60e53a46 Mon Sep 17 00:00:00 2001 From: Peter Feerick Date: Mon, 8 Nov 2021 20:27:38 +1000 Subject: [PATCH] Rename modelBmp using new 'displayName', add more options (#544) * Make img buf only size of img not whole widget * Don't draw buffer if there's no image * If there's no image, draw model name * Add some options, draw model name if img not set Add options for text colour, size, fill enable and colour * Use valid values for defaults * Get right colours * Add concept of a 'friendly name to widgets' Allows for separation of internal and user visible names * Use new theme constants * Use right version of libopenui * `displayName` instead of `friendlyName` * Allow using theme colour or custom for name --- radio/src/gui/colorlcd/screen_setup.cpp | 4 +- radio/src/gui/colorlcd/widget.h | 12 +++- radio/src/gui/colorlcd/widgets/modelbmp.cpp | 55 ++++++++++++++----- .../colorlcd/widgets/widgets_container_impl.h | 4 +- radio/src/thirdparty/libopenui | 2 +- radio/src/translations.cpp | 2 + radio/src/translations.h | 2 + radio/src/translations/untranslated.h | 2 + 8 files changed, 62 insertions(+), 21 deletions(-) diff --git a/radio/src/gui/colorlcd/screen_setup.cpp b/radio/src/gui/colorlcd/screen_setup.cpp index 7aca8e660..5d7fbfb57 100644 --- a/radio/src/gui/colorlcd/screen_setup.cpp +++ b/radio/src/gui/colorlcd/screen_setup.cpp @@ -121,11 +121,11 @@ SetupWidgetsPageSlot::SetupWidgetsPageSlot(FormGroup * parent, const rect_t & re menu->addLine(TR_SELECT_WIDGET, [=]() { Menu * menu = new Menu(parent); for (auto factory: getRegisteredWidgets()) { - menu->addLine(factory->getName(), [=]() { + menu->addLine(factory->getDisplayName(), [=]() { container->createWidget(slotIndex, factory); auto widget = container->getWidget(slotIndex); if(widget->getOptions() && widget->getOptions()->name) - new WidgetSettings(parent, widget); + new WidgetSettings(parent, widget); }); } }); diff --git a/radio/src/gui/colorlcd/widget.h b/radio/src/gui/colorlcd/widget.h index 51ae95129..3ab4700c7 100644 --- a/radio/src/gui/colorlcd/widget.h +++ b/radio/src/gui/colorlcd/widget.h @@ -120,8 +120,9 @@ void unregisterWidget(const WidgetFactory * factory); class WidgetFactory { public: - explicit WidgetFactory(const char * name, const ZoneOption * options = nullptr): + explicit WidgetFactory(const char * name, const ZoneOption * options = nullptr, const char * displayName = nullptr): name(name), + displayName(displayName), options(options) { registerWidget(this); @@ -139,6 +140,14 @@ class WidgetFactory return options; } + inline const char * getDisplayName() const + { + if (displayName) + return displayName; + else + return name; + } + void initPersistentData(Widget::PersistentData * persistentData) const { memset(persistentData, 0, sizeof(Widget::PersistentData)); @@ -157,6 +166,7 @@ class WidgetFactory protected: const char * name; + const char * displayName; const ZoneOption * options; }; diff --git a/radio/src/gui/colorlcd/widgets/modelbmp.cpp b/radio/src/gui/colorlcd/widgets/modelbmp.cpp index 8d1ab9906..e4a9409af 100644 --- a/radio/src/gui/colorlcd/widgets/modelbmp.cpp +++ b/radio/src/gui/colorlcd/widgets/modelbmp.cpp @@ -35,6 +35,24 @@ class ModelBitmapWidget: public Widget void refresh(BitmapBuffer * dc) override { + std::string filename = std::string(g_model.header.bitmap); + + // set font colour from options[0], if use theme color option off + LcdFlags fontColor; + if (persistentData->options[4].value.boolValue) + fontColor = COLOR_THEME_SECONDARY1; + else + fontColor = COLOR2FLAGS(persistentData->options[0].value.unsignedValue); + + // get font size from options[1] + LcdFlags fontSize = persistentData->options[1].value.unsignedValue << 8u; + + // fill bg from options[3] if options[2] set + if (persistentData->options[2].value.boolValue) { + LcdFlags fillColour = COLOR2FLAGS(persistentData->options[3].value.unsignedValue); + dc->drawSolidFilledRect(0, 0, width(), height(), fillColour); + } + if (buffer && ((buffer->width() != width()) || (buffer->height() != height()) || (deps_hash != getHash()))) { @@ -46,22 +64,20 @@ class ModelBitmapWidget: public Widget // big space to draw if (rect.h >= 96 && rect.w >= 120) { - if (buffer) { - dc->drawBitmap(0, 0, buffer.get()); + if (!filename.empty() && buffer) { + dc->drawBitmap(0, 38, buffer.get()); } - auto iconMask = theme->getIconMask(ICON_MODEL); - if (iconMask) { - dc->drawMask(6, 4, iconMask, COLOR_THEME_SECONDARY1); - } - - dc->drawSizedText(45, 10, g_model.header.name, LEN_MODEL_NAME, - FONT(XS) | COLOR_THEME_SECONDARY1); - dc->drawSolidFilledRect(39, 27, rect.w - 48, 2, COLOR_THEME_SECONDARY1); + dc->drawSizedText(5, 5, g_model.header.name, LEN_MODEL_NAME, fontSize | fontColor); } // smaller space to draw - else if (buffer) { - dc->drawBitmap(0, 0, buffer.get()); + else { + if (!filename.empty() && buffer) { + dc->drawBitmap(0, 0, buffer.get()); + } + else { + dc->drawSizedText(0, 0, g_model.header.name, LEN_MODEL_NAME, fontSize | fontColor); + } } } @@ -73,6 +89,8 @@ class ModelBitmapWidget: public Widget } } + static const ZoneOption options[]; + protected: std::unique_ptr buffer; uint32_t deps_hash = 0; @@ -100,7 +118,7 @@ class ModelBitmapWidget: public Widget } if (rect.h >= 96 && rect.w >= 120) { - buffer->drawScaledBitmap(bitmap.get(), 0, 38, width(), height() - 38); + buffer->drawScaledBitmap(bitmap.get(), 0, 0, width(), height() - 38); } else { buffer->drawScaledBitmap(bitmap.get(), 0, 0, width(), height()); } @@ -108,5 +126,12 @@ class ModelBitmapWidget: public Widget } }; -BaseWidgetFactory modelBitmapWidget("ModelBmp", nullptr); -const WidgetFactory * defaultWidget = &modelBitmapWidget; +const ZoneOption ModelBitmapWidget::options[] = { + {STR_COLOR, ZoneOption::Color, OPTION_VALUE_UNSIGNED(COLOR_THEME_SECONDARY1>>16)}, + {STR_SIZE, ZoneOption::TextSize, OPTION_VALUE_UNSIGNED(FONT_STD_INDEX)}, + {STR_FILL_BACKGROUND, ZoneOption::Bool, OPTION_VALUE_BOOL(false)}, + {STR_BG_COLOR, ZoneOption::Color, OPTION_VALUE_UNSIGNED(COLOR_THEME_SECONDARY3>>16)}, + {STR_USE_THEME_COLOR, ZoneOption::Bool, OPTION_VALUE_BOOL(true)}, + {nullptr, ZoneOption::Bool}}; + +BaseWidgetFactory modelBitmapWidget("ModelBmp", ModelBitmapWidget::options, "Models"); diff --git a/radio/src/gui/colorlcd/widgets/widgets_container_impl.h b/radio/src/gui/colorlcd/widgets/widgets_container_impl.h index a11d4ba18..4bb647fe6 100644 --- a/radio/src/gui/colorlcd/widgets/widgets_container_impl.h +++ b/radio/src/gui/colorlcd/widgets/widgets_container_impl.h @@ -160,8 +160,8 @@ template class BaseWidgetFactory: public WidgetFactory { public: - BaseWidgetFactory(const char * name, const ZoneOption * options): - WidgetFactory(name, options) + BaseWidgetFactory(const char * name, const ZoneOption * options, const char * displayName = nullptr): + WidgetFactory(name, options, displayName) { } diff --git a/radio/src/thirdparty/libopenui b/radio/src/thirdparty/libopenui index 89fe9cda1..ebf86ef1c 160000 --- a/radio/src/thirdparty/libopenui +++ b/radio/src/thirdparty/libopenui @@ -1 +1 @@ -Subproject commit 89fe9cda18fe3ef4fb2346cfe30dc59900068b23 +Subproject commit ebf86ef1c49717005bd323aad1a994d613fa6424 diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 5ecc6660e..0f0b3a6a7 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -940,3 +940,5 @@ const char STR_RACING_MODE[] = TR_RACING_MODE; #if defined(PCBNV14) const char STR_RFPOWER_AFHDS2[] = TR_RFPOWER_AFHDS2; #endif + +const char STR_USE_THEME_COLOR[] = TR_USE_THEME_COLOR; diff --git a/radio/src/translations.h b/radio/src/translations.h index e1f198cbe..5501cb40e 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -1120,6 +1120,8 @@ extern const char STR_AUTH_FAILURE[]; extern const char STR_PROTOCOL[]; extern const char STR_RACING_MODE[]; +extern const char STR_USE_THEME_COLOR[]; + #define CHR_HOUR TR_CHR_HOUR #define CHR_INPUT TR_CHR_INPUT diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index 65a399f96..2a4c017e9 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -331,3 +331,5 @@ #define CHAR_CHANNEL STR_CHAR_CHANNEL[0] #define CHAR_TELEMETRY STR_CHAR_TELEMETRY[0] #define CHAR_LUA STR_CHAR_LUA[0] + +#define TR_USE_THEME_COLOR "Use theme color"