From 74d7b97ad8dd12b3929813894dd216c80d9bdd70 Mon Sep 17 00:00:00 2001
From: "alexandr.mruchok" <alexandr.mruchok@demlabs.net>
Date: Fri, 7 Feb 2020 23:25:10 +0200
Subject: [PATCH] [+] Added AdaptiveScreen::initScreen(this); [+] Added
 DefaultMultiScreen::SCREEN_NAME [+] Added MultiScreenWindow::activeScreen [+]
 MultiScreenWindow::centralScreen()

---
 screens/AdaptiveScreen.cpp     |  3 ++-
 screens/AdaptiveScreen.h       | 14 +++++++++++++-
 screens/DefaultMultiScreen.cpp |  7 +++++++
 screens/DefaultMultiScreen.h   |  4 ++++
 screens/MultiScreenAbstract.h  |  8 ++++----
 screens/MultiScreenWindow.cpp  | 25 +++++++++++++++++++++++++
 screens/MultiScreenWindow.h    | 11 ++++++++++-
 7 files changed, 65 insertions(+), 7 deletions(-)

diff --git a/screens/AdaptiveScreen.cpp b/screens/AdaptiveScreen.cpp
index c11ab70..3d25631 100644
--- a/screens/AdaptiveScreen.cpp
+++ b/screens/AdaptiveScreen.cpp
@@ -1,8 +1,9 @@
 #include "AdaptiveScreen.h"
 
+AdaptiveScreen::InitializerFunc AdaptiveScreen::s_initializerFunc = nullptr;
 
 AdaptiveScreen::AdaptiveScreen(QWidget *a_parent /*= nullptr*/)
     : AdaptiveWidget(a_parent)
 {
-
+    AdaptiveScreen::initScreen(this);
 }
diff --git a/screens/AdaptiveScreen.h b/screens/AdaptiveScreen.h
index e2400d3..b7af840 100644
--- a/screens/AdaptiveScreen.h
+++ b/screens/AdaptiveScreen.h
@@ -6,12 +6,24 @@
 class AdaptiveScreen : public AdaptiveWidget
 {
 public:
+
     AdaptiveScreen(QWidget *a_parent = nullptr);
 
 //    virtual void activateScreen() = 0;
-//    virtual QString screenName() = 0;
+    virtual QString screenName() = 0;
 
     virtual void initVariantUi(QWidget * a_widget) = 0;
+
+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;
+
 };
 
 #endif // SCREEN_H
diff --git a/screens/DefaultMultiScreen.cpp b/screens/DefaultMultiScreen.cpp
index caf73e3..67a0a74 100755
--- a/screens/DefaultMultiScreen.cpp
+++ b/screens/DefaultMultiScreen.cpp
@@ -24,6 +24,8 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 
 #include "DefaultMultiScreen.h"
 
+const QString DefaultMultiScreen::SCREEN_NAME("FullScreen");
+
 /**
  * @brief Overloaded constructor.
  * @param a_parent Parent.
@@ -35,6 +37,11 @@ DefaultMultiScreen::DefaultMultiScreen(QWidget *a_parent)
     create<Ui_DefaultMultiScreen>();
 }
 
+QString DefaultMultiScreen::screenName()
+{
+    return DefaultMultiScreen::SCREEN_NAME;
+}
+
 /**
  * @brief Form initialization.
  * @param a_w Window GUI widget.
diff --git a/screens/DefaultMultiScreen.h b/screens/DefaultMultiScreen.h
index a619df5..2a95959 100755
--- a/screens/DefaultMultiScreen.h
+++ b/screens/DefaultMultiScreen.h
@@ -34,6 +34,10 @@ class DefaultMultiScreen : public MultiScreenAbstract
 public:
     DefaultMultiScreen(QWidget *a_parent = nullptr);
 
+    virtual QString screenName() override;
+    static const QString SCREEN_NAME;
+
+
 protected:
     virtual void initVariantUi(QWidget * a_widget) override;
 
diff --git a/screens/MultiScreenAbstract.h b/screens/MultiScreenAbstract.h
index 86a06f4..9ede96a 100755
--- a/screens/MultiScreenAbstract.h
+++ b/screens/MultiScreenAbstract.h
@@ -72,11 +72,12 @@ signals:
 protected:
     virtual void initChangedScreen(QWidget * a_w);  ///< Find changingWidget and assign to m_wgChangedScreen
     virtual void initVariantUi(QWidget * a_widget) = 0; ///<pure virtual method. Must de reimplement it inherited classes
+    virtual QString screenName() = 0;
 
     AnimationChangingWidget *m_wgChangedScreen;     ///< Pointer to ChangingWidget controll
 
 private:
-    QMap<QString, DapUiScreen*> m_screens;          ///< Map with all screens that can be activated
+    QMap<QString, AdaptiveScreen*> m_screens;          ///< Map with all screens that can be activated
 };
 
 
@@ -103,12 +104,11 @@ T *MultiScreenAbstract::createSubScreen(int a_index /*= -1*/)
     if (subScreen<T>())
         return newScreen;
 
