From ab11fb75420948db1a29b322a54e021aeca13136 Mon Sep 17 00:00:00 2001
From: "alexandr.mruchok" <alexandr.mruchok@demlabs.net>
Date: Tue, 11 Feb 2020 14:12:02 +0200
Subject: [PATCH] [+] Added QStackedWidget initialization to AdaptiveWidget;
 [+] Added AnimationChangingWidget::currentWidget(); [+] Added
 MultiScreenAbstract::activeScreen(), MultiScreenAbstract::activeScreenName()
 [*] Changing gettting class name to AdaptiveScreen::scrinName(); [-] removed
 MultiScreenWindow::activateScreen() [-] removed property activeScreen from
 MultiScreenWindow [+] added MultiScreenWindow::activeScreenName

---
 controls/AdaptiveWidget.cpp          |  3 +-
 controls/AdaptiveWidget.h            |  2 +-
 controls/AnimationChangingWidget.cpp | 10 ++++++
 controls/AnimationChangingWidget.h   |  3 +-
 screens/AdaptiveScreen.h             |  1 +
 screens/DefaultMultiScreen.h         |  4 +--
 screens/MultiScreenAbstract.cpp      | 47 ++++++++++++++++++++++------
 screens/MultiScreenAbstract.h        | 39 +++++++++++++----------
 screens/MultiScreenWindow.cpp        | 14 ++-------
 screens/MultiScreenWindow.h          |  5 +--
 10 files changed, 80 insertions(+), 48 deletions(-)

diff --git a/controls/AdaptiveWidget.cpp b/controls/AdaptiveWidget.cpp
index b266971..91a3444 100644
--- a/controls/AdaptiveWidget.cpp
+++ b/controls/AdaptiveWidget.cpp
@@ -1,6 +1,7 @@
 #include "AdaptiveWidget.h"
 
-AdaptiveWidget::AdaptiveWidget(QWidget *parent /*= nullptr*/)
+AdaptiveWidget::AdaptiveWidget(QWidget *a_parent /*= nullptr*/)
+    :QStackedWidget(a_parent)
 {
 
 }
diff --git a/controls/AdaptiveWidget.h b/controls/AdaptiveWidget.h
index 673aa85..338c770 100644
--- a/controls/AdaptiveWidget.h
+++ b/controls/AdaptiveWidget.h
@@ -8,7 +8,7 @@
 class AdaptiveWidget : public QStackedWidget
 {
 public:
-    AdaptiveWidget(QWidget *parent = nullptr);
+    AdaptiveWidget(QWidget *a_parent = nullptr);
 
     QWidget* variant(ScreenInfo::Rotation a_rotation = ScreenInfo::Rotation::Horizontal);
 
diff --git a/controls/AnimationChangingWidget.cpp b/controls/AnimationChangingWidget.cpp
index db4c511..69daeea 100644
--- a/controls/AnimationChangingWidget.cpp
+++ b/controls/AnimationChangingWidget.cpp
@@ -116,6 +116,16 @@ void AnimationChangingWidget::setCurrentIndex(int a_index)
     m_animation.start();
 }
 
