diff --git a/screens/AdaptiveScreen.cpp b/screens/AdaptiveScreen.cpp index 3d25631e04fb9c5f569723d0f04e9a32af2b3c8d..c685f4103c01ef6718336af18cafca29668c11dc 100644 --- a/screens/AdaptiveScreen.cpp +++ b/screens/AdaptiveScreen.cpp @@ -1,9 +1,9 @@ #include "AdaptiveScreen.h" -AdaptiveScreen::InitializerFunc AdaptiveScreen::s_initializerFunc = nullptr; +QMap<QString, void*> AdaptiveScreen::s_initFuncMap; AdaptiveScreen::AdaptiveScreen(QWidget *a_parent /*= nullptr*/) : AdaptiveWidget(a_parent) { - AdaptiveScreen::initScreen(this); +// AdaptiveScreen::initScreen(this); } diff --git a/screens/AdaptiveScreen.h b/screens/AdaptiveScreen.h index 4b58c4534be9d0e82e2bb38a75be2d768f6368d1..c148214e92fcdf223a4a2f73681cfaed3d5b0c09 100644 --- a/screens/AdaptiveScreen.h +++ b/screens/AdaptiveScreen.h @@ -2,6 +2,7 @@ #define ADAPTIVE_SCREEN_H #include "AdaptiveWidget.h" +#include <QDebug> class AdaptiveScreen : public AdaptiveWidget { @@ -10,21 +11,42 @@ public: AdaptiveScreen(QWidget *a_parent = nullptr); -// virtual void activateScreen() = 0; virtual QString screenName() = 0; virtual void initVariantUi(QWidget * a_widget) = 0; + + template<typename T> + static void setInitFunc(void (*a_initFunc)(T*)); + protected: - typedef void (*InitializerFunc)(AdaptiveScreen*); template<typename T> - static void initScreen(T* a_screen){ - if (T::s_initializerFunc) - T::s_initializerFunc(a_screen); - }; - static InitializerFunc s_initializerFunc; + static void initScreen(T* a_screen); + +private: + + static QMap<QString, void*> s_initFuncMap; +}; + + +//////////////////////////////////////////////////////////////////////////////////////////////// + +template<typename T> +void AdaptiveScreen::setInitFunc(void (*a_initFunc)(T*)/*typename T::InitializerFunc a_initFunc*/) { + s_initFuncMap[T::SCREEN_NAME] = reinterpret_cast<void*>(a_initFunc); }; +template<typename T> +void AdaptiveScreen::initScreen(T* a_screen) { + void* l_initFunctionVoid = s_initFuncMap.value(T::SCREEN_NAME, nullptr); + if (l_initFunctionVoid) + { + typedef void (*funcType)(T*); + auto l_initFunction = reinterpret_cast<funcType>(l_initFunctionVoid); + l_initFunction(a_screen); + } +} + #endif // SCREEN_H diff --git a/screens/MultiScreenAbstract.cpp b/screens/MultiScreenAbstract.cpp index 6b1b63a6f808c04e579a96a044e2e905238ade8a..f6348ad92e1200954ef8bc7264bdfe995dbaaccb 100755 --- a/screens/MultiScreenAbstract.cpp +++ b/screens/MultiScreenAbstract.cpp @@ -30,8 +30,7 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic * @param a_sw Application window stack. */ MultiScreenAbstract::MultiScreenAbstract(QWidget *parent) - :AdaptiveScreen(parent), - m_wgtChangingScreen(nullptr) + :AdaptiveScreen(parent) { } diff --git a/screens/MultiScreenAbstract.h b/screens/MultiScreenAbstract.h index b6f0f063365f36da6d701eac3a47c525869f60c7..8cc8b5313974964aadb5cc1d090080621f39f931 100755 --- a/screens/MultiScreenAbstract.h +++ b/screens/MultiScreenAbstract.h @@ -76,7 +76,7 @@ protected: virtual void initVariantUi(QWidget * a_widget) = 0; ///<pure virtual method. Must de reimplement it inherited classes virtual QString screenName() = 0; - AnimationChangingWidget *m_wgtChangingScreen; ///< Pointer to ChangingWidget controll + AnimationChangingWidget *m_wgtChangingScreen = nullptr; ///< Pointer to ChangingWidget controll private: QMap<QString, AdaptiveScreen*> m_screens; ///< Map with all screens that can be activated