44
44
#include " DockWidget.h"
45
45
#include " FloatingDockContainer.h"
46
46
#include " DockOverlay.h"
47
- #include " DockStateSerialization.h"
48
47
#include " ads_globals.h"
49
48
#include " DockSplitter.h"
50
49
@@ -101,7 +100,7 @@ class DockContainerWidgetPrivate
101
100
unsigned int zOrderIndex = 0 ;
102
101
QList<CDockAreaWidget*> DockAreas;
103
102
QGridLayout* Layout = nullptr ;
104
- QSplitter* RootSplitter;
103
+ QSplitter* RootSplitter = nullptr ;
105
104
bool isFloating = false ;
106
105
CDockAreaWidget* LastAddedAreaCache[5 ]{0 , 0 , 0 , 0 , 0 };
107
106
int VisibleDockAreaCount = -1 ;
@@ -233,6 +232,18 @@ class DockContainerWidgetPrivate
233
232
emit _this->dockAreasAdded ();
234
233
}
235
234
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
+
236
247
// private slots: ------------------------------------------------------------
237
248
void onDockAreaViewToggled (bool Visible)
238
249
{
@@ -290,7 +301,7 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
290
301
}
291
302
else if (Splitter->orientation () != InsertParam.orientation ())
292
303
{
293
- QSplitter* NewSplitter = internal:: newSplitter (InsertParam.orientation ());
304
+ QSplitter* NewSplitter = newSplitter (InsertParam.orientation ());
294
305
QLayoutItem* li = Layout->replaceWidget (Splitter, NewSplitter);
295
306
NewSplitter->addWidget (Splitter);
296
307
Splitter = NewSplitter;
@@ -337,14 +348,35 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
337
348
CDockAreaWidget* TargetArea, DockWidgetArea area)
338
349
{
339
350
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)
341
354
{
342
355
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
+
343
367
for (int i = 0 ; i < NewDockWidgets.count (); ++i)
344
368
{
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
+ }
346
378
}
347
- TargetArea->setCurrentIndex (0 ); // make the topmost widget active
379
+ TargetArea->setCurrentIndex (NewCurrentIndex);
348
380
FloatingWidget->deleteLater ();
349
381
TargetArea->updateTitleBarVisibility ();
350
382
return ;
@@ -357,7 +389,7 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
357
389
358
390
if (!TargetAreaSplitter)
359
391
{
360
- QSplitter* Splitter = internal:: newSplitter (InsertParam.orientation ());
392
+ QSplitter* Splitter = newSplitter (InsertParam.orientation ());
361
393
Layout->replaceWidget (TargetArea, Splitter);
362
394
Splitter->addWidget (TargetArea);
363
395
TargetAreaSplitter = Splitter;
@@ -383,7 +415,7 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
383
415
}
384
416
else
385
417
{
386
- QSplitter* NewSplitter = internal:: newSplitter (InsertParam.orientation ());
418
+ QSplitter* NewSplitter = newSplitter (InsertParam.orientation ());
387
419
if ((FloatingSplitter->orientation () != InsertParam.orientation ()) && FloatingSplitter->count () > 1 )
388
420
{
389
421
NewSplitter->addWidget (Widget);
@@ -455,7 +487,7 @@ void DockContainerWidgetPrivate::saveChildNodesState(QXmlStreamWriter& s, QWidge
455
487
if (Splitter)
456
488
{
457
489
s.writeStartElement (" Splitter" );
458
- s.writeAttribute (" Orientation" , QString::number (Splitter->orientation ()) );
490
+ s.writeAttribute (" Orientation" , (Splitter->orientation () == Qt::Horizontal) ? " - " : " | " );
459
491
s.writeAttribute (" Count" , QString::number (Splitter->count ()));
460
492
qDebug () << " NodeSplitter orient: " << Splitter->orientation ()
461
493
<< " WidgetCont: " << Splitter->count ();
@@ -488,8 +520,17 @@ bool DockContainerWidgetPrivate::restoreSplitter(QXmlStreamReader& s,
488
520
QWidget*& CreatedWidget, bool Testing)
489
521
{
490
522
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
493
534
{
494
535
return false ;
495
536
}
@@ -504,7 +545,7 @@ bool DockContainerWidgetPrivate::restoreSplitter(QXmlStreamReader& s,
504
545
QSplitter* Splitter = nullptr ;
505
546
if (!Testing)
506
547
{
507
- Splitter = internal:: newSplitter ((Qt::Orientation)Orientation);
548
+ Splitter = newSplitter ((Qt::Orientation)Orientation);
508
549
}
509
550
bool Visible = false ;
510
551
QList<int > Sizes;
@@ -516,7 +557,7 @@ bool DockContainerWidgetPrivate::restoreSplitter(QXmlStreamReader& s,
516
557
{
517
558
Result = restoreSplitter (s, ChildNode, Testing);
518
559
}
519
- else if (s.name () == " DockAreaWidget " )
560
+ else if (s.name () == " Area " )
520
561
{
521
562
Result = restoreDockArea (s, ChildNode, Testing);
522
563
}
@@ -593,8 +634,8 @@ bool DockContainerWidgetPrivate::restoreDockArea(QXmlStreamReader& s,
593
634
}
594
635
595
636
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 : "
598
639
<< CurrentDockWidget;
599
640
600
641
CDockAreaWidget* DockArea = nullptr ;
@@ -605,12 +646,12 @@ bool DockContainerWidgetPrivate::restoreDockArea(QXmlStreamReader& s,
605
646
606
647
while (s.readNextStartElement ())
607
648
{
608
- if (s.name () != " DockWidget " )
649
+ if (s.name () != " Widget " )
609
650
{
610
651
continue ;
611
652
}
612
653
613
- auto ObjectName = s.attributes ().value (" ObjectName " );
654
+ auto ObjectName = s.attributes ().value (" Name " );
614
655
if (ObjectName.isEmpty ())
615
656
{
616
657
return false ;
@@ -673,7 +714,7 @@ bool DockContainerWidgetPrivate::restoreChildNodes(QXmlStreamReader& s,
673
714
Result = restoreSplitter (s, CreatedWidget, Testing);
674
715
qDebug () << " Splitter" ;
675
716
}
676
- else if (s.name () == " DockAreaWidget " )
717
+ else if (s.name () == " Area " )
677
718
{
678
719
Result = restoreDockArea (s, CreatedWidget, Testing);
679
720
qDebug () << " DockAreaWidget" ;
@@ -720,7 +761,7 @@ void DockContainerWidgetPrivate::addDockArea(CDockAreaWidget* NewDockArea, DockW
720
761
}
721
762
else
722
763
{
723
- QSplitter* NewSplitter = internal:: newSplitter (InsertParam.orientation ());
764
+ QSplitter* NewSplitter = newSplitter (InsertParam.orientation ());
724
765
if (InsertParam.append ())
725
766
{
726
767
QLayoutItem* li = Layout->replaceWidget (Splitter, NewSplitter);
@@ -820,7 +861,7 @@ CDockAreaWidget* DockContainerWidgetPrivate::dockWidgetIntoDockArea(DockWidgetAr
820
861
else
821
862
{
822
863
qDebug () << " TargetAreaSplitter->orientation() != InsertParam.orientation()" ;
823
- QSplitter* NewSplitter = internal:: newSplitter (InsertParam.orientation ());
864
+ QSplitter* NewSplitter = newSplitter (InsertParam.orientation ());
824
865
NewSplitter->addWidget (TargetDockArea);
825
866
insertWidgetIntoSplitter (NewSplitter, NewDockArea, InsertParam.append ());
826
867
TargetAreaSplitter->insertWidget (index, NewSplitter);
@@ -837,20 +878,24 @@ CDockContainerWidget::CDockContainerWidget(CDockManager* DockManager, QWidget *p
837
878
QFrame (parent),
838
879
d (new DockContainerWidgetPrivate(this ))
839
880
{
840
- d->isFloating = floatingWidget () != nullptr ;
841
881
d->DockManager = DockManager;
842
- if (DockManager != this )
843
- {
844
- d->DockManager ->registerDockContainer (this );
845
- }
882
+ d->isFloating = floatingWidget () != nullptr ;
846
883
847
884
d->Layout = new QGridLayout ();
848
885
d->Layout ->setContentsMargins (0 , 1 , 0 , 1 );
849
886
d->Layout ->setSpacing (0 );
850
887
setLayout (d->Layout );
851
888
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
+ }
854
899
}
855
900
856
901
// ============================================================================
@@ -1131,7 +1176,7 @@ void CDockContainerWidget::saveState(QXmlStreamWriter& s) const
1131
1176
qDebug () << " CDockContainerWidget::saveState isFloating "
1132
1177
<< isFloating ();
1133
1178
1134
- s.writeStartElement (" DockContainerWidget " );
1179
+ s.writeStartElement (" Container " );
1135
1180
s.writeAttribute (" Floating" , QString::number (isFloating () ? 1 : 0 ));
1136
1181
if (isFloating ())
1137
1182
{
@@ -1193,7 +1238,7 @@ bool CDockContainerWidget::restoreState(QXmlStreamReader& s, bool Testing)
1193
1238
// and we need to create a new empty root splitter
1194
1239
if (!NewRootSplitter)
1195
1240
{
1196
- NewRootSplitter = internal:: newSplitter (Qt::Horizontal);
1241
+ NewRootSplitter = d-> newSplitter (Qt::Horizontal);
1197
1242
}
1198
1243
1199
1244
d->Layout ->replaceWidget (d->RootSplitter , NewRootSplitter);
@@ -1212,6 +1257,18 @@ QSplitter* CDockContainerWidget::rootSplitter() const
1212
1257
}
1213
1258
1214
1259
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
+
1215
1272
// ============================================================================
1216
1273
void CDockContainerWidget::dumpLayout ()
1217
1274
{
0 commit comments