-    QStackedWidget *newSW = new QStackedWidget(m_wgChangedScreen);  // Create QStackedWidget for new screen and screen;
-    newScreen = new T(this, newSW);                              // Create new screen
+    newScreen = new T(this);                              // Create new screen
 
     //insert screen to m_screens and changing sreen widget
     m_screens.insert(typeid(T).name(), newScreen);
-    m_wgChangedScreen->insertWidget(a_index, newScreen->sw());
+    m_wgChangedScreen->insertWidget(a_index, newScreen);
 
     return newScreen;
 }
diff --git a/screens/MultiScreenWindow.cpp b/screens/MultiScreenWindow.cpp
index d15a288..f985664 100644
--- a/screens/MultiScreenWindow.cpp
+++ b/screens/MultiScreenWindow.cpp
@@ -1,8 +1,33 @@
 #include "MultiScreenWindow.h"
 
+#include "StartScreen.h"
+
 MultiScreenWindow::MultiScreenWindow(MultiScreenAbstract* a_centralScreen /*= nullptr*/, QWidget *a_parent /*= nullptr*/)
     : QMainWindow(a_parent)
 {
     if (!a_centralScreen)
         a_centralScreen = new DefaultMultiScreen(this);
+
+    m_centralScreen = a_centralScreen;
+    setCentralWidget(a_centralScreen);
+}
+
+void MultiScreenWindow::activateScreen(const QString &a_screenName)
+{
+    if (a_screenName == StartScreen::SCREEN_NAME)
+        m_centralScreen->activateScreen<StartScreen>();
+    else
+        return;
+
+    m_activeScreen = a_screenName;
+}
+
+QString MultiScreenWindow::activeScreen()
+{
+
+}
+
+MultiScreenAbstract *MultiScreenWindow::centralScreen()
+{
+    return m_centralScreen;
 }
diff --git a/screens/MultiScreenWindow.h b/screens/MultiScreenWindow.h
index 94bc30a..d1af8cd 100644
--- a/screens/MultiScreenWindow.h
+++ b/screens/MultiScreenWindow.h
@@ -6,11 +6,20 @@
 class MultiScreenWindow : public QMainWindow
 {
     Q_OBJECT
+    Q_PROPERTY(QString activeScreen READ activeScreen WRITE activateScreen)
+
+    using QMainWindow::setCentralWidget; //disable access to setCentralWidget.
 public:
     explicit MultiScreenWindow(MultiScreenAbstract* a_centralScreen = nullptr, QWidget *a_parent = nullptr);
 
-signals:
+    void activateScreen (const QString& a_screenName);
+    QString activeScreen();
+
+    MultiScreenAbstract* centralScreen();
+    MultiScreenAbstract* m_centralScreen;
 
+private:
+    QString m_activeScreen;
 };
 
 #endif // MULTISCREENWINDOW_H
-- 
GitLab