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// ============================================================================
288367CDockAreaWidget* 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// ---------------------------------------------------------------------------
0 commit comments