Skip to content

Commit 80efed6

Browse files
Removed unused DockStateSerialization files, added support for opaque splitter resizing
1 parent 653f475 commit 80efed6

15 files changed

+150
-169
lines changed

demo/demo.pro

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,11 @@ CONFIG *= c++14
99

1010
SOURCES += \
1111
main.cpp \
12-
MainWindow.cpp \
13-
mhtabbar.cpp \
14-
mhtabwidget.cpp
12+
MainWindow.cpp
1513

1614

1715
HEADERS += \
18-
MainWindow.h \
19-
mhtabbar.h \
20-
mhtabwidget.h
16+
MainWindow.h
2117

2218
FORMS += \
2319
mainwindow.ui
@@ -27,8 +23,8 @@ RESOURCES += main.qrc
2723
LIBS += -L$${ADS_OUT_ROOT}/lib
2824

2925
# Dependency: AdvancedDockingSystem (shared)
30-
win32:CONFIG(release, debug|release): LIBS += -lAdvancedDockingSystem
31-
else:win32:CONFIG(debug, debug|release): LIBS += -lAdvancedDockingSystemd
26+
win32:CONFIG(release, debug|release): LIBS += -lqtadvanceddocking
27+
else:win32:CONFIG(debug, debug|release): LIBS += -lqtadvanceddockingd
3228
else:unix: LIBS += -lAdvancedDockingSystem
3329

3430
INCLUDEPATH += ../src

src/DockAreaWidget.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -690,13 +690,13 @@ void CDockAreaWidget::updateTitleBarVisibility()
690690
//============================================================================
691691
void CDockAreaWidget::saveState(QXmlStreamWriter& s) const
692692
{
693-
s.writeStartElement("DockAreaWidget");
693+
s.writeStartElement("Area");
694694
s.writeAttribute("Tabs", QString::number(d->ContentsLayout->count()));
695695
auto CurrentDockWidget = currentDockWidget();
696696
QString Name = CurrentDockWidget ? CurrentDockWidget->objectName() : "";
697-
s.writeAttribute("CurrentDockWidget", Name);
697+
s.writeAttribute("Current", Name);
698698
qDebug() << "CDockAreaWidget::saveState TabCount: " << d->ContentsLayout->count()
699-
<< " CurrentDockWidge: " << Name;
699+
<< " Current: " << Name;
700700
for (int i = 0; i < d->ContentsLayout->count(); ++i)
701701
{
702702
dockWidget(i)->saveState(s);

src/DockAreaWidget.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class ADS_EXPORT CDockAreaWidget : public QFrame
5858
DockAreaWidgetPrivate* d; ///< private data (pimpl)
5959
friend struct DockAreaWidgetPrivate;
6060
friend class CDockContainerWidget;
61-
friend class DockContainerWidgetPrivate;
61+
friend struct DockContainerWidgetPrivate;
6262
friend class CDockWidgetTab;
6363
friend struct DockWidgetPrivate;
6464
friend class CDockWidget;

src/DockContainerWidget.cpp

Lines changed: 86 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
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
//============================================================================
12161273
void CDockContainerWidget::dumpLayout()
12171274
{

src/DockContainerWidget.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ class ADS_EXPORT CDockContainerWidget : public QFrame
7878
*/
7979
QSplitter* rootSplitter() const;
8080

81+
/**
82+
* Helper function for creation of the root splitter
83+
*/
84+
void createRootSplitter();
85+
8186
/**
8287
* Drop floating widget into the container
8388
*/

0 commit comments

Comments
 (0)