diff --git a/radio/src/gui/colorlcd/screen_setup.cpp b/radio/src/gui/colorlcd/screen_setup.cpp index 888cb5d1a..f36658835 100644 --- a/radio/src/gui/colorlcd/screen_setup.cpp +++ b/radio/src/gui/colorlcd/screen_setup.cpp @@ -155,23 +155,21 @@ class SetupWidgetsPageSlot: public Button screen(screen), slotIndex(slotIndex) { + widget = screen->getWidget(slotIndex); setPressHandler([=](){ Menu * menu = new Menu(this); menu->addLine("Select a widget", [=]() { Menu * menu = new Menu(this); for (auto factory: getRegisteredWidgets()) { menu->addLine(factory->getName(), [=]() { - if (widget) { - widget->deleteLater(); - } - // widget = factory->create(this, {1, 1, width() - 2, height() - 2}, &g_model.screenData[pageIndex].layoutData.zones[slotIndex].widgetData, true); - screen->createWidget(slotIndex, factory); + if (widget) widget->deleteLater(); + widget = screen->createWidget(slotIndex, factory); return 0; }); } return 0; }); - if (widget /*g_model.screenData[pageIndex].layoutData.zones[slotIndex].widgetName[0]*/) { + if (widget) { menu->addLine(STR_DELETE, [=]() { widget->deleteLater(); widget = nullptr; @@ -190,12 +188,14 @@ class SetupWidgetsPageSlot: public Button else { dc->drawRect(0, 0, width(), height(), 1, DOTTED, DEFAULT_COLOR); } + if (widget) + widget->paint(dc); } protected: Layout * screen; uint8_t slotIndex; - Window * widget = nullptr; + Widget * widget = nullptr; }; class SetupWidgetsPage: public FormWindow diff --git a/radio/src/gui/colorlcd/widget.h b/radio/src/gui/colorlcd/widget.h index ca2196f0e..e5c4f54f5 100644 --- a/radio/src/gui/colorlcd/widget.h +++ b/radio/src/gui/colorlcd/widget.h @@ -71,6 +71,16 @@ class Widget : public FormField return &persistentData->options[index].value; } + inline PersistentData * getPersistentData() + { + return persistentData; + } + + void paint(BitmapBuffer * dc) override + { + FormField::paint(dc); + } + virtual void background() { } diff --git a/radio/src/gui/colorlcd/widgets_container.h b/radio/src/gui/colorlcd/widgets_container.h index aefc22aa9..d1f020a5d 100644 --- a/radio/src/gui/colorlcd/widgets_container.h +++ b/radio/src/gui/colorlcd/widgets_container.h @@ -30,7 +30,8 @@ class WidgetsContainerInterface public: virtual unsigned int getZonesCount() const = 0; virtual rect_t getZone(unsigned int index) const = 0; - virtual void createWidget(unsigned int index, const WidgetFactory * factory) = 0; + virtual Widget * createWidget(unsigned int index, const WidgetFactory * factory) = 0; + virtual Widget * getWidget(unsigned int index) = 0; }; #define WIDGET_NAME_LEN 10 @@ -55,16 +56,25 @@ class WidgetsContainer: public FormGroup, public WidgetsContainerInterface { } - void createWidget(unsigned int index, const WidgetFactory * factory) override + Widget * createWidget(unsigned int index, const WidgetFactory * factory) override { + Widget * widget = nullptr; memset(persistentData->zones[index].widgetName, 0, sizeof(persistentData->zones[index].widgetName)); if (factory) { strncpy(persistentData->zones[index].widgetName, factory->getName(), sizeof(persistentData->zones[index].widgetName)); - widgets[index] = factory->create(this, getZone(index), &persistentData->zones[index].widgetData); - } - else { - widgets[index] = nullptr; + widget = factory->create(this, getZone(index), &persistentData->zones[index].widgetData); } + widgets[index] = widget; + + return widget; + } + + Widget * getWidget(unsigned int index) override + { + if (index < N) + return widgets[index]; + + return nullptr; } virtual void create()