diff --git a/include/eepp/ui/uiwidgetcreator.hpp b/include/eepp/ui/uiwidgetcreator.hpp index 628b18968..2ef3db348 100644 --- a/include/eepp/ui/uiwidgetcreator.hpp +++ b/include/eepp/ui/uiwidgetcreator.hpp @@ -9,6 +9,7 @@ namespace EE { namespace UI { class EE_API UIWidgetCreator { public: typedef cb::Callback1 CustomWidgetCb; + typedef cb::Callback0 RegisterWidgetCb; static UIWidget * createFromName( std::string widgetName ); @@ -17,8 +18,17 @@ class EE_API UIWidgetCreator { static void removeCustomWidgetCallback( std::string widgetName ); static bool existsCustomWidgetCallback( std::string widgetName ); + + static void registerWidget( std::string widgetName, const RegisterWidgetCb& cb ); + + static void unregisterWidget( std::string widgetName ); + + static bool isWidgetRegistered( std::string widgetName ); protected: typedef std::map WidgetCallbackMap; + typedef std::map RegisteredWidgetCallbackMap; + + static RegisteredWidgetCallbackMap registeredWidget; static WidgetCallbackMap widgetCallback; }; diff --git a/src/eepp/ui/uiwidgetcreator.cpp b/src/eepp/ui/uiwidgetcreator.cpp index 456287f21..216519670 100644 --- a/src/eepp/ui/uiwidgetcreator.cpp +++ b/src/eepp/ui/uiwidgetcreator.cpp @@ -34,6 +34,8 @@ namespace EE { namespace UI { UIWidgetCreator::WidgetCallbackMap UIWidgetCreator::widgetCallback = UIWidgetCreator::WidgetCallbackMap(); +UIWidgetCreator::RegisteredWidgetCallbackMap UIWidgetCreator::registeredWidget = UIWidgetCreator::RegisteredWidgetCallbackMap(); + UIWidget * UIWidgetCreator::createFromName( std::string widgetName ) { String::toLowerInPlace( widgetName ); @@ -70,6 +72,10 @@ UIWidget * UIWidgetCreator::createFromName( std::string widgetName ) { else if ( widgetName == "touchdragable" ) return UITouchDragableWidget::New(); else if ( widgetName == "gridlayout" ) return UIGridLayout::New(); + if ( registeredWidget.find( widgetName ) != registeredWidget.end() ) { + return registeredWidget[ widgetName ].Call(); + } + if ( widgetCallback.find( widgetName ) != widgetCallback.end() ) { return widgetCallback[ widgetName ].Call( widgetName ); } @@ -89,4 +95,16 @@ bool UIWidgetCreator::existsCustomWidgetCallback( std::string widgetName ) { return widgetCallback.find( String::toLower( widgetName ) ) != widgetCallback.end(); } +void UIWidgetCreator::registerWidget( std::string widgetName, const UIWidgetCreator::RegisterWidgetCb & cb ) { + registeredWidget[ String::toLower( widgetName ) ] = cb; +} + +void UIWidgetCreator::unregisterWidget( std::string widgetName ) { + registeredWidget.erase( String::toLower( widgetName ) ); +} + +bool UIWidgetCreator::isWidgetRegistered( std::string widgetName ) { + return registeredWidget.find( String::toLower( widgetName ) ) != registeredWidget.end(); +} + }}