Skip to content

Commit 2277ba3

Browse files
author
Uwe Kindler
committed
Added initial support for serialization
1 parent 5dcd15e commit 2277ba3

File tree

4 files changed

+54
-38
lines changed

4 files changed

+54
-38
lines changed

demo/mainwindow.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <QFileSystemModel>
1414
#include <QBoxLayout>
1515
#include <QSettings>
16+
#include <QDockWidget>
1617

1718
#include "DockManager.h"
1819
#include "DockWidget.h"
@@ -104,7 +105,7 @@ void MainWindow::createContent()
104105
DockWidget->setFeatures(DockWidget->features().setFlag(ads::CDockWidget::DockWidgetClosable, false));
105106
m_DockManager->addDockWidget(ads::LeftDockWidgetArea, DockWidget);
106107
m_DockManager->addDockWidget(ads::LeftDockWidgetArea, createLongTextLabelDockWidget(ViewMenu));
107-
m_DockManager->addDockWidget(ads::BottomDockWidgetArea, createFileSystemTreeDockWidget(ViewMenu));
108+
/*m_DockManager->addDockWidget(ads::BottomDockWidgetArea, createFileSystemTreeDockWidget(ViewMenu));
108109
auto TopDockArea = m_DockManager->addDockWidget(ads::TopDockWidgetArea, createFileSystemTreeDockWidget(ViewMenu));
109110
DockWidget = createCalendarDockWidget(ViewMenu);
110111
DockWidget->setFeatures(DockWidget->features().setFlag(ads::CDockWidget::DockWidgetClosable, false));
@@ -115,15 +116,15 @@ void MainWindow::createContent()
115116
m_DockManager->addDockWidget(ads::TopDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), RighDockArea);
116117
auto BottomDockArea = m_DockManager->addDockWidget(ads::BottomDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), RighDockArea);
117118
m_DockManager->addDockWidget(ads::RightDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), RighDockArea);
118-
m_DockManager->addDockWidget(ads::CenterDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), BottomDockArea);
119+
m_DockManager->addDockWidget(ads::CenterDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), BottomDockArea);*/
119120
}
120121

121122

122123
void MainWindow::closeEvent(QCloseEvent* event)
123124
{
124-
QSettings Settings("Settings.ini", QSettings::IniFormat);
125+
/*QSettings Settings("Settings.ini", QSettings::IniFormat);
125126
Settings.setValue("mainWindow/Geometry", saveGeometry());
126-
Settings.setValue("mainWindow/DockingState", m_DockManager->saveState());
127+
Settings.setValue("mainWindow/DockingState", m_DockManager->saveState());*/
127128
QMainWindow::closeEvent(event);
128129
}
129130

src/DockContainerWidget.cpp

