Skip to content

Commit 1cd1e7d

Browse files
author
Uwe Kindler
committed
Started implementing serialization and deserialization
1 parent 16bd1a3 commit 1cd1e7d

14 files changed

+353
-53
lines changed

demo/mainwindow.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
#include "ui_mainwindow.h"
44

5+
#include <iostream>
6+
57
#include <QTime>
68
#include <QLabel>
79
#include <QTextEdit>
@@ -10,6 +12,7 @@
1012
#include <QTreeView>
1113
#include <QFileSystemModel>
1214
#include <QBoxLayout>
15+
#include <QSettings>
1316

1417
#include "DockManager.h"
1518
#include "DockWidget.h"
@@ -40,6 +43,7 @@ static ads::CDockWidget* createLongTextLabelDockWidget(QMenu* ViewMenu)
4043

4144
ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Label %1").arg(LabelCount++));
4245
DockWidget->setWidget(l);
46+
DockWidget->setObjectName(DockWidget->windowTitle());
4347
ViewMenu->addAction(DockWidget->toggleViewAction());
4448
return DockWidget;
4549
}
@@ -50,6 +54,7 @@ static ads::CDockWidget* createCalendarDockWidget(QMenu* ViewMenu)
5054
QCalendarWidget* w = new QCalendarWidget();
5155
ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Calendar %1").arg(CalendarCount++));
5256
DockWidget->setWidget(w);
57+
DockWidget->setObjectName(DockWidget->windowTitle());
5358
ViewMenu->addAction(DockWidget->toggleViewAction());
5459
return DockWidget;
5560
}
@@ -64,6 +69,7 @@ static ads::CDockWidget* createFileSystemTreeDockWidget(QMenu* ViewMenu)
6469
w->setModel(m);
6570
ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Filesystem %1").arg(FileSystemCount++));
6671
DockWidget->setWidget(w);
72+
DockWidget->setObjectName(DockWidget->windowTitle());
6773
ViewMenu->addAction(DockWidget->toggleViewAction());
6874
return DockWidget;
6975
}
@@ -113,3 +119,29 @@ void MainWindow::createContent()
113119
}
114120

115121

122+
void MainWindow::closeEvent(QCloseEvent* event)
123+
{
124+
QSettings Settings("Settings.ini", QSettings::IniFormat);
125+
Settings.setValue("mainWindow/Geometry", saveGeometry());
126+
Settings.setValue("mainWindow/DockingState", m_DockManager->saveState());
127+
QMainWindow::closeEvent(event);
128+
}
129+
130+
131+
void MainWindow::on_actionSaveState_triggered(bool)
132+
{
133+
std::cout << "MainWindow::on_actionSaveState_triggered" << std::endl;
134+
QSettings Settings("Settings.ini", QSettings::IniFormat);
135+
Settings.setValue("mainWindow/Geometry", saveGeometry());
136+
Settings.setValue("mainWindow/DockingState", m_DockManager->saveState());
137+
}
138+
139+
140+
void MainWindow::on_actionRestoreState_triggered(bool)
141+
{
142+
std::cout << "MainWindow::on_actionRestoreState_triggered" << std::endl;
143+
QSettings Settings("Settings.ini", QSettings::IniFormat);
144+
restoreGeometry(Settings.value("mainWindow/Geometry").toByteArray());
145+
m_DockManager->restoreState(Settings.value("mainWindow/DockingState").toByteArray());
146+
}
147+

demo/mainwindow.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ class MainWindow;
1111
class MainWindow : public QMainWindow
1212
{
1313
Q_OBJECT
14-
14+
protected:
15+
virtual void closeEvent(QCloseEvent* event) override;
1516
public:
1617
explicit MainWindow(QWidget *parent = 0);
1718
virtual ~MainWindow();
@@ -20,6 +21,10 @@ class MainWindow : public QMainWindow
2021
Ui::MainWindow *ui;
2122
ads::CDockManager* m_DockManager;
2223
void createContent();
24+
25+
private slots:
26+
void on_actionSaveState_triggered(bool);
27+
void on_actionRestoreState_triggered(bool);
2328
};
2429

2530
#endif // MAINWINDOW_H