+QWidget *AnimationChangingWidget::currentWidget()
+{
+    QLayoutItem* currentItem = m_ltWidgetPlacement.itemAt(this->currentIndex());
+
+    if (!currentItem)
+        return nullptr;
+
+    return currentItem->widget();
+}
+
 /**
  * @brief Getter for currentIndex
  * @return Current index
diff --git a/controls/AnimationChangingWidget.h b/controls/AnimationChangingWidget.h
index c90db62..0647826 100644
--- a/controls/AnimationChangingWidget.h
+++ b/controls/AnimationChangingWidget.h
@@ -26,7 +26,8 @@ public:
     void setCurrentWidget(QWidget *a_widget);
     void setCurrentIndex (int a_index);
 
-    int  currentIndex ();
+    QWidget *currentWidget();
+    int      currentIndex ();
 
     int  count() const;
 
diff --git a/screens/AdaptiveScreen.h b/screens/AdaptiveScreen.h
index b7af840..4b58c45 100644
--- a/screens/AdaptiveScreen.h
+++ b/screens/AdaptiveScreen.h
@@ -5,6 +5,7 @@
 
 class AdaptiveScreen : public AdaptiveWidget
 {
+    Q_OBJECT
 public:
 
     AdaptiveScreen(QWidget *a_parent = nullptr);
diff --git a/screens/DefaultMultiScreen.h b/screens/DefaultMultiScreen.h
index 2a95959..66f4225 100755
--- a/screens/DefaultMultiScreen.h
+++ b/screens/DefaultMultiScreen.h
@@ -59,7 +59,6 @@ public:
     {
         if (a_wgScreen->objectName().isEmpty())
             a_wgScreen->setObjectName(QStringLiteral("FullScreenMultiScreen"));
- //       a_wgScreen->resize(1280, 804);
         horizontalLayout = new QHBoxLayout(a_wgScreen);
         horizontalLayout->setSpacing(0);
         horizontalLayout->setObjectName(QStringLiteral("centralLayout"));
@@ -68,8 +67,7 @@ public:
 
         changingScreen = new AnimationChangingWidget(a_wgScreen);
         changingScreen->setObjectName(QStringLiteral("changingScreen"));
-        changingScreen->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
-        changingScreen->setStyleSheet("#changingScreen{}");
+        changingScreen->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
         horizontalLayout->addWidget(changingScreen);
     } // setupUi
 
diff --git a/screens/MultiScreenAbstract.cpp b/screens/MultiScreenAbstract.cpp
index 97ed0e6..6b1b63a 100755
--- a/screens/MultiScreenAbstract.cpp
+++ b/screens/MultiScreenAbstract.cpp
@@ -31,10 +31,26 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
  */
 MultiScreenAbstract::MultiScreenAbstract(QWidget *parent)
     :AdaptiveScreen(parent),
-    m_wgChangedScreen(nullptr)
+    m_wgtChangingScreen(nullptr)
 {
 }
 
+AdaptiveScreen *MultiScreenAbstract::activeScreen()
+{
+    QWidget* l_activeWidget = this->wgtChangingScreen()->currentWidget();
+    return qobject_cast<AdaptiveScreen*>(l_activeWidget);
+}
+
+QString MultiScreenAbstract::activeScreenName()
+{
+    AdaptiveScreen* activeScreen = this->activeScreen();
+
+    if (!activeScreen)
+        return QString();
+
+    return this->activeScreen()->screenName();
+}
+
 /**
  * @brief Activate child a_screen. a_screen must exist
  * @param a_screen pointer to child screen
@@ -42,20 +58,33 @@ MultiScreenAbstract::MultiScreenAbstract(QWidget *parent)
  */
 MultiScreenAbstract *MultiScreenAbstract::activateChildScreen(AdaptiveScreen *a_screen)
 {
-    Q_ASSERT_X(qobject_cast<MultiScreenAbstract*>(a_screen->parent()) == this, "activateDescendantScreen", "screen is not a child of this screen");
+    Q_ASSERT_X(MultiScreenAbstract::parentMultiscreen(a_screen) == this, "activateDescendantScreen", "screen is not a child of this screen");
 
-    m_wgChangedScreen->setCurrentWidget(a_screen);
+    m_wgtChangingScreen->setCurrentWidget(a_screen);
 
     return (this);
 }
 
+MultiScreenAbstract *MultiScreenAbstract::parentMultiscreen(AdaptiveScreen *a_screen)
+{
+    MultiScreenAbstract *l_parentMultiscr;
+
+    for (QObject *parentObj = a_screen->parent(); parentObj; parentObj = parentObj->parent())
+    {
+        l_parentMultiscr = qobject_cast<MultiScreenAbstract*>(parentObj);
+        if (l_parentMultiscr)
+            return l_parentMultiscr;
+    }
+    return nullptr;
+}
+
 /**
- * @brief Getter for m_wgChangedScreen
+ * @brief Getter for m_wgChangingScreen
  * @return pointer to AnimationChangingWidget
  */
