From 156cc7104016a444b9a3d4ad677e221f2e898a89 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Tue, 1 Oct 2019 11:48:53 +0200 Subject: [PATCH] Fix emission of viewToggled() signal for dock widgets that are not part of the state that is restored --- demo/MainWindow.cpp | 20 ++++++++++++++++++++ demo/MainWindow.h | 1 + src/DockContainerWidget.cpp | 7 ++++--- src/DockManager.cpp | 9 ++++++--- src/FloatingDockContainer.cpp | 6 ++++++ src/ads_globals.h | 2 ++ 6 files changed, 39 insertions(+), 6 deletions(-) diff --git a/demo/MainWindow.cpp b/demo/MainWindow.cpp index 949591d..ca19964 100644 --- a/demo/MainWindow.cpp +++ b/demo/MainWindow.cpp @@ -226,6 +226,13 @@ void MainWindowPrivate::createContent() auto BottomDockArea = DockManager->addDockWidget(ads::BottomDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), RighDockArea); DockManager->addDockWidget(ads::RightDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), RighDockArea); DockManager->addDockWidget(ads::CenterDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), BottomDockArea); + //DockManager->addDockWidget(ads::CenterDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), BottomDockArea); + //DockManager->addDockWidget(ads::CenterDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), BottomDockArea); + + for (auto DockWidget : DockManager->dockWidgetsMap()) + { + _this->connect(DockWidget, SIGNAL(viewToggled(bool)), SLOT(onViewToggled(bool))); + } } @@ -375,3 +382,16 @@ void CMainWindow::savePerspective() d->savePerspectives(); } + +//============================================================================ +void CMainWindow::onViewToggled(bool Open) +{ + auto DockWidget = qobject_cast(sender()); + if (!DockWidget) + { + return; + } + + qDebug() << DockWidget->objectName() << " viewToggled(" << Open << ")"; +} + diff --git a/demo/MainWindow.h b/demo/MainWindow.h index 3ea781e..887b899 100644 --- a/demo/MainWindow.h +++ b/demo/MainWindow.h @@ -58,6 +58,7 @@ private slots: void on_actionSaveState_triggered(bool); void on_actionRestoreState_triggered(bool); void savePerspective(); + void onViewToggled(bool Open); }; #endif // MAINWINDOW_H diff --git a/src/DockContainerWidget.cpp b/src/DockContainerWidget.cpp index 2fe5505..6d6fec3 100644 --- a/src/DockContainerWidget.cpp +++ b/src/DockContainerWidget.cpp @@ -695,12 +695,13 @@ bool DockContainerWidgetPrivate::restoreDockArea(QXmlStreamReader& s, QWidget*& CreatedWidget, bool Testing) { bool Ok; +#ifdef ADS_DEBUG_PRINT int Tabs = s.attributes().value("Tabs").toInt(&Ok); if (!Ok) { return false; } - +#endif QString CurrentDockWidget = s.attributes().value("Current").toString(); ADS_PRINT("Restore NodeDockArea Tabs: " << Tabs << " Current: " @@ -745,8 +746,8 @@ bool DockContainerWidgetPrivate::restoreDockArea(QXmlStreamReader& s, DockArea->addDockWidget(DockWidget); DockWidget->setToggleViewActionChecked(!Closed); DockWidget->setClosedState(Closed); - DockWidget->setProperty("closed", Closed); - DockWidget->setProperty("dirty", false); + DockWidget->setProperty(internal::ClosedProperty, Closed); + DockWidget->setProperty(internal::DirtyProperty, false); } if (Testing) diff --git a/src/DockManager.cpp b/src/DockManager.cpp index ca76413..8c4e8c9 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -102,7 +102,7 @@ struct DockManagerPrivate void hideFloatingWidgets() { - // Hide updates of floating widgets from use + // Hide updates of floating widgets from user for (auto FloatingWidget : FloatingWidgets) { FloatingWidget->hide(); @@ -221,7 +221,9 @@ bool DockManagerPrivate::restoreStateFromXml(const QByteArray &state, int versi } bool Result = true; +#ifdef ADS_DEBUG_PRINT int DockContainers = s.attributes().value("Containers").toInt(); +#endif ADS_PRINT(DockContainers); int DockContainerCount = 0; while (s.readNextStartElement()) @@ -262,13 +264,14 @@ void DockManagerPrivate::restoreDockWidgetsOpenState() // toggle view action the next time for (auto DockWidget : DockWidgetsMap) { - if (DockWidget->property("dirty").toBool()) + if (DockWidget->property(internal::DirtyProperty).toBool()) { DockWidget->flagAsUnassigned(); + emit DockWidget->viewToggled(false); } else { - DockWidget->toggleViewInternal(!DockWidget->property("closed").toBool()); + DockWidget->toggleViewInternal(!DockWidget->property(internal::ClosedProperty).toBool()); } } } diff --git a/src/FloatingDockContainer.cpp b/src/FloatingDockContainer.cpp index 41af3d3..ddca794 100644 --- a/src/FloatingDockContainer.cpp +++ b/src/FloatingDockContainer.cpp @@ -373,6 +373,12 @@ void CFloatingDockContainer::closeEvent(QCloseEvent *event) void CFloatingDockContainer::hideEvent(QHideEvent *event) { Super::hideEvent(event); + // Prevent toogleView() events during restore state + if (d->DockManager->isRestoringState()) + { + return; + } + for (auto DockArea : d->DockContainer->openedDockAreas()) { for (auto DockWidget : DockArea->openedDockWidgets()) diff --git a/src/ads_globals.h b/src/ads_globals.h index 9d591c0..b3c01b9 100644 --- a/src/ads_globals.h +++ b/src/ads_globals.h @@ -100,6 +100,8 @@ namespace internal { static const bool RestoreTesting = true; static const bool Restore = false; +static const char* const ClosedProperty = "close"; +static const char* const DirtyProperty = "dirty"; /** * Replace the from widget in the given splitter with the To widget