4444#include " DockWidget.h"
4545#include " FloatingDockContainer.h"
4646#include " DockOverlay.h"
47- #include " DockStateSerialization.h"
4847#include " ads_globals.h"
4948#include " DockSplitter.h"
5049
@@ -101,7 +100,7 @@ class DockContainerWidgetPrivate
101100 unsigned int zOrderIndex = 0 ;
102101 QList<CDockAreaWidget*> DockAreas;
103102 QGridLayout* Layout = nullptr ;
104- QSplitter* RootSplitter;
103+ QSplitter* RootSplitter = nullptr ;
105104 bool isFloating = false ;
106105 CDockAreaWidget* LastAddedAreaCache[5 ]{0 , 0 , 0 , 0 , 0 };
107106 int VisibleDockAreaCount = -1 ;
@@ -233,6 +232,18 @@ class DockContainerWidgetPrivate
233232 emit _this->dockAreasAdded ();
234233 }
235234
235+ /* *
236+ * Helper function for creation of new splitter
237+ */
238+ CDockSplitter* newSplitter (Qt::Orientation orientation, QWidget* parent = 0 )
239+ {
240+ CDockSplitter* s = new CDockSplitter (orientation, parent);
241+ s->setOpaqueResize (DockManager->configFlags ().testFlag (CDockManager::OpaqueSplitterResize));
242+ s->setChildrenCollapsible (false );
243+ return s;
244+ }
245+
246+
236247// private slots: ------------------------------------------------------------
237248 void onDockAreaViewToggled (bool Visible)
238249 {
@@ -290,7 +301,7 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
290301 }
291302 else if (Splitter->orientation () != InsertParam.orientation ())
292303 {
293- QSplitter* NewSplitter = internal:: newSplitter (InsertParam.orientation ());
304+ QSplitter* NewSplitter = newSplitter (InsertParam.orientation ());
294305 QLayoutItem* li = Layout->replaceWidget (Splitter, NewSplitter);
295306 NewSplitter->addWidget (Splitter);
296307 Splitter = NewSplitter;
@@ -337,14 +348,35 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
337348 CDockAreaWidget* TargetArea, DockWidgetArea area)
338349{
339350 CDockContainerWidget* FloatingContainer = FloatingWidget->dockContainer ();
340- if (area == CenterDockWidgetArea)
351+ // Dropping into center means all dock widgets in the dropped floating
352+ // widget will become tabs of the drop area
353+ if (CenterDockWidgetArea == area)
341354 {
342355 auto NewDockWidgets = FloatingContainer->dockWidgets ();
356+ auto TopLevelDockArea = FloatingContainer->topLevelDockArea ();
357+ int NewCurrentIndex = -1 ;
358+
359+ // If the floating widget contains only one single dock are, then the
360+ // current dock widget of the dock area will also be the future current
361+ // dock widget in the drop area.
362+ if (TopLevelDockArea)
363+ {
364+ NewCurrentIndex = TopLevelDockArea->currentIndex ();
365+ }
366+
343367 for (int i = 0 ; i < NewDockWidgets.count (); ++i)
344368 {
345- TargetArea->insertDockWidget (i, NewDockWidgets[i], false );
369+ CDockWidget* DockWidget = NewDockWidgets[i];
370+ TargetArea->insertDockWidget (i, DockWidget, false );
371+ // If the floating widget contains multiple visible dock areas, then we
372+ // simply pick the first visible open dock widget and make it
373+ // the current one.
374+ if (NewCurrentIndex < 0 && !DockWidget->isClosed ())
375+ {
376+ NewCurrentIndex = i;
377+ }
346378 }
347- TargetArea->setCurrentIndex (0 ); // make the topmost widget active
379+ TargetArea->setCurrentIndex (NewCurrentIndex);
348380 FloatingWidget->deleteLater ();
349381 TargetArea->updateTitleBarVisibility ();
350382 return ;
@@ -357,7 +389,7 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
357389
358390 if (!TargetAreaSplitter)
359391 {
360- QSplitter* Splitter = internal:: newSplitter (InsertParam.orientation ());
392+ QSplitter* Splitter = newSplitter (InsertParam.orientation ());
361393 Layout->replaceWidget (TargetArea, Splitter);
362394 Splitter->addWidget (TargetArea);
363395 TargetAreaSplitter = Splitter;
@@ -383,7 +415,7 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
383415 }
384416 else
385417 {
386- QSplitter* NewSplitter = internal:: newSplitter (InsertParam.orientation ());
418+ QSplitter* NewSplitter = newSplitter (InsertParam.orientation ());
387419 if ((FloatingSplitter->orientation () != InsertParam.orientation ()) && FloatingSplitter->count () > 1 )
388420 {
389421 NewSplitter->addWidget (Widget);
@@ -455,7 +487,7 @@ void DockContainerWidgetPrivate::saveChildNodesState(QXmlStreamWriter& s, QWidge
455487 if (Splitter)
456488 {
457489 s.writeStartElement (" Splitter" );
458- s.writeAttribute (" Orientation" , QString::number (Splitter->orientation ()) );
490+ s.writeAttribute (" Orientation" , (Splitter->orientation () == Qt::Horizontal) ? " - " : " | " );
459491 s.writeAttribute (" Count" , QString::number (Splitter->count ()));
460492 qDebug () << " NodeSplitter orient: " << Splitter->orientation ()
461493 << " WidgetCont: " << Splitter->count ();
@@ -488,8 +520,17 @@ bool DockContainerWidgetPrivate::restoreSplitter(QXmlStreamReader& s,
488520 QWidget*& CreatedWidget, bool Testing)
489521{
490522 bool Ok;
491- int Orientation = s.attributes ().value (" Orientation" ).toInt (&Ok);
492- if (!Ok)
523+ QString OrientationStr = s.attributes ().value (" Orientation" ).toString ();
524+ int Orientation;
525+ if (OrientationStr.startsWith (" -" ))
526+ {
527+ Orientation = Qt::Horizontal;
528+ }
529+ else if (OrientationStr.startsWith (" |" ))
530+ {
531+ Orientation = Qt::Vertical;
532+ }
533+ else
493534 {
494535 return false ;
495536 }
@@ -504,7 +545,7 @@ bool DockContainerWidgetPrivate::restoreSplitter(QXmlStreamReader& s,
504545 QSplitter* Splitter = nullptr ;
505546 if (!Testing)
506547 {
507- Splitter = internal:: newSplitter ((Qt::Orientation)Orientation);
548+ Splitter = newSplitter ((Qt::Orientation)Orientation);
508549 }
509550 bool Visible = false ;
510551 QList<int > Sizes;
@@ -516,7 +557,7 @@ bool DockContainerWidgetPrivate::restoreSplitter(QXmlStreamReader& s,
516557 {
517558 Result = restoreSplitter (s, ChildNode, Testing);
518559 }
519- else if (s.name () == " DockAreaWidget " )
560+ else if (s.name () == " Area " )
520561 {
521562 Result = restoreDockArea (s, ChildNode, Testing);
522563 }
@@ -593,8 +634,8 @@ bool DockContainerWidgetPrivate::restoreDockArea(QXmlStreamReader& s,
593634 }
594635
595636
596- QString CurrentDockWidget = s.attributes ().value (" CurrentDockWidget " ).toString ();
597- qDebug () << " Restore NodeDockArea Tabs: " << Tabs << " CurrentDockWidget : "
637+ QString CurrentDockWidget = s.attributes ().value (" Current " ).toString ();
638+ qDebug () << " Restore NodeDockArea Tabs: " << Tabs << " Current : "
598639 << CurrentDockWidget;
599640
600641 CDockAreaWidget* DockArea = nullptr ;
@@ -605,12 +646,12 @@ bool DockContainerWidgetPrivate::restoreDockArea(QXmlStreamReader& s,
605646
606647 while (s.readNextStartElement ())
607648 {
608- if (s.name () != " DockWidget " )
649+ if (s.name () != " Widget " )
609650 {
610651 continue ;
611652 }
612653
613- auto ObjectName = s.attributes ().value (" ObjectName " );
654+ auto ObjectName = s.attributes ().value (" Name " );
614655 if (ObjectName.isEmpty ())
615656 {
616657 return false ;
@@ -673,7 +714,7 @@ bool DockContainerWidgetPrivate::restoreChildNodes(QXmlStreamReader& s,
673714 Result = restoreSplitter (s, CreatedWidget, Testing);
674715 qDebug () << " Splitter" ;
675716 }
676- else if (s.name () == " DockAreaWidget " )
717+ else if (s.name () == " Area " )
677718 {
678719 Result = restoreDockArea (s, CreatedWidget, Testing);
679720 qDebug () << " DockAreaWidget" ;
@@ -720,7 +761,7 @@ void DockContainerWidgetPrivate::addDockArea(CDockAreaWidget* NewDockArea, DockW
720761 }
721762 else
722763 {
723- QSplitter* NewSplitter = internal:: newSplitter (InsertParam.orientation ());
764+ QSplitter* NewSplitter = newSplitter (InsertParam.orientation ());
724765 if (InsertParam.append ())
725766 {
726767 QLayoutItem* li = Layout->replaceWidget (Splitter, NewSplitter);
@@ -820,7 +861,7 @@ CDockAreaWidget* DockContainerWidgetPrivate::dockWidgetIntoDockArea(DockWidgetAr
820861 else
821862 {
822863 qDebug () << " TargetAreaSplitter->orientation() != InsertParam.orientation()" ;
823- QSplitter* NewSplitter = internal:: newSplitter (InsertParam.orientation ());
864+ QSplitter* NewSplitter = newSplitter (InsertParam.orientation ());
824865 NewSplitter->addWidget (TargetDockArea);
825866 insertWidgetIntoSplitter (NewSplitter, NewDockArea, InsertParam.append ());
826867 TargetAreaSplitter->insertWidget (index, NewSplitter);
@@ -837,20 +878,24 @@ CDockContainerWidget::CDockContainerWidget(CDockManager* DockManager, QWidget *p
837878 QFrame (parent),
838879 d (new DockContainerWidgetPrivate(this ))
839880{
840- d->isFloating = floatingWidget () != nullptr ;
841881 d->DockManager = DockManager;
842- if (DockManager != this )
843- {
844- d->DockManager ->registerDockContainer (this );
845- }
882+ d->isFloating = floatingWidget () != nullptr ;
846883
847884 d->Layout = new QGridLayout ();
848885 d->Layout ->setContentsMargins (0 , 1 , 0 , 1 );
849886 d->Layout ->setSpacing (0 );
850887 setLayout (d->Layout );
851888
852- d->RootSplitter = internal::newSplitter (Qt::Horizontal);
853- d->Layout ->addWidget (d->RootSplitter );
889+ // The function d->newSplitter() accesses the config flags from dock
890+ // manager which in turn requires a properly constructed dock manager.
891+ // If this dock container is the dock manager, then it is not properly
892+ // constructed yet because this base class constructor is called before
893+ // the constructor of the DockManager private class
894+ if (DockManager != this )
895+ {
896+ d->DockManager ->registerDockContainer (this );
897+ createRootSplitter ();
898+ }
854899}
855900
856901// ============================================================================
@@ -1131,7 +1176,7 @@ void CDockContainerWidget::saveState(QXmlStreamWriter& s) const
11311176 qDebug () << " CDockContainerWidget::saveState isFloating "
11321177 << isFloating ();
11331178
1134- s.writeStartElement (" DockContainerWidget " );
1179+ s.writeStartElement (" Container " );
11351180 s.writeAttribute (" Floating" , QString::number (isFloating () ? 1 : 0 ));
11361181 if (isFloating ())
11371182 {
@@ -1193,7 +1238,7 @@ bool CDockContainerWidget::restoreState(QXmlStreamReader& s, bool Testing)
11931238 // and we need to create a new empty root splitter
11941239 if (!NewRootSplitter)
11951240 {
1196- NewRootSplitter = internal:: newSplitter (Qt::Horizontal);
1241+ NewRootSplitter = d-> newSplitter (Qt::Horizontal);
11971242 }
11981243
11991244 d->Layout ->replaceWidget (d->RootSplitter , NewRootSplitter);
@@ -1212,6 +1257,18 @@ QSplitter* CDockContainerWidget::rootSplitter() const
12121257}
12131258
12141259
1260+ // ============================================================================
1261+ void CDockContainerWidget::createRootSplitter ()
1262+ {
1263+ if (d->RootSplitter )
1264+ {
1265+ return ;
1266+ }
1267+ d->RootSplitter = d->newSplitter (Qt::Horizontal);
1268+ d->Layout ->addWidget (d->RootSplitter );
1269+ }
1270+
1271+
12151272// ============================================================================
12161273void CDockContainerWidget::dumpLayout ()
12171274{
0 commit comments