-AnimationChangingWidget *MultiScreenAbstract::wgChangedScreen()
+AnimationChangingWidget *MultiScreenAbstract::wgtChangingScreen()
 {
-    return m_wgChangedScreen;
+    return m_wgtChangingScreen;
 }
 
 
@@ -70,10 +99,10 @@ void MultiScreenAbstract::initChangedScreen(QWidget *a_widget)
         a_widget = variant(ScreenInfo::currentRotation());
 
     // Initializing pointers to window widgets
-    m_wgChangedScreen = a_widget->findChild<AnimationChangingWidget*>();
-    Q_ASSERT(m_wgChangedScreen);
+    m_wgtChangingScreen = a_widget->findChild<AnimationChangingWidget*>();
+    Q_ASSERT(m_wgtChangingScreen);
 
-    connect(m_wgChangedScreen, &AnimationChangingWidget::animationFinished, [=]{
+    connect(m_wgtChangingScreen, &AnimationChangingWidget::animationFinished, [=]{
         emit animationFinished();
     });
 
diff --git a/screens/MultiScreenAbstract.h b/screens/MultiScreenAbstract.h
index 9ede96a..b6f0f06 100755
--- a/screens/MultiScreenAbstract.h
+++ b/screens/MultiScreenAbstract.h
@@ -24,8 +24,6 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #pragma once
 
 #include <QWidget>
-#include <typeinfo>
-
 #include "DapUiScreen.h"
 #include "AdaptiveScreen.h"
 #include "controls/AnimationChangingWidget.h"
@@ -62,9 +60,13 @@ public:
     template<class T>
     T *activateScreen();
 
+    AdaptiveScreen* activeScreen();
+    QString activeScreenName();
+
     MultiScreenAbstract *activateChildScreen(AdaptiveScreen *a_screen);
+    static MultiScreenAbstract *parentMultiscreen(AdaptiveScreen *a_screen);
 
-    AnimationChangingWidget *wgChangedScreen();
+    AnimationChangingWidget *wgtChangingScreen();
 
 signals:
     void animationFinished();                       ///< Emits this signal after the animation transition has reached the end.
@@ -74,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_wgChangedScreen;     ///< Pointer to ChangingWidget controll
+    AnimationChangingWidget *m_wgtChangingScreen;     ///< Pointer to ChangingWidget controll
 
 private:
     QMap<QString, AdaptiveScreen*> m_screens;          ///< Map with all screens that can be activated
@@ -107,8 +109,8 @@ T *MultiScreenAbstract::createSubScreen(int a_index /*= -1*/)
     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);
+    m_screens.insert(newScreen->screenName(), newScreen);
+    wgtChangingScreen()->insertWidget(a_index, newScreen);
 
     return newScreen;
 }
@@ -121,17 +123,16 @@ T *MultiScreenAbstract::createSubScreen(int a_index /*= -1*/)
 template<class T>
 void MultiScreenAbstract::removeSubscreen()
 {
-    DapUiScreen *screen = subScreen<T>(); // Find subscrin
+    AdaptiveScreen *screen = subScreen<T>(); // Find subscreen
 
     if (screen) { // If found ...
         // 1. remove from parent ChangingWidget, ...
         MultiScreenAbstract *parentScreen = qobject_cast<MultiScreenAbstract*> (screen->parent());
-        parentScreen->wgChangedScreen()->removeWidget(screen->sw());
+        parentScreen->wgtChangingScreen()->removeWidget(screen);
         // 2. delete stackedWidget and screen
-        delete screen->sw();
-        delete screen;
+        m_screens.remove(screen->screenName());
         // 3. delete from Map with screens pointers
-        m_screens.remove(typeid(T).name());
+        delete screen;
     }
     // if isn't found do nothing
 }
