From dc99dd40d274df045b427f2fb7ab0968deaf9f94 Mon Sep 17 00:00:00 2001 From: David PHAM-VAN <1387855+DavBfr@users.noreply.github.com> Date: Fri, 26 Aug 2022 03:04:34 -0300 Subject: [PATCH] feat: Allow Lua widget to override built-in widget with same name (#2208) * Allow CPP Widgets Override with LUA * Reset a widget option it the type differs --- radio/src/gui/colorlcd/widget.cpp | 16 +++++++++++----- radio/src/gui/colorlcd/widget.h | 5 +++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/colorlcd/widget.cpp b/radio/src/gui/colorlcd/widget.cpp index 8b7edb05f..ebb617e06 100644 --- a/radio/src/gui/colorlcd/widget.cpp +++ b/radio/src/gui/colorlcd/widget.cpp @@ -158,11 +158,6 @@ std::list & getRegisteredWidgets() return widgets; } -void registerWidget(const WidgetFactory * factory) -{ - TRACE("register widget %s", factory->getName()); - getRegisteredWidgets().push_back(factory); -} void unregisterWidget(const WidgetFactory * factory) { @@ -181,6 +176,17 @@ const WidgetFactory * getWidgetFactory(const char * name) return nullptr; } +void registerWidget(const WidgetFactory * factory) +{ + auto name = factory->getName(); + auto oldWidget = getWidgetFactory(name); + if (oldWidget) { + unregisterWidget(oldWidget); + } + TRACE("register widget %s", name); + getRegisteredWidgets().push_back(factory); +} + Widget* loadWidget(const char* name, Window* parent, const rect_t& rect, WidgetPersistentData* persistentData) { diff --git a/radio/src/gui/colorlcd/widget.h b/radio/src/gui/colorlcd/widget.h index 81fa43e96..8c3543042 100644 --- a/radio/src/gui/colorlcd/widget.h +++ b/radio/src/gui/colorlcd/widget.h @@ -157,11 +157,12 @@ class WidgetFactory TRACE("WidgetFactory::initPersistentData() setting option '%s'", option->name); // TODO compiler bug? The CPU freezes ... persistentData->options[i++] = option->deflt; auto optVal = &persistentData->options[i]; - if (setDefault) { + auto optType = zoneValueEnumFromType(option->type); + if (setDefault || optVal->type != optType) { // reset to default value memcpy(&optVal->value, &option->deflt, sizeof(ZoneOptionValue)); + optVal->type = optType; } - optVal->type = zoneValueEnumFromType(option->type); } } }