Lines changed: 47 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -291,11 +291,13 @@ void DockContainerWidgetPrivate::saveChildNodesState(QDataStream& stream, QWidge
291291
if (Splitter)
292292
{
293293
stream << NodeSplitter << Splitter->orientation() << Splitter->count();
294-
std::cout << "NodeSplitter " << Splitter->orientation() << std::endl;
294+
std::cout << "NodeSplitter orient: " << Splitter->orientation()
295+
<< " WidgetCont: " << Splitter->count() << std::endl;
295296
for (int i = 0; i < Splitter->count(); ++i)
296297
{
297298
saveChildNodesState(stream, Splitter->widget(i));
298299
}
300+
stream << Splitter->sizes();
299301
}
300302
else
301303
{
@@ -322,28 +324,34 @@ void DockContainerWidgetPrivate::restoreChildNodes(QDataStream& stream,
322324
stream >> Orientation >> WidgetCount;
323325
std::cout << "Restore NodeSplitter Orientation: " << Orientation <<
324326
" WidgetCount: " << WidgetCount << std::endl;
327+
QSplitter* Splitter = internal::newSplitter((Qt::Orientation)Orientation);
328+
bool Visible = false;
325329
for (int i = 0; i < WidgetCount; ++i)
326330
{
327-
QWidget* Widget;
328-
restoreChildNodes(stream, CreatedWidget);
331+
QWidget* ChildNode;
332+
restoreChildNodes(stream, ChildNode);
333+
if (ChildNode)
334+
{
335+
Splitter->addWidget(ChildNode);
336+
}
337+
std::cout << "ChildNode isVisible " << ChildNode->isVisible()
338+
<< " isVisibleTo " << ChildNode->isVisibleTo(Splitter) << std::endl;
339+
Visible |= ChildNode->isVisibleTo(Splitter);
329340
}
330341

331-
332-
333-
/*std::cout << "Restore NodeSplitter " << Orientation << std::endl;
334-
QSplitter* Splitter = internal::newSplitter((Qt::Orientation)Orientation);
335-
if (ParentSplitter)
342+
QList<int> Sizes;
343+
stream >> Sizes;
344+
if (!Splitter->count())
336345
{
337-
ParentSplitter->addWidget(Splitter);
346+
delete Splitter;
347+
Splitter = nullptr;
338348
}
339349
else
340350
{
341-
Parent->layout()->addWidget(Splitter);
351+
Splitter->setSizes(Sizes);
352+
Splitter->setVisible(Visible);
342353
}
343-
for (int i = 0; i < Count; ++i)
344-
{
345-
restoreChildNodes(stream, Splitter);
346-
}*/
354+
CreatedWidget = Splitter;
347355
}
348356
else
349357
{
@@ -352,6 +360,8 @@ void DockContainerWidgetPrivate::restoreChildNodes(QDataStream& stream,
352360
stream >> Tabs >> CurrentIndex;
353361
std::cout << "Restore NodeDockArea Tabs: " << Tabs << " CurrentIndex: "
354362
<< CurrentIndex << std::endl;
363+
364+
CDockAreaWidget* DockArea = new CDockAreaWidget(DockManager, _this);
355365
for (int i = 0; i < Tabs; ++i)
356366
{
357367
QString ObjectName;
@@ -369,11 +379,19 @@ void DockContainerWidgetPrivate::restoreChildNodes(QDataStream& stream,
369379
{
370380
std::cout << "Dock Widget found - parent " << DockWidget->parent()
371381
<< std::endl;
382+
DockArea->addDockWidget(DockWidget);
372383
}
384+
DockWidget->toggleView(!Closed);
385+
}
373386

374-
CDockAreaWidget* DockArea = new CDockAreaWidget(DockManager, _this);
375-
DockArea->addDockWidget(DockWidget);
387+
if (!DockArea->count())
388+
{
389+
delete DockArea;
390+
DockArea = nullptr;
376391
}
392+
CreatedWidget = DockArea;
393+
DockAreas.append(DockArea);
394+
DockArea->setCurrentIndex(CurrentIndex);
377395
}
378396
}
379397

@@ -680,19 +698,16 @@ QList<CDockAreaWidget*> CDockContainerWidget::openedDockAreas() const
680698
//============================================================================
681699
void CDockContainerWidget::saveState(QDataStream& stream) const
682700
{
683-
std::cout << "CDockContainerWidget::saveState" << std::endl;
701+
std::cout << "CDockContainerWidget::saveState isFloating "
702+
<< isFloating() << std::endl;
684703
stream << isFloating();
685704
if (isFloating())
686705
{
687706
CFloatingDockContainer* FloatingWidget = internal::findParent<CFloatingDockContainer*>(this);
688707
stream << FloatingWidget->saveGeometry();
689708
}
690709

691-
QWidget* RootChild = d->Layout->itemAt(0)->widget();
692-
if (RootChild)
693-
{
694-
d->saveChildNodesState(stream, RootChild);
695-
}
710+
d->saveChildNodesState(stream, d->RootSplitter);
696711
}
697712

698713

@@ -702,25 +717,25 @@ bool CDockContainerWidget::restoreState(QDataStream& stream)
702717
bool IsFloating;
703718
stream >> IsFloating;
704719
std::cout << "Restore CDockContainerWidget Floating" << IsFloating << std::endl;
705-
QWidget* RootChild = d->Layout->itemAt(0)->widget();
706-
if (RootChild)
707-
{
708-
d->DockAreas.clear();
709-
delete RootChild;
710-
}
711-
QWidget* Widget;
712-
d->restoreChildNodes(stream, Widget);
713720

714-
/*if (isFloating())
721+
QWidget* NewRootSplitter;
722+
d->DockAreas.clear();
723+
if (isFloating())
715724
{
716725
std::cout << "Restore floating widget" << std::endl;
717726
CFloatingDockContainer* FloatingWidget = internal::findParent<CFloatingDockContainer*>(this);
718727
QByteArray Geometry;
719728
stream >> Geometry;
720729
FloatingWidget->restoreGeometry(Geometry);
721730
FloatingWidget->show();
722-
}*/
731+
}
732+
733+
d->restoreChildNodes(stream, NewRootSplitter);
723734

735+
d->Layout->replaceWidget(d->RootSplitter, NewRootSplitter);
736+
QSplitter* OldRoot = d->RootSplitter;
737+
d->RootSplitter = dynamic_cast<QSplitter*>(NewRootSplitter);
738+
delete OldRoot;
724739
return true;
725740
}
726741

src/DockWidget.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ void DockWidgetPrivate::hideEmptyParentSplitter()
148148

149149
for (int i = 0; i < Splitter->count(); ++i)
150150
{
151-
if (Splitter->widget(i)->isVisible())
151+
if (Splitter->widget(i)->isVisibleTo(Splitter))
152152
{
153153
return;
154154
}

src/DockWidgetTitleBar.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ bool DockWidgetTitleBarPrivate::startFloating(const QPoint& GlobalPos)
187187
{
188188
std::cout << "DockWidgetTitleBarPrivate::startFloating DockArea" << std::endl;
189189
// If section widget has only one content widget, we can move the complete
190-
// section widget into floating widget
190+
// dock area into floating widget
191191
auto splitter = internal::findParent<QSplitter*>(DockArea);
192192
FloatingWidget = new CFloatingDockContainer(DockArea);
193193
}

0 commit comments

Comments
 (0)