@@ -150,7 +151,7 @@ NewT *MultiScreenAbstract::replaceSubscreen()
     if (oldScreen) {// If found ...
         //1. get index of oldScreen stacked widget
         MultiScreenAbstract *parentScreen = qobject_cast<MultiScreenAbstract*>(oldScreen->parent());
-        int index = parentScreen->wgChangedScreen()->indexOf(oldScreen->sw());
+        int index = parentScreen->wgtChangingScreen()->indexOf(oldScreen->sw());
         //2. remove oldScreen, ...
         parentScreen->removeSubscreen<OldT>();
         //3. create new subscreen in the place of deleted
@@ -169,13 +170,17 @@ NewT *MultiScreenAbstract::replaceSubscreen()
 template<class T>
 T *MultiScreenAbstract::subScreen()
 {
-    QString screenTypeName =  typeid(T).name();
-
-    T *foundScreen = qobject_cast<T*>(m_screens.value(screenTypeName, nullptr)); // Searh in m_screens
+    T *foundScreen = nullptr;
 
     //  If isn't found search in all subScreens recursively
     auto i = m_screens.constBegin();
-    while (i != m_screens.constEnd() and !foundScreen) {
+    while (i != m_screens.constEnd() and !foundScreen)
+    {
+        //if this screen is searched return it
+        foundScreen = qobject_cast<T*>(i.value());
+        if (foundScreen)
+            return foundScreen;
+
         MultiScreenAbstract *curScreen = qobject_cast<MultiScreenAbstract*>(i.value());
         //if i.value() is DapUIAnimationScreenAbstract object search in all subScreens
         if (curScreen)
@@ -201,7 +206,7 @@ T *MultiScreenAbstract::activateScreen()
         screen = createSubScreen<T>();
 
     // Activate all parent screens in line from found screen to this
-    MultiScreenAbstract *parent = qobject_cast<MultiScreenAbstract*>(screen->parent());
+    MultiScreenAbstract *parent = MultiScreenAbstract::parentMultiscreen(screen);
     AdaptiveScreen *nextScreen = screen;
     //do while parent is not this screen
     while (nextScreen != this) {
diff --git a/screens/MultiScreenWindow.cpp b/screens/MultiScreenWindow.cpp
index f985664..447aeba 100644
--- a/screens/MultiScreenWindow.cpp
+++ b/screens/MultiScreenWindow.cpp
@@ -12,19 +12,9 @@ MultiScreenWindow::MultiScreenWindow(MultiScreenAbstract* a_centralScreen /*= nu
     setCentralWidget(a_centralScreen);
 }
 
-void MultiScreenWindow::activateScreen(const QString &a_screenName)
+QString MultiScreenWindow::activeScreenName()
 {
-    if (a_screenName == StartScreen::SCREEN_NAME)
-        m_centralScreen->activateScreen<StartScreen>();
-    else
-        return;
-
-    m_activeScreen = a_screenName;
-}
-
-QString MultiScreenWindow::activeScreen()
-{
-
+    return centralScreen()->activeScreenName();
 }
 
 MultiScreenAbstract *MultiScreenWindow::centralScreen()
diff --git a/screens/MultiScreenWindow.h b/screens/MultiScreenWindow.h
index d1af8cd..40453d9 100644
--- a/screens/MultiScreenWindow.h
+++ b/screens/MultiScreenWindow.h
@@ -6,18 +6,15 @@
 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);
 
-    void activateScreen (const QString& a_screenName);
-    QString activeScreen();
-
     MultiScreenAbstract* centralScreen();
     MultiScreenAbstract* m_centralScreen;
 
+    QString activeScreenName();
 private:
     QString m_activeScreen;
 };
-- 
GitLab