@@ -75,7 +75,7 @@ struct DockContainerWidgetPrivate
7575 unsigned int zOrderIndex = 0 ;
7676 QList<CDockAreaWidget*> DockAreas;
7777 QGridLayout* Layout = nullptr ;
78- CDockSplitter * RootSplitter;
78+ QSplitter * RootSplitter;
7979 bool isFloating = false ;
8080
8181 /* *
@@ -143,56 +143,44 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
143143 auto InsertParam = internal::dockAreaInsertParameters (area);
144144 auto NewDockAreas = FloatingWidget->dockContainer ()->findChildren <CDockAreaWidget*>(
145145 QString (), Qt::FindChildrenRecursively);
146- QSplitter* OldSplitter = nullptr ;
146+ QSplitter* Splitter = RootSplitter ;
147147
148- // If the container already contains dock areas, then we need to ensure that
149- // we have a splitter with an orientation that matches the orientation of
150- // the current drop action
151- if (!DockAreas.isEmpty ())
148+ if (DockAreas.count () <= 1 )
152149 {
153- OldSplitter = _this->findChild <QSplitter*>(QString (), Qt::FindDirectChildrenOnly);
154- // First replace the dock widget with a splitter
155- if (DockAreas.count () == 1 )
156- {
157- auto DockArea = dynamic_cast <CDockAreaWidget*>(Layout->itemAtPosition (0 , 0 )->widget ());
158- QSplitter* NewSplitter = internal::newSplitter (InsertParam.orientation ());
159- Layout->replaceWidget (DockArea, NewSplitter);
160- NewSplitter->addWidget (DockArea);
161- OldSplitter = NewSplitter;
162- }
163- else if (OldSplitter->orientation () != InsertParam.orientation ())
164- {
165- QSplitter* NewSplitter = internal::newSplitter (InsertParam.orientation ());
166- QLayoutItem* li = Layout->replaceWidget (OldSplitter, NewSplitter);
167- NewSplitter->addWidget (OldSplitter);
168- OldSplitter = NewSplitter;
169- }
150+ Splitter->setOrientation (InsertParam.orientation ());
151+ }
152+ else
153+ {
154+ QSplitter* NewSplitter = internal::newSplitter (InsertParam.orientation ());
155+ QLayoutItem* li = Layout->replaceWidget (Splitter, NewSplitter);
156+ NewSplitter->addWidget (Splitter);
157+ Splitter = NewSplitter;
170158 }
171159
172160 // Now we can insert the floating widget content into this container
173161 auto Widget = FloatingWidget->dockContainer ()->findChild <QWidget*>(QString (), Qt::FindDirectChildrenOnly);
174162 auto FloatingSplitter = dynamic_cast <QSplitter*>(Widget);
175163 if (DockAreas.isEmpty ())
176164 {
177- auto Widget = FloatingWidget->dockContainer ()->findChild <QWidget*>(QString (), Qt::FindDirectChildrenOnly);
178- Layout->addWidget (Widget, 0 , 0 );
165+ Splitter->addWidget (Widget);
179166 }
180- else if (! FloatingSplitter)
167+ else if (FloatingSplitter-> count () == 1 )
181168 {
182- insertWidgetIntoSplitter (OldSplitter, Widget , InsertParam.append ());
169+ insertWidgetIntoSplitter (Splitter, FloatingSplitter-> widget ( 0 ) , InsertParam.append ());
183170 }
184171 else if (FloatingSplitter->orientation () == InsertParam.orientation ())
185172 {
186173 while (FloatingSplitter->count ())
187174 {
188- insertWidgetIntoSplitter (OldSplitter , FloatingSplitter->widget (0 ), InsertParam.append ());
175+ insertWidgetIntoSplitter (Splitter , FloatingSplitter->widget (0 ), InsertParam.append ());
189176 }
190177 }
191178 else
192179 {
193- insertWidgetIntoSplitter (OldSplitter , FloatingSplitter, InsertParam.append ());
180+ insertWidgetIntoSplitter (Splitter , FloatingSplitter, InsertParam.append ());
194181 }
195182
183+ RootSplitter = Splitter;
196184 addDockAreasToList (NewDockAreas);
197185 FloatingWidget->deleteLater ();
198186}
@@ -236,7 +224,7 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
236224
237225 if (TargetAreaSplitter->orientation () == InsertParam.orientation ())
238226 {
239- if (! FloatingSplitter || FloatingSplitter ->orientation () != InsertParam.orientation ())
227+ if (( FloatingSplitter->orientation () != InsertParam.orientation ()) && FloatingSplitter-> count () > 1 )
240228 {
241229 TargetAreaSplitter->insertWidget (AreaIndex + InsertParam.insertOffset (), Widget);
242230 }
@@ -252,7 +240,7 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
252240 else
253241 {
254242 QSplitter* NewSplitter = internal::newSplitter (InsertParam.orientation ());
255- if (! FloatingSplitter || FloatingSplitter ->orientation () != InsertParam.orientation ())
243+ if (( FloatingSplitter->orientation () != InsertParam.orientation ()) && FloatingSplitter-> count () > 1 )
256244 {
257245 NewSplitter->addWidget (Widget);
258246 }
@@ -405,46 +393,36 @@ CDockAreaWidget* DockContainerWidgetPrivate::dockWidgetIntoContainer(DockWidgetA
405393void DockContainerWidgetPrivate::addDockArea (CDockAreaWidget* NewDockArea, DockWidgetArea area)
406394{
407395 auto InsertParam = internal::dockAreaInsertParameters (area);
408- if (DockAreas.isEmpty ())
396+ // As long as we have only one dock area in the splitter we can adjust
397+ // its orientation
398+ if (DockAreas.count () <= 1 )
409399 {
410- QSplitter* Splitter = internal::newSplitter (Qt::Horizontal);
411- Splitter->addWidget (NewDockArea);
412- insertWidgetIntoSplitter (Splitter, NewDockArea, InsertParam.append ());
413- _this->layout ()->addWidget (Splitter);
400+ RootSplitter->setOrientation (InsertParam.orientation ());
414401 }
415- else if (DockAreas.count () == 1 )
402+
403+ QSplitter* Splitter = RootSplitter;
404+ if (Splitter->orientation () == InsertParam.orientation ())
416405 {
417- QSplitter* Splitter = internal::newSplitter (InsertParam.orientation ());
418- auto DockArea = dynamic_cast <CDockAreaWidget*>(Layout->itemAtPosition (0 , 0 )->widget ());
419- Layout->replaceWidget (DockArea, Splitter);
420- Splitter->addWidget (DockArea);
421406 insertWidgetIntoSplitter (Splitter, NewDockArea, InsertParam.append ());
422407 }
423408 else
424409 {
425- QSplitter* Splitter = _this-> findChild <QSplitter*>( QString (), Qt::FindDirectChildrenOnly );
426- if (Splitter-> orientation () == InsertParam.orientation ())
410+ QSplitter* NewSplitter = internal::newSplitter (InsertParam. orientation () );
411+ if (InsertParam.append ())
427412 {
428- insertWidgetIntoSplitter (Splitter, NewDockArea, InsertParam.append ());
413+ QLayoutItem* li = Layout->replaceWidget (Splitter, NewSplitter);
414+ NewSplitter->addWidget (Splitter);
415+ NewSplitter->addWidget (NewDockArea);
416+ delete li;
429417 }
430418 else
431419 {
432- QSplitter* NewSplitter = internal::newSplitter (InsertParam.orientation ());
433- if (InsertParam.append ())
434- {
435- QLayoutItem* li = Layout->replaceWidget (Splitter, NewSplitter);
436- NewSplitter->addWidget (Splitter);
437- NewSplitter->addWidget (NewDockArea);
438- delete li;
439- }
440- else
441- {
442- NewSplitter->addWidget (NewDockArea);
443- QLayoutItem* li = Layout->replaceWidget (Splitter, NewSplitter);
444- NewSplitter->addWidget (Splitter);
445- delete li;
446- }
420+ NewSplitter->addWidget (NewDockArea);
421+ QLayoutItem* li = Layout->replaceWidget (Splitter, NewSplitter);
422+ NewSplitter->addWidget (Splitter);
423+ delete li;
447424 }
425+ RootSplitter = NewSplitter;
448426 }
449427
450428 DockAreas.append (NewDockArea);
@@ -466,31 +444,21 @@ CDockAreaWidget* DockContainerWidgetPrivate::dockWidgetIntoDockArea(DockWidgetAr
466444 CDockAreaWidget* NewDockArea = new CDockAreaWidget (DockManager, _this);
467445 NewDockArea->addDockWidget (Dockwidget);
468446 auto InsertParam = internal::dockAreaInsertParameters (area);
469- if (DockAreas.count () == 1 )
447+
448+ QSplitter* TargetAreaSplitter = internal::findParent<QSplitter*>(TargetDockArea);
449+ int index = TargetAreaSplitter ->indexOf (TargetDockArea);
450+ if (TargetAreaSplitter->orientation () == InsertParam.orientation ())
470451 {
471- QSplitter* Splitter = internal::newSplitter (InsertParam.orientation ());
472- auto DockArea = dynamic_cast <CDockAreaWidget*>(Layout->itemAtPosition (0 , 0 )->widget ());
473- Layout->replaceWidget (DockArea, Splitter);
474- Splitter->addWidget (DockArea);
475- insertWidgetIntoSplitter (Splitter, NewDockArea, InsertParam.append ());
452+ std::cout << " TargetAreaSplitter->orientation() == InsertParam.orientation()" << std::endl;
453+ TargetAreaSplitter->insertWidget (index + InsertParam.insertOffset (), NewDockArea);
476454 }
477455 else
478456 {
479- QSplitter* TargetAreaSplitter = internal::findParent<QSplitter*>(TargetDockArea);
480- int index = TargetAreaSplitter ->indexOf (TargetDockArea);
481- if (TargetAreaSplitter->orientation () == InsertParam.orientation ())
482- {
483- std::cout << " TargetAreaSplitter->orientation() == InsertParam.orientation()" << std::endl;
484- TargetAreaSplitter->insertWidget (index + InsertParam.insertOffset (), NewDockArea);
485- }
486- else
487- {
488- std::cout << " TargetAreaSplitter->orientation() != InsertParam.orientation()" << std::endl;
489- QSplitter* NewSplitter = internal::newSplitter (InsertParam.orientation ());
490- NewSplitter->addWidget (TargetDockArea);
491- insertWidgetIntoSplitter (NewSplitter, NewDockArea, InsertParam.append ());
492- TargetAreaSplitter->insertWidget (index, NewSplitter);
493- }
457+ std::cout << " TargetAreaSplitter->orientation() != InsertParam.orientation()" << std::endl;
458+ QSplitter* NewSplitter = internal::newSplitter (InsertParam.orientation ());
459+ NewSplitter->addWidget (TargetDockArea);
460+ insertWidgetIntoSplitter (NewSplitter, NewDockArea, InsertParam.append ());
461+ TargetAreaSplitter->insertWidget (index, NewSplitter);
494462 }
495463
496464 DockAreas.append (NewDockArea);
@@ -517,6 +485,9 @@ CDockContainerWidget::CDockContainerWidget(CDockManager* DockManager, QWidget *p
517485 d->Layout ->setContentsMargins (0 , 1 , 0 , 1 );
518486 d->Layout ->setSpacing (0 );
519487 setLayout (d->Layout );
488+
489+ d->RootSplitter = internal::newSplitter (Qt::Horizontal);
490+ d->Layout ->addWidget (d->RootSplitter );
520491}
521492
522493// ============================================================================
@@ -604,7 +575,7 @@ void CDockContainerWidget::removeDockArea(CDockAreaWidget* area)
604575 d->DockAreas .removeAll (area);
605576 QSplitter* Splitter = internal::findParent<QSplitter*>(area);
606577 area->setParent (0 );
607- if (!( Splitter && Splitter->count () == 1 ) )
578+ if (Splitter == d-> RootSplitter || Splitter->count () != 1 )
608579 {
609580 emit dockAreasRemoved ();
610581 return ;
@@ -616,14 +587,7 @@ void CDockContainerWidget::removeDockArea(CDockAreaWidget* area)
616587 QWidget* widget = Splitter->widget (0 );
617588 widget->setParent (this );
618589 QSplitter* ParentSplitter = internal::findParent<QSplitter*>(Splitter);
619- if (ParentSplitter)
620- {
621- internal::replaceSplitterWidget (ParentSplitter, Splitter, widget);
622- }
623- else
624- {
625- d->Layout ->replaceWidget (Splitter, widget);
626- }
590+ internal::replaceSplitterWidget (ParentSplitter, Splitter, widget);
627591 delete Splitter;
628592 emit dockAreasRemoved ();
629593}
0 commit comments