@@ -759,8 +759,7 @@ CDockContainerWidget::CDockContainerWidget(CDockManager* DockManager, QWidget *p
759759 QFrame (parent),
760760 d (new DockContainerWidgetPrivate(this ))
761761{
762- d->isFloating = dynamic_cast <CFloatingDockContainer*>(parent) != 0 ;
763-
762+ d->isFloating = floatingWidget () != nullptr ;
764763 d->DockManager = DockManager;
765764 if (DockManager != this )
766765 {
@@ -986,8 +985,9 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi
986985 CDockAreaWidget* DockArea = dockAreaAt (TargetPos);
987986 auto dropArea = InvalidDockWidgetArea;
988987 auto ContainerDropArea = d->DockManager ->containerOverlay ()->dropAreaUnderCursor ();
989- CDockWidget* TopLevelDockWidget = FloatingWidget->hasTopLevelDockWidget () ?
990- FloatingWidget->topLevelDockWidget () : nullptr ;
988+ CDockWidget* FloatingTopLevelDockWidget = FloatingWidget->topLevelDockWidget ();
989+ CDockWidget* TopLevelDockWidget = topLevelDockWidget ();
990+
991991 if (DockArea)
992992 {
993993 auto dropOverlay = d->DockManager ->dockAreaOverlay ();
@@ -1017,12 +1017,19 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi
10171017 }
10181018 }
10191019
1020- // If we drop a floating widget with only one single dock widget, then we
1021- // drop a top level widget that changes from floating to docked now
1020+ // If there was a top level widget before the drop, then it is not top
1021+ // level widget anymore
10221022 if (TopLevelDockWidget)
10231023 {
10241024 TopLevelDockWidget->emitTopLevelChanged (false );
10251025 }
1026+
1027+ // If we drop a floating widget with only one single dock widget, then we
1028+ // drop a top level widget that changes from floating to docked now
1029+ if (FloatingTopLevelDockWidget)
1030+ {
1031+ FloatingTopLevelDockWidget->emitTopLevelChanged (false );
1032+ }
10261033}
10271034
10281035
@@ -1052,7 +1059,7 @@ void CDockContainerWidget::saveState(QXmlStreamWriter& s) const
10521059 s.writeAttribute (" Floating" , QString::number (isFloating () ? 1 : 0 ));
10531060 if (isFloating ())
10541061 {
1055- CFloatingDockContainer* FloatingWidget = internal::findParent<CFloatingDockContainer*>( this );
1062+ CFloatingDockContainer* FloatingWidget = floatingWidget ( );
10561063 QByteArray Geometry = FloatingWidget->saveGeometry ();
10571064 s.writeTextElement (" Geometry" , Geometry.toHex (' ' ));
10581065 }
@@ -1091,7 +1098,7 @@ bool CDockContainerWidget::restoreState(QXmlStreamReader& s, bool Testing)
10911098
10921099 if (!Testing)
10931100 {
1094- CFloatingDockContainer* FloatingWidget = internal::findParent<CFloatingDockContainer*>( this );
1101+ CFloatingDockContainer* FloatingWidget = floatingWidget ( );
10951102 FloatingWidget->restoreGeometry (Geometry);
10961103 }
10971104 }
@@ -1118,6 +1125,40 @@ bool CDockContainerWidget::restoreState(QXmlStreamReader& s, bool Testing)
11181125 d->RootSplitter = dynamic_cast <QSplitter*>(NewRootSplitter);
11191126 OldRoot->deleteLater ();
11201127
1128+ // All dock widgets, that have not been processed in the restore state
1129+ // function are invisible to the user now and have no assigned dock area
1130+ // They do not belong to any dock container, until the user toggles the
1131+ // toggle view action the next time
1132+ for (auto DockWidget : dockWidgets ())
1133+ {
1134+ if (DockWidget->property (" dirty" ).toBool ())
1135+ {
1136+ DockWidget->flagAsUnassigned ();
1137+ }
1138+ else
1139+ {
1140+ DockWidget->toggleViewInternal (!DockWidget->property (" closed" ).toBool ());
1141+ }
1142+ }
1143+
1144+ // Finally we need to send the topLevelChanged() signals for all dock
1145+ // widgets if top level changed
1146+ CDockWidget* TopLevelDockWidget = topLevelDockWidget ();
1147+ if (TopLevelDockWidget)
1148+ {
1149+ TopLevelDockWidget->emitTopLevelChanged (true );
1150+ }
1151+ else
1152+ {
1153+ for (auto DockArea : d->DockAreas )
1154+ {
1155+ for (auto DockWidget : DockArea->dockWidgets ())
1156+ {
1157+ DockWidget->emitTopLevelChanged (false );
1158+ }
1159+ }
1160+ }
1161+
11211162 return true ;
11221163}
11231164
@@ -1150,6 +1191,11 @@ CDockAreaWidget* CDockContainerWidget::lastAddedDockAreaWidget(DockWidgetArea ar
11501191// ============================================================================
11511192bool CDockContainerWidget::hasTopLevelDockWidget () const
11521193{
1194+ if (!isFloating ())
1195+ {
1196+ return false ;
1197+ }
1198+
11531199 auto DockAreas = openedDockAreas ();
11541200 if (DockAreas.count () != 1 )
11551201 {
@@ -1163,19 +1209,38 @@ bool CDockContainerWidget::hasTopLevelDockWidget() const
11631209// ============================================================================
11641210CDockWidget* CDockContainerWidget::topLevelDockWidget () const
11651211{
1166- auto DockAreas = openedDockAreas ();
1167- if (DockAreas. count () != 1 )
1212+ auto TopLevelDockArea = topLevelDockArea ();
1213+ if (!TopLevelDockArea )
11681214 {
11691215 return nullptr ;
11701216 }
11711217
1172- auto DockWidgets = DockAreas[ 0 ] ->openedDockWidgets ();
1218+ auto DockWidgets = TopLevelDockArea ->openedDockWidgets ();
11731219 if (DockWidgets.count () != 1 )
11741220 {
11751221 return nullptr ;
11761222 }
11771223
11781224 return DockWidgets[0 ];
1225+
1226+ }
1227+
1228+
1229+ // ============================================================================
1230+ CDockAreaWidget* CDockContainerWidget::topLevelDockArea () const
1231+ {
1232+ if (!isFloating ())
1233+ {
1234+ return nullptr ;
1235+ }
1236+
1237+ auto DockAreas = openedDockAreas ();
1238+ if (DockAreas.count () != 1 )
1239+ {
1240+ return nullptr ;
1241+ }
1242+
1243+ return DockAreas[0 ];
11791244}
11801245
11811246
@@ -1204,6 +1269,14 @@ CDockWidget::DockWidgetFeatures CDockContainerWidget::features() const
12041269 return Features;
12051270}
12061271
1272+
1273+ // ============================================================================
1274+ CFloatingDockContainer* CDockContainerWidget::floatingWidget () const
1275+ {
1276+ return internal::findParent<CFloatingDockContainer*>(this );
1277+ }
1278+
1279+
12071280} // namespace ads
12081281
12091282#include " moc_DockContainerWidget.cpp"
0 commit comments