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
This commit is contained in:
Peter Feerick
2021-11-08 21:27:38 +11:00
committed by GitHub
parent 809db51509
commit e6697639c7
8 changed files with 62 additions and 21 deletions
+2 -2
View File
@@ -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);
});
}
});
+11 -1
View File
@@ -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;
};
+40 -15
View File
@@ -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<BitmapBuffer> 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> 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> modelBitmapWidget("ModelBmp", ModelBitmapWidget::options, "Models");
@@ -160,8 +160,8 @@ template<class T>
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)
{
}
+2
View File
@@ -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;
+2
View File
@@ -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
+2
View File
@@ -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"