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