demo/mainwindow.ui

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
<string>File</string>
3030
</property>
3131
<addaction name="actionExit"/>
32+
<addaction name="actionSaveState"/>
33+
<addaction name="actionRestoreState"/>
3234
</widget>
3335
<widget class="QMenu" name="menuView">
3436
<property name="title">
@@ -49,6 +51,16 @@
4951
<string>Exit</string>
5052
</property>
5153
</action>
54+
<action name="actionSaveState">
55+
<property name="text">
56+
<string>Save State</string>
57+
</property>
58+
</action>
59+
<action name="actionRestoreState">
60+
<property name="text">
61+
<string>Restore State</string>
62+
</property>
63+
</action>
5264
</widget>
5365
<layoutdefault spacing="6" margin="11"/>
5466
<resources/>

src/DockAreaWidget.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,17 @@ void CDockAreaWidget::onDockWidgetViewToggled(bool Open)
706706
auto DockWidget = dynamic_cast<CDockWidget*>(sender());
707707
}
708708

709+
710+
//============================================================================
711+
void CDockAreaWidget::saveState(QDataStream& stream) const
712+
{
713+
stream << d->ContentsLayout->count() << d->ContentsLayout->currentIndex();
714+
for (int i = 0; i < d->ContentsLayout->count(); ++i)
715+
{
716+
dockWidget(i)->saveState(stream);
717+
}
718+
}
719+
709720
} // namespace ads
710721

711722
//---------------------------------------------------------------------------

src/DockAreaWidget.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,11 @@ private slots:
161161
*/
162162
void setCurrentDockWidget(CDockWidget* DockWidget);
163163

164+
/**
165+
* Saves the state into the given stream
166+
*/
167+
void saveState(QDataStream& Stream) const;
168+
164169
public slots:
165170
/**
166171
* This sets the index position of the current tab page.

src/DockContainerWidget.cpp

Lines changed: 125 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include "DockWidget.h"
4242
#include "FloatingDockContainer.h"
4343
#include "DockOverlay.h"
44+
#include "DockStateSerialization.h"
4445
#include "ads_globals.h"
4546

4647
#include <iostream>
@@ -113,6 +114,16 @@ struct DockContainerWidgetPrivate
113114
* Adds new dock areas to the internal dock area list
114115
*/
115116
void addDockAreasToList(const QList<CDockAreaWidget*> NewDockAreas);
117+
118+
/**
119+
* Save state of child nodes
120+
*/
121+
void saveChildNodesState(QDataStream& Stream, QWidget* Widget);
122+
123+
/**
124+
* Restore state of child nodes
125+
*/
126+
void restoreChildNodes(QDataStream& Stream, QWidget* Parent);
116127
}; // struct DockContainerWidgetPrivate
117128

118129

@@ -284,6 +295,74 @@ void DockContainerWidgetPrivate::addDockAreasToList(const QList<CDockAreaWidget*
284295
}
285296

286297

298+
//============================================================================
299+
void DockContainerWidgetPrivate::saveChildNodesState(QDataStream& stream, QWidget* Widget)
300+
{
301+
QSplitter* Splitter = dynamic_cast<QSplitter*>(Widget);
302+
if (Splitter)
303+
{
304+
stream << NodeSplitter << Splitter->orientation() << Splitter->count();
305+
std::cout << "NodeSplitter " << Splitter->orientation() << std::endl;
306+
for (int i = 0; i < Splitter->count(); ++i)
307+
{
308+
saveChildNodesState(stream, Splitter->widget(i));
309+
}
310+
}
311+
else
312+
{
313+
CDockAreaWidget* DockArea = dynamic_cast<CDockAreaWidget*>(Widget);
314+
if (DockArea)
315+
{
316+
std::cout << "NodeDockArea " << std::endl;
317+
DockArea->saveState(stream);
318+
}
319+
}
320+
}
321+
322+
323+
//============================================================================
324+
void DockContainerWidgetPrivate::restoreChildNodes(QDataStream& stream, QWidget* Parent)
325+
{
326+
int NodeType;
327+
stream >> NodeType;
328+
QSplitter* ParentSplitter = dynamic_cast<QSplitter*>(Parent);
329+
if (NodeSplitter == NodeType)
330+
{
331+
int Orientation;
332+
int Count;
333+
stream >> Orientation >> Count;
334+
std::cout << "Restore NodeSplitter " << Orientation << std::endl;
335+
QSplitter* Splitter = internal::newSplitter((Qt::Orientation)Orientation);
336+
if (ParentSplitter)
337+
{
338+
ParentSplitter->addWidget(Splitter);
339+
}
340+
else
341+
{
342+
Parent->layout()->addWidget(Splitter);
343+
}
344+
for (int i = 0; i < Count; ++i)
345+
{
346+
restoreChildNodes(stream, Splitter);
347+
}
348+
}
349+
else
350+
{
351+
std::cout << "Restore NodeDockArea " << std::endl;
352+
CDockAreaWidget* DockArea = new CDockAreaWidget(DockManager, _this);
353+
if (ParentSplitter)
354+
{
355+
ParentSplitter->addWidget(DockArea);
356+
}
357+
else
358+
{
359+
Parent->layout()->addWidget(DockArea);
360+
}
361+
DockAreas.append(DockArea);
362+
}
363+
}
364+
365+
287366
//============================================================================
288367
CDockAreaWidget* DockContainerWidgetPrivate::dockWidgetIntoContainer(DockWidgetArea area,
289368
CDockWidget* Dockwidget)
@@ -301,7 +380,7 @@ void DockContainerWidgetPrivate::addDockArea(CDockAreaWidget* NewDockArea, DockW
301380
auto InsertParam = internal::dockAreaInsertParameters(area);
302381
if (DockAreas.isEmpty())
303382
{
304-
Layout->addWidget(NewDockArea, 0, 0);
383+
_this->layout()->addWidget(NewDockArea);
305384
}
306385
else if (DockAreas.count() == 1)
307386
{
@@ -604,6 +683,51 @@ QList<CDockAreaWidget*> CDockContainerWidget::openedDockAreas() const
604683
}
605684

606685

686+
//============================================================================
687+
void CDockContainerWidget::saveState(QDataStream& stream) const
688+
{
689+
std::cout << "CDockContainerWidget::saveState" << std::endl;
690+
stream << isFloating();
691+
if (isFloating())
692+
{
693+
CFloatingDockContainer* FloatingWidget = internal::findParent<CFloatingDockContainer*>(this);
694+
stream << FloatingWidget->saveGeometry();
695+
}
696+
697+
QWidget* RootChild = d->Layout->itemAt(0)->widget();
698+
if (RootChild)
699+
{
700+
d->saveChildNodesState(stream, RootChild);
701+
}
702+
}
703+
704+
705+
//============================================================================
706+
bool CDockContainerWidget::restoreState(QDataStream& stream)
707+
{
708+
bool IsFloating;
709+
stream >> IsFloating;
710+
if (isFloating())
711+
{
712+
std::cout << "Restore floating widget" << std::endl;
713+
CFloatingDockContainer* FloatingWidget = internal::findParent<CFloatingDockContainer*>(this);
714+
QByteArray Geometry;
715+
stream >> Geometry;
716+
FloatingWidget->restoreGeometry(Geometry);
717+
FloatingWidget->show();
718+
}
719+
720+
QWidget* RootChild = d->Layout->itemAt(0)->widget();
721+
if (RootChild)
722+
{
723+
d->DockAreas.clear();
724+
delete RootChild;
725+
}
726+
d->restoreChildNodes(stream, this);
727+
return true;
728+
}
729+
730+
607731
} // namespace ads
608732

609733
//---------------------------------------------------------------------------

src/DockContainerWidget.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,16 @@ class CDockContainerWidget : public QFrame
134134
*/
135135
bool isFloating() const;
136136

137+
/**
138+
* Saves the state into the given stream
139+
*/
140+
void saveState(QDataStream& Stream) const;
141+
142+
/**
143+
* Restores the state from given stream
144+
*/
145+
bool restoreState(QDataStream& Stream);
146+
137147
signals:
138148
/**
139149
* This signal is emitted if one or multiple dock areas has been added to

0 commit comments

Comments
 (0)