diff --git a/controls/AdaptiveWidget.cpp b/controls/AdaptiveWidget.cpp index b266971a7ef0f06d9c8283330e272f68cd14346f..91a3444a450739d7e1a7522f60cf0ec9f4af5940 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 673aa854a2b895f5a491895b348938c7531bf423..338c77050e8df8adfd3b07e31b19495a92749dc3 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 db4c51178035f6787663e264f350446a2f4438c0..69daeea465ae07017140080e61babf6b27763df8 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 c90db62a08bfe6f38144d7c8afaafd1fbe8059b1..0647826b9675f00a413ef8a1ebf951fd3661c341 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 b7af8408e17cb3a48278fd28aac2d9d4705b4ee8..4b58c4534be9d0e82e2bb38a75be2d768f6368d1 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 2a9595934f018d10747588c550a33619600d9c0b..66f422555c553440b66b0331ec5e277245d557d0 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 97ed0e60fd459afb5c4fa62f2d47475f9cc22ac4..6b1b63a6f808c04e579a96a044e2e905238ade8a 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 9ede96a4d25ff0f9049a91e8d10910208e27eb23..b6f0f063365f36da6d701eac3a47c525869f60c7 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 f985664067875d2dbf5354608c608242c013f3b1..447aeba0b347225893f8165933ad0b9e4de97795 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 d1af8cdf5a938231d804c05c7eafb3d5b3de9ce4..40453d904239e29af04d004a6900d08dbd96ab17 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; };