diff --git a/radio/src/gui/480x272/screens_setup.cpp b/radio/src/gui/480x272/screens_setup.cpp index 49bebdd77..4d8b4f1f3 100644 --- a/radio/src/gui/480x272/screens_setup.cpp +++ b/radio/src/gui/480x272/screens_setup.cpp @@ -210,28 +210,26 @@ bool menuWidgetSettings(event_t event) bool menuWidgetChoice(event_t event) { static Widget * previousWidget; + static Widget * currentWidget; + static std::list::iterator iterator; static Widget::PersistentData tempData; switch (event) { case EVT_ENTRY: { - const WidgetFactory * factory; previousWidget = currentContainer->getWidget(currentZone); currentContainer->setWidget(currentZone, NULL); - menuHorizontalPosition = 0; + iterator = registeredWidgets.begin(); if (previousWidget) { - factory = previousWidget->getFactory(); - for (unsigned int i=0; igetName() == registeredWidgets[i]->getName()) { - menuHorizontalPosition = i; + const WidgetFactory * factory = previousWidget->getFactory(); + for (std::list::iterator it = registeredWidgets.begin(); it != registeredWidgets.end(); ++it) { + if (factory->getName() == (*it)->getName()) { + iterator = it; break; } } } - else { - factory = registeredWidgets[0]; - } - currentWidget = factory->create(currentContainer->getZone(currentZone), &tempData); + currentWidget = (*iterator)->create(currentContainer->getZone(currentZone), &tempData); break; } @@ -243,22 +241,24 @@ bool menuWidgetChoice(event_t event) case EVT_KEY_FIRST(KEY_ENTER): delete previousWidget; - currentContainer->createWidget(currentZone, registeredWidgets[menuHorizontalPosition]); + currentContainer->createWidget(currentZone, *iterator); storageDirty(EE_MODEL); popMenu(); return false; case EVT_ROTARY_RIGHT: - if (menuHorizontalPosition < int(countRegisteredWidgets-1)) { + if (iterator != registeredWidgets.end() && iterator != --registeredWidgets.end()) { + ++iterator; delete currentWidget; - currentWidget = registeredWidgets[++menuHorizontalPosition]->create(currentContainer->getZone(currentZone), &tempData); + currentWidget = (*iterator)->create(currentContainer->getZone(currentZone), &tempData); } break; case EVT_ROTARY_LEFT: - if (menuHorizontalPosition > 0) { + if (iterator != registeredWidgets.begin()) { + --iterator; delete currentWidget; - currentWidget = registeredWidgets[--menuHorizontalPosition]->create(currentContainer->getZone(currentZone), &tempData); + currentWidget = (*iterator)->create(currentContainer->getZone(currentZone), &tempData); } break; } diff --git a/radio/src/gui/480x272/widget.cpp b/radio/src/gui/480x272/widget.cpp index 441e85477..04f9e7c59 100644 --- a/radio/src/gui/480x272/widget.cpp +++ b/radio/src/gui/480x272/widget.cpp @@ -20,20 +20,17 @@ #include "opentx.h" -const WidgetFactory * registeredWidgets[MAX_REGISTERED_WIDGETS]; // TODO dynamic -unsigned int countRegisteredWidgets = 0; +std::list registeredWidgets; void registerWidget(const WidgetFactory * factory) { - if (countRegisteredWidgets < MAX_REGISTERED_WIDGETS) { - TRACE("register widget %s", factory->getName()); - registeredWidgets[countRegisteredWidgets++] = factory; - } + TRACE("register widget %s", factory->getName()); + registeredWidgets.push_back(factory); } const WidgetFactory * getWidgetFactory(const char * name) { - for (unsigned int i=0; i::iterator it = registeredWidgets.begin(); it != registeredWidgets.end();++it) { + const WidgetFactory * factory = *it; if (!strcmp(name, factory->getName())) { return factory; } diff --git a/radio/src/gui/480x272/widget.h b/radio/src/gui/480x272/widget.h index e6e003b10..a86aba272 100644 --- a/radio/src/gui/480x272/widget.h +++ b/radio/src/gui/480x272/widget.h @@ -23,6 +23,7 @@ #include #include +#include #define MAX_WIDGET_OPTIONS 5 @@ -185,9 +186,7 @@ inline const ZoneOption * Widget::getOptions() const return getFactory()->getOptions(); } -#define MAX_REGISTERED_WIDGETS 10 -extern unsigned int countRegisteredWidgets; -extern const WidgetFactory * registeredWidgets[MAX_REGISTERED_WIDGETS]; +extern std::list registeredWidgets; Widget * loadWidget(const char * name, const Zone & zone, Widget::PersistentData * persistentData); #endif // _WIDGET_H_