@@ -169,6 +169,7 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
169169 auto InsertParam = internal::dockAreaInsertParameters (area);
170170 auto NewDockAreas = FloatingWidget->dockContainer ()->findChildren <CDockAreaWidget*>(
171171 QString (), Qt::FindChildrenRecursively);
172+ CDockWidget* DockWidget = FloatingWidget->dockContainer ()->findChild <CDockWidget*>();
172173 QSplitter* Splitter = RootSplitter;
173174
174175 if (DockAreas.count () <= 1 )
@@ -205,6 +206,10 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
205206 RootSplitter = Splitter;
206207 addDockAreasToList (NewDockAreas);
207208 FloatingWidget->deleteLater ();
209+ if (DockWidget)
210+ {
211+ DockWidget->toggleView (true );
212+ }
208213 _this->dumpLayout ();
209214}
210215
@@ -541,8 +546,11 @@ void DockContainerWidgetPrivate::dumpRecursive(int level, QWidget* widget)
541546 buf.fill (' ' , level * 4 );
542547 if (Splitter)
543548 {
544- qDebug (" %sSplitter %s" , (const char *)buf, (Splitter->orientation () == Qt::Vertical)
545- ? " -" : " |" );
549+ qDebug (" %sSplitter %s v: %s c: %s" ,
550+ (const char *)buf,
551+ (Splitter->orientation () == Qt::Vertical) ? " -" : " |" ,
552+ Splitter->isVisibleTo (Splitter->parentWidget ()) ? " 1" : " 0" ,
553+ QString::number (Splitter->count ()).toStdString ().c_str ());
546554 for (int i = 0 ; i < Splitter->count (); ++i)
547555 {
548556 dumpRecursive (level + 1 , Splitter->widget (i));
@@ -706,22 +714,59 @@ void CDockContainerWidget::removeDockArea(CDockAreaWidget* area)
706714{
707715 qDebug () << " CDockContainerWidget::removeDockArea" ;
708716 d->DockAreas .removeAll (area);
709- QSplitter* Splitter = internal::findParent<QSplitter*>(area);
717+ CDockSplitter* Splitter = internal::findParent<CDockSplitter*>(area);
718+
719+ // Remove are from parent splitter and hide splitter if it has no visible
720+ // content
710721 area->setParent (0 );
711- if (Splitter == d->RootSplitter || Splitter->count () != 1 )
722+ Splitter->setVisible (Splitter->hasVisibleContent ());
723+
724+ // If splitter has more than 1 widgets, we are finished and can leave
725+ if (Splitter->count () > 1 )
712726 {
713- emit dockAreasRemoved ();
714- return ;
727+ goto emitAndExit;
728+ }
729+
730+ // If this is the RootSplitter we need to remove empty splitters to
731+ // avoid too many empty splitters
732+ if (Splitter == d->RootSplitter )
733+ {
734+ qDebug () << " Removed from RootSplitter" ;
735+ // If splitter is empty, we are finished
736+ if (!Splitter->count ())
737+ {
738+ Splitter->hide ();
739+ goto emitAndExit;
740+ }
741+
742+ QWidget* widget = Splitter->widget (0 );
743+ QSplitter* ChildSplitter = dynamic_cast <QSplitter*>(widget);
744+ // If the one and only content widget of the splitter is not a splitter
745+ // then we are finished
746+ if (!ChildSplitter)
747+ {
748+ goto emitAndExit;
749+ }
750+
751+ // We replace the superfluous RootSplitter with the ChildSplitter
752+ ChildSplitter->setParent (0 );
753+ QLayoutItem* li = d->Layout ->replaceWidget (Splitter, ChildSplitter);
754+ d->RootSplitter = ChildSplitter;
755+ delete li;
756+ qDebug () << " RootSplitter replaced by child splitter" ;
757+ }
758+ else if (Splitter->count () == 1 )
759+ {
760+ qDebug () << " Replacing splitter with content" ;
761+ QWidget* widget = Splitter->widget (0 );
762+ widget->setParent (this );
763+ QSplitter* ParentSplitter = internal::findParent<QSplitter*>(Splitter);
764+ internal::replaceSplitterWidget (ParentSplitter, Splitter, widget);
715765 }
716766
717- // It the splitter contains only one single widget, then we do not need
718- // it anymore and can replace it with its content
719- qDebug () << " Replacing splitter with content" ;
720- QWidget* widget = Splitter->widget (0 );
721- widget->setParent (this );
722- QSplitter* ParentSplitter = internal::findParent<QSplitter*>(Splitter);
723- internal::replaceSplitterWidget (ParentSplitter, Splitter, widget);
724767 delete Splitter;
768+
769+ emitAndExit:
725770 dumpLayout ();
726771 emit dockAreasRemoved ();
727772}
@@ -732,7 +777,7 @@ CDockAreaWidget* CDockContainerWidget::dockAreaAt(const QPoint& GlobalPos) const
732777{
733778 for (const auto & DockArea : d->DockAreas )
734779 {
735- if (DockArea->rect ().contains (DockArea->mapFromGlobal (GlobalPos)))
780+ if (DockArea->isVisible () && DockArea-> rect ().contains (DockArea->mapFromGlobal (GlobalPos)))
736781 {
737782 return DockArea;
738783 }
@@ -791,7 +836,8 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi
791836 auto dropOverlay = d->DockManager ->dockAreaOverlay ();
792837 dropOverlay->setAllowedAreas (AllDockAreas);
793838 dropArea = dropOverlay->showOverlay (DockArea);
794- if ((ContainerDropArea != InvalidDockWidgetArea) && (dropArea == CenterDockWidgetArea))
839+ if (ContainerDropArea != InvalidDockWidgetArea &&
840+ ContainerDropArea != dropArea)
795841 {
796842 dropArea = InvalidDockWidgetArea;
797843 }
@@ -918,7 +964,9 @@ QSplitter* CDockContainerWidget::rootSplitter() const
918964// ============================================================================
919965void CDockContainerWidget::dumpLayout ()
920966{
967+ qDebug (" \n\n Dumping layout --------------------------" );
921968 d->dumpRecursive (0 , d->RootSplitter );
969+ qDebug (" --------------------------\n\n " );
922970}
923971
924972
0 commit comments