diff --git a/src/LayoutSaver.cpp b/src/LayoutSaver.cpp index 07661c10..8ff1a8e4 100644 --- a/src/LayoutSaver.cpp +++ b/src/LayoutSaver.cpp @@ -122,8 +122,8 @@ public: bool LayoutSaver::Private::s_restoreInProgress = false; -LayoutSaver::LayoutSaver() - : d(new Private(RestoreOption_None)) +LayoutSaver::LayoutSaver(RestoreOptions options) + : d(new Private(options)) { } @@ -211,6 +211,22 @@ bool LayoutSaver::restoreLayout(const QByteArray &data) if (data.isEmpty()) return true; + struct EnsureItemsAtCorrectPlace { + ~EnsureItemsAtCorrectPlace() + { + // When using RestoreOption_RelativeToMainWindow we'll have many rounding errors so the layout won't be exact. + // Make sure to run a relayout at the end + // (Using RAII to make sure it runs after Private::RAIIIsRestoring went out of scope, since "isRestoring= true" inhibits relayout + if (ensure) { + for (auto layout : DockRegistry::self()->layouts()) + layout->redistributeSpace(); + } + } + + bool ensure = false; + }; + + EnsureItemsAtCorrectPlace ensureItemsAtCorrectPlace; Private::RAIIIsRestoring isRestoring; struct FrameCleanup { @@ -281,6 +297,9 @@ bool LayoutSaver::restoreLayout(const QByteArray &data) } } + // our raii class will run when + ensureItemsAtCorrectPlace.ensure = d->m_restoreOptions & RestoreOption_RelativeToMainWindow; + return true; } @@ -979,8 +998,8 @@ void LayoutSaver::ScalingInfo::applyFactorsTo(QPoint &pt) const void LayoutSaver::ScalingInfo::applyFactorsTo(QSize &sz) const { - sz.setWidth(qCeil(widthFactor * sz.width())); - sz.setHeight(qCeil(heightFactor * sz.height())); + sz.setWidth(int(widthFactor * sz.width())); + sz.setHeight(int(heightFactor * sz.height())); } void LayoutSaver::ScalingInfo::applyFactorsTo(QRect &rect) const diff --git a/src/LayoutSaver.h b/src/LayoutSaver.h index c5a6806e..dd4c60a2 100644 --- a/src/LayoutSaver.h +++ b/src/LayoutSaver.h @@ -44,7 +44,7 @@ class DOCKS_EXPORT LayoutSaver { public: ///@brief Constructor. Construction on the stack is suggested. - LayoutSaver(); + explicit LayoutSaver(RestoreOptions options = RestoreOption_None); ///@brief Destructor. ~LayoutSaver(); diff --git a/src/private/multisplitter/MultiSplitterLayout.cpp b/src/private/multisplitter/MultiSplitterLayout.cpp index b4b39997..357c585c 100644 --- a/src/private/multisplitter/MultiSplitterLayout.cpp +++ b/src/private/multisplitter/MultiSplitterLayout.cpp @@ -1080,6 +1080,7 @@ void MultiSplitterLayout::positionStaticAnchors() void MultiSplitterLayout::redistributeSpace() { + positionStaticAnchors(); redistributeSpace_recursive(m_leftAnchor, 0); redistributeSpace_recursive(m_topAnchor, 0); } diff --git a/src/private/multisplitter/MultiSplitterLayout_p.h b/src/private/multisplitter/MultiSplitterLayout_p.h index fca4b90c..b49c573d 100644 --- a/src/private/multisplitter/MultiSplitterLayout_p.h +++ b/src/private/multisplitter/MultiSplitterLayout_p.h @@ -442,6 +442,7 @@ private: friend class Anchor; friend class TestDocks; friend class KDDockWidgets::Debug::DebugWindow; + friend class LayoutSaver; struct AnchorBounds { Anchor *side1;