From 0b0ce05edc77585f9501d122f71dbf8142a9806d Mon Sep 17 00:00:00 2001
From: "alexandr.mruchok" <alexandr.mruchok@demlabs.net>
Date: Thu, 13 Feb 2020 10:18:08 +0200
Subject: [PATCH] [+] Added AdaptiveScreen::setInitFunc(); [*] Changed
 AdaptiveScreen::initScreen();

---
 screens/AdaptiveScreen.cpp      |  4 ++--
 screens/AdaptiveScreen.h        | 36 ++++++++++++++++++++++++++-------
 screens/MultiScreenAbstract.cpp |  3 +--
 screens/MultiScreenAbstract.h   |  2 +-
 4 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/screens/AdaptiveScreen.cpp b/screens/AdaptiveScreen.cpp
index 3d25631..c685f41 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 4b58c45..c148214 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 6b1b63a..f6348ad 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 b6f0f06..8cc8b53 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
-- 
GitLab