@@ -75,7 +75,7 @@ struct DockContainerWidgetPrivate
75
75
unsigned int zOrderIndex = 0 ;
76
76
QList<CDockAreaWidget*> DockAreas;
77
77
QGridLayout* Layout = nullptr ;
78
- CDockSplitter * RootSplitter;
78
+ QSplitter * RootSplitter;
79
79
bool isFloating = false ;
80
80
81
81
/* *
@@ -143,56 +143,44 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
143
143
auto InsertParam = internal::dockAreaInsertParameters (area);
144
144
auto NewDockAreas = FloatingWidget->dockContainer ()->findChildren <CDockAreaWidget*>(
145
145
QString (), Qt::FindChildrenRecursively);
146
- QSplitter* OldSplitter = nullptr ;
146
+ QSplitter* Splitter = RootSplitter ;
147
147
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 )
152
149
{
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;
170
158
}
171
159
172
160
// Now we can insert the floating widget content into this container
173
161
auto Widget = FloatingWidget->dockContainer ()->findChild <QWidget*>(QString (), Qt::FindDirectChildrenOnly);
174
162
auto FloatingSplitter = dynamic_cast <QSplitter*>(Widget);
175
163
if (DockAreas.isEmpty ())
176
164
{
177
- auto Widget = FloatingWidget->dockContainer ()->findChild <QWidget*>(QString (), Qt::FindDirectChildrenOnly);
178
- Layout->addWidget (Widget, 0 , 0 );
165
+ Splitter->addWidget (Widget);
179
166
}
180
- else if (! FloatingSplitter)
167
+ else if (FloatingSplitter-> count () == 1 )
181
168
{
182
- insertWidgetIntoSplitter (OldSplitter, Widget , InsertParam.append ());
169
+ insertWidgetIntoSplitter (Splitter, FloatingSplitter-> widget ( 0 ) , InsertParam.append ());
183
170
}
184
171
else if (FloatingSplitter->orientation () == InsertParam.orientation ())
185
172
{
186
173
while (FloatingSplitter->count ())
187
174
{
188
- insertWidgetIntoSplitter (OldSplitter , FloatingSplitter->widget (0 ), InsertParam.append ());
175
+ insertWidgetIntoSplitter (Splitter , FloatingSplitter->widget (0 ), InsertParam.append ());
189
176
}
190
177
}
191
178
else
192
179
{
193
- insertWidgetIntoSplitter (OldSplitter , FloatingSplitter, InsertParam.append ());
180
+ insertWidgetIntoSplitter (Splitter , FloatingSplitter, InsertParam.append ());
194
181
}
195
182
183
+ RootSplitter = Splitter;
196
184
addDockAreasToList (NewDockAreas);
197
185
FloatingWidget->deleteLater ();
198
186
}
@@ -236,7 +224,7 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
236
224
237
225
if (TargetAreaSplitter->orientation () == InsertParam.orientation ())
238
226
{
239
- if (! FloatingSplitter || FloatingSplitter ->orientation () != InsertParam.orientation ())
227
+ if (( FloatingSplitter->orientation () != InsertParam.orientation ()) && FloatingSplitter-> count () > 1 )
240
228
{
241
229
TargetAreaSplitter->insertWidget (AreaIndex + InsertParam.insertOffset (), Widget);
242
230
}
@@ -252,7 +240,7 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
252
240
else
253
241
{
254
242
QSplitter* NewSplitter = internal::newSplitter (InsertParam.orientation ());
255
- if (! FloatingSplitter || FloatingSplitter ->orientation () != InsertParam.orientation ())
243
+ if (( FloatingSplitter->orientation () != InsertParam.orientation ()) && FloatingSplitter-> count () > 1 )
256
244
{
257
245
NewSplitter->addWidget (Widget);
258
246
}
@@ -405,46 +393,36 @@ CDockAreaWidget* DockContainerWidgetPrivate::dockWidgetIntoContainer(DockWidgetA
405
393
void DockContainerWidgetPrivate::addDockArea (CDockAreaWidget* NewDockArea, DockWidgetArea area)
406
394
{
407
395
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 )
409
399
{
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 ());
414
401
}
415
- else if (DockAreas.count () == 1 )
402
+
403
+ QSplitter* Splitter = RootSplitter;
404
+ if (Splitter->orientation () == InsertParam.orientation ())
416
405
{
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);
421
406
insertWidgetIntoSplitter (Splitter, NewDockArea, InsertParam.append ());
422
407
}
423
408
else
424
409
{
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 ())
427
412
{
428
- insertWidgetIntoSplitter (Splitter, NewDockArea, InsertParam.append ());
413
+ QLayoutItem* li = Layout->replaceWidget (Splitter, NewSplitter);
414
+ NewSplitter->addWidget (Splitter);
415
+ NewSplitter->addWidget (NewDockArea);
416
+ delete li;
429
417
}
430
418
else
431
419
{
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;
447
424
}
425
+ RootSplitter = NewSplitter;
448
426
}
449
427
450
428
DockAreas.append (NewDockArea);
@@ -466,31 +444,21 @@ CDockAreaWidget* DockContainerWidgetPrivate::dockWidgetIntoDockArea(DockWidgetAr
466
444
CDockAreaWidget* NewDockArea = new CDockAreaWidget (DockManager, _this);
467
445
NewDockArea->addDockWidget (Dockwidget);
468
446
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 ())
470
451
{
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);
476
454
}
477
455
else
478
456
{
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);
494
462
}
495
463
496
464
DockAreas.append (NewDockArea);
@@ -517,6 +485,9 @@ CDockContainerWidget::CDockContainerWidget(CDockManager* DockManager, QWidget *p
517
485
d->Layout ->setContentsMargins (0 , 1 , 0 , 1 );
518
486
d->Layout ->setSpacing (0 );
519
487
setLayout (d->Layout );
488
+
489
+ d->RootSplitter = internal::newSplitter (Qt::Horizontal);
490
+ d->Layout ->addWidget (d->RootSplitter );
520
491
}
521
492
522
493
// ============================================================================
@@ -604,7 +575,7 @@ void CDockContainerWidget::removeDockArea(CDockAreaWidget* area)
604
575
d->DockAreas .removeAll (area);
605
576
QSplitter* Splitter = internal::findParent<QSplitter*>(area);
606
577
area->setParent (0 );
607
- if (!( Splitter && Splitter->count () == 1 ) )
578
+ if (Splitter == d-> RootSplitter || Splitter->count () != 1 )
608
579
{
609
580
emit dockAreasRemoved ();
610
581
return ;
@@ -616,14 +587,7 @@ void CDockContainerWidget::removeDockArea(CDockAreaWidget* area)
616
587
QWidget* widget = Splitter->widget (0 );
617
588
widget->setParent (this );
618
589
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);
627
591
delete Splitter;
628
592
emit dockAreasRemoved ();
629
593
}
0 commit comments