1414#include < boost/multi_index/ordered_index.hpp>
1515#include < boost/multi_index/sequenced_index.hpp>
1616#include < boost/multi_index_container.hpp>
17+ #include < optional>
1718#include < utility>
1819
1920#include " AbstractRelinker.h"
@@ -146,8 +147,14 @@ class Settings::Impl {
146147
147148 QSizeF getAggregateHardSizeMMLocked () const ;
148149
150+ QSizeF computeAggregateHardSizeMMLocked () const ;
151+
149152 QSizeF getAggregateHardSizeMM (const PageId& pageId, const QSizeF& hardSizeMm, const Alignment& alignment) const ;
150153
154+ void setAggregateHardSizeFrozen (bool frozen);
155+
156+ bool isAggregateHardSizeFrozen () const ;
157+
151158 bool isPageAutoMarginsEnabled (const PageId& pageId);
152159
153160 void setPageAutoMarginsEnabled (const PageId& pageId, bool state);
@@ -199,6 +206,8 @@ class Settings::Impl {
199206 DeviationProvider<PageId> m_deviationProvider;
200207 std::vector<Guide> m_guides;
201208 bool m_showMiddleRect;
209+
210+ std::optional<QSizeF> m_frozenAggregateHardSizeMm;
202211};
203212
204213
@@ -276,6 +285,14 @@ QSizeF Settings::getAggregateHardSizeMM(const PageId& pageId,
276285 return m_impl->getAggregateHardSizeMM (pageId, hardSizeMm, alignment);
277286}
278287
288+ void Settings::setAggregateHardSizeFrozen (const bool frozen) {
289+ m_impl->setAggregateHardSizeFrozen (frozen);
290+ }
291+
292+ bool Settings::isAggregateHardSizeFrozen () const {
293+ return m_impl->isAggregateHardSizeFrozen ();
294+ }
295+
279296bool Settings::isPageAutoMarginsEnabled (const PageId& pageId) {
280297 return m_impl->isPageAutoMarginsEnabled (pageId);
281298}
@@ -368,6 +385,7 @@ void Settings::Impl::clear() {
368385 const QMutexLocker locker (&m_mutex);
369386 m_items.clear ();
370387 m_deviationProvider.clear ();
388+ m_frozenAggregateHardSizeMm.reset ();
371389}
372390
373391void Settings::Impl::performRelinking (const AbstractRelinker& relinker) {
@@ -586,7 +604,7 @@ QSizeF Settings::Impl::getAggregateHardSizeMM() const {
586604 return getAggregateHardSizeMMLocked ();
587605}
588606
589- QSizeF Settings::Impl::getAggregateHardSizeMMLocked () const {
607+ QSizeF Settings::Impl::computeAggregateHardSizeMMLocked () const {
590608 if (m_items.empty ()) {
591609 return QSizeF (0.0 , 0.0 );
592610 }
@@ -599,14 +617,38 @@ QSizeF Settings::Impl::getAggregateHardSizeMMLocked() const {
599617 return QSizeF (width, height);
600618}
601619
620+ QSizeF Settings::Impl::getAggregateHardSizeMMLocked () const {
621+ if (m_frozenAggregateHardSizeMm) {
622+ return *m_frozenAggregateHardSizeMm;
623+ }
624+ return computeAggregateHardSizeMMLocked ();
625+ }
626+
627+ void Settings::Impl::setAggregateHardSizeFrozen (const bool frozen) {
628+ const QMutexLocker locker (&m_mutex);
629+ if (frozen) {
630+ m_frozenAggregateHardSizeMm = computeAggregateHardSizeMMLocked ();
631+ } else {
632+ m_frozenAggregateHardSizeMm.reset ();
633+ }
634+ }
635+
636+ bool Settings::Impl::isAggregateHardSizeFrozen () const {
637+ const QMutexLocker locker (&m_mutex);
638+ return m_frozenAggregateHardSizeMm.has_value ();
639+ }
640+
602641QSizeF Settings::Impl::getAggregateHardSizeMM (const PageId& pageId,
603642 const QSizeF& hardSizeMm,
604643 const Alignment& alignment) const {
605- if (alignment.isNull ()) {
606- return getAggregateHardSizeMM ();
644+ const QMutexLocker locker (&m_mutex);
645+ if (m_frozenAggregateHardSizeMm) {
646+ return *m_frozenAggregateHardSizeMm;
607647 }
608648
609- const QMutexLocker locker (&m_mutex);
649+ if (alignment.isNull ()) {
650+ return computeAggregateHardSizeMMLocked ();
651+ }
610652
611653 if (m_items.empty ()) {
612654 return QSizeF (0.0 , 0.0 );
0 commit comments