8#include <QtCore/qpoint.h>
9#include <QtCore/qrect.h>
10#include <QtCore/qsize.h>
16QT_IMPL_METATYPE_EXTERN(QPageLayout)
17QT_IMPL_METATYPE_EXTERN_TAGGED(QPageLayout::Unit, QPageLayout__Unit)
18QT_IMPL_METATYPE_EXTERN_TAGGED(QPageLayout::Orientation, QPageLayout__Orientation)
21Q_GUI_EXPORT qreal qt_pointMultiplier(QPageLayout::Unit unit)
24 case QPageLayout::Millimeter:
26 case QPageLayout::Point:
28 case QPageLayout::Inch:
30 case QPageLayout::Pica:
32 case QPageLayout::Didot:
34 case QPageLayout::Cicero:
41Q_GUI_EXPORT
extern qreal qt_pixelMultiplier(
int resolution);
43Q_GUI_EXPORT QMarginsF qt_convertMargins(
const QMarginsF &margins, QPageLayout::Unit fromUnits, QPageLayout::Unit toUnits)
46 if (fromUnits == toUnits || margins.isNull())
50 if (toUnits == QPageLayout::Point) {
51 const qreal multiplierX100 = qt_pointMultiplier(fromUnits) * 100;
52 return QMarginsF(qCeil(margins.left() * multiplierX100) / 100.0,
53 qCeil(margins.top() * multiplierX100) / 100.0,
54 qCeil(margins.right() * multiplierX100) / 100.0,
55 qCeil(margins.bottom() * multiplierX100) / 100.0);
59 QMarginsF pointMargins = fromUnits == QPageLayout::Point ? margins : margins * qt_pointMultiplier(fromUnits);
62 const qreal multiplier = qt_pointMultiplier(toUnits);
63 return QMarginsF(qRound(pointMargins.left() * 100 / multiplier) / 100.0,
64 qRound(pointMargins.top() * 100 / multiplier) / 100.0,
65 qRound(pointMargins.right() * 100 / multiplier) / 100.0,
66 qRound(pointMargins.bottom() * 100 / multiplier) / 100.0);
74 const QMarginsF &margins, QPageLayout::Unit units,
100 friend class QPageLayout;
102 QSizeF fullSizeUnits(QPageLayout::Unit units)
const;
104 QPageSize m_pageSize;
115 const QMarginsF &margins, QPageLayout::Unit units,
123 m_fullSize = fullSizeUnits(m_units);
129 return m_pageSize == other.m_pageSize
130 && m_orientation == other.m_orientation
131 && m_units == other.m_units
132 && m_margins == other.m_margins
133 && m_minMargins == other.m_minMargins
134 && m_maxMargins == other.m_maxMargins;
139 return m_pageSize.isEquivalentTo(other.m_pageSize)
140 && m_orientation == other.m_orientation
141 && qt_convertMargins(m_margins, m_units, QPageLayout::Point)
142 == qt_convertMargins(other.m_margins, other.m_units, QPageLayout::Point);
147 return m_pageSize.isValid();
152 return QMarginsF(qBound(m_minMargins.left(), margins.left(), m_maxMargins.left()),
153 qBound(m_minMargins.top(), margins.top(), m_maxMargins.top()),
154 qBound(m_minMargins.right(), margins.right(), m_maxMargins.right()),
155 qBound(m_minMargins.bottom(), margins.bottom(), m_maxMargins.bottom()));
160 return qt_convertMargins(m_margins, m_units, units);
165 return qt_convertMargins(m_margins, m_units, QPageLayout::Point);
170 return QMarginsF(marginsPoints() / qt_pixelMultiplier(resolution)).toMargins();
175 m_minMargins = minMargins;
176 m_maxMargins = QMarginsF(qMax(m_fullSize.width() - m_minMargins.right(), qreal(0)),
177 qMax(m_fullSize.height() - m_minMargins.bottom(), qreal(0)),
178 qMax(m_fullSize.width() - m_minMargins.left(), qreal(0)),
179 qMax(m_fullSize.height() - m_minMargins.top(), qreal(0)));
180 if (m_mode == QPageLayout::StandardMode)
181 m_margins = clampMargins(m_margins);
186 QSizeF fullPageSize = m_pageSize.size(QPageSize::Unit(units));
187 return m_orientation == QPageLayout::Landscape ? fullPageSize.transposed() : fullPageSize;
192 return QRectF(QPointF(0, 0), m_fullSize);
197 return units == m_units ? fullRect() : QRectF(QPointF(0, 0), fullSizeUnits(units));
202 if (m_orientation == QPageLayout::Landscape)
203 return QRect(QPoint(0, 0), m_pageSize.sizePoints().transposed());
205 return QRect(QPoint(0, 0), m_pageSize.sizePoints());
210 if (m_orientation == QPageLayout::Landscape)
211 return QRect(QPoint(0, 0), m_pageSize.sizePixels(resolution).transposed());
213 return QRect(QPoint(0, 0), m_pageSize.sizePixels(resolution));
218 return m_mode == QPageLayout::FullPageMode ? fullRect() : fullRect() - m_margins;
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
255
256
257
258
259
260
261
262
263
264
265
268
269
270
271
272
273
274
275
276
277
278
281
282
283
284
285
286
287
288
289
290
291
292
293
296
297
298
299
300
301
302
303
304
305
306
307
308
311
312
314QPageLayout::QPageLayout()
315 : QPageLayout(QPageSize(), QPageLayout::Landscape, QMarginsF())
320
321
322
323
324
325
326
327
328
329
330
332QPageLayout::QPageLayout(
const QPageSize &pageSize, Orientation orientation,
333 const QMarginsF &margins, Unit units,
334 const QMarginsF &minMargins)
335 : d(
new QPageLayoutPrivate(pageSize, orientation, margins, units, minMargins))
340
341
343QPageLayout::QPageLayout(
const QPageLayout &other)
349
350
352QPageLayout::~QPageLayout()
357
358
360QPageLayout &QPageLayout::operator=(
const QPageLayout &other)
367
368
369
372
373
374
375
376
379
380
381
382
383
384
385
386
387
388
389
392
393
394
395
396
397
398
399
400
401
402
405
406
407bool QPageLayout::equals(
const QPageLayout &other)
const
409 return d == other.d || *d == *other.d;
414
415
416
418bool QPageLayout::isEquivalentTo(
const QPageLayout &other)
const
420 return d && other.d && d->isEquivalentTo(*other.d);
424
425
427bool QPageLayout::isValid()
const
433
434
436void QPageLayout::setMode(Mode mode)
443
444
446QPageLayout::Mode QPageLayout::mode()
const
452
453
454
455
456
457
458
459
460
461
463void QPageLayout::setPageSize(
const QPageSize &pageSize,
const QMarginsF &minMargins)
465 if (!pageSize.isValid())
468 d->m_pageSize = pageSize;
469 d->m_fullSize = d->fullSizeUnits(d->m_units);
470 d->setDefaultMargins(minMargins);
474
475
476
477
478
479
481QPageSize QPageLayout::pageSize()
const
483 return d->m_pageSize;
487
488
489
490
491
493void QPageLayout::setOrientation(Orientation orientation)
495 if (orientation != d->m_orientation) {
497 d->m_orientation = orientation;
498 d->m_fullSize = d->fullSizeUnits(d->m_units);
500 const qreal change = d->m_fullSize.width() - d->m_fullSize.height();
501 d->m_maxMargins.setLeft(d->m_maxMargins.left() + change);
502 d->m_maxMargins.setRight(d->m_maxMargins.right() + change);
503 d->m_maxMargins.setTop(d->m_maxMargins.top() - change);
504 d->m_maxMargins.setBottom(d->m_maxMargins.bottom() - change);
509
510
512QPageLayout::Orientation QPageLayout::orientation()
const
514 return d->m_orientation;
518
519
521void QPageLayout::setUnits(Unit units)
523 if (units != d->m_units) {
525 d->m_margins = qt_convertMargins(d->m_margins, d->m_units, units);
526 d->m_minMargins = qt_convertMargins(d->m_minMargins, d->m_units, units);
527 d->m_maxMargins = qt_convertMargins(d->m_maxMargins, d->m_units, units);
529 d->m_fullSize = d->fullSizeUnits(d->m_units);
534
535
537QPageLayout::Unit QPageLayout::units()
const
543
544
545
546
547
548
549
550
551
552
553
555bool QPageLayout::setMargins(
const QMarginsF &margins, OutOfBoundsPolicy outOfBoundsPolicy)
557 if (d->m_mode == FullPageMode) {
558 if (margins != d->m_margins) {
560 d->m_margins = margins;
565 if (outOfBoundsPolicy == OutOfBoundsPolicy::Clamp) {
566 const QMarginsF clampedMargins = d->clampMargins(margins);
567 if (clampedMargins != d->m_margins) {
569 d->m_margins = clampedMargins;
574 if (margins.left() >= d->m_minMargins.left()
575 && margins.right() >= d->m_minMargins.right()
576 && margins.top() >= d->m_minMargins.top()
577 && margins.bottom() >= d->m_minMargins.bottom()
578 && margins.left() <= d->m_maxMargins.left()
579 && margins.right() <= d->m_maxMargins.right()
580 && margins.top() <= d->m_maxMargins.top()
581 && margins.bottom() <= d->m_maxMargins.bottom()) {
582 if (margins != d->m_margins) {
584 d->m_margins = margins;
593
594
595
596
597
598
599
600
601
602
603
605bool QPageLayout::setLeftMargin(qreal leftMargin, OutOfBoundsPolicy outOfBoundsPolicy)
607 if (d->m_mode == StandardMode && outOfBoundsPolicy == OutOfBoundsPolicy::Clamp)
608 leftMargin = qBound(d->m_minMargins.left(), leftMargin, d->m_maxMargins.left());
610 if (QtPrivate::fuzzyCompare(leftMargin, d->m_margins.left()))
613 if (d->m_mode == FullPageMode
614 || (leftMargin >= d->m_minMargins.left() && leftMargin <= d->m_maxMargins.left())) {
616 d->m_margins.setLeft(leftMargin);
624
625
626
627
628
629
630
631
632
633
634
636bool QPageLayout::setRightMargin(qreal rightMargin, OutOfBoundsPolicy outOfBoundsPolicy)
638 if (d->m_mode == StandardMode && outOfBoundsPolicy == OutOfBoundsPolicy::Clamp)
639 rightMargin = qBound(d->m_minMargins.right(), rightMargin, d->m_maxMargins.right());
641 if (QtPrivate::fuzzyCompare(rightMargin, d->m_margins.right()))
644 if (d->m_mode == FullPageMode
645 || (rightMargin >= d->m_minMargins.right() && rightMargin <= d->m_maxMargins.right())) {
647 d->m_margins.setRight(rightMargin);
655
656
657
658
659
660
661
662
663
664
665
667bool QPageLayout::setTopMargin(qreal topMargin, OutOfBoundsPolicy outOfBoundsPolicy)
669 if (d->m_mode == StandardMode && outOfBoundsPolicy == OutOfBoundsPolicy::Clamp)
670 topMargin = qBound(d->m_minMargins.top(), topMargin, d->m_maxMargins.top());
672 if (QtPrivate::fuzzyCompare(topMargin, d->m_margins.top()))
675 if (d->m_mode == FullPageMode
676 || (topMargin >= d->m_minMargins.top() && topMargin <= d->m_maxMargins.top())) {
678 d->m_margins.setTop(topMargin);
686
687
688
689
690
691
692
693
694
695
696
698bool QPageLayout::setBottomMargin(qreal bottomMargin, OutOfBoundsPolicy outOfBoundsPolicy)
700 if (d->m_mode == StandardMode && outOfBoundsPolicy == OutOfBoundsPolicy::Clamp)
701 bottomMargin = qBound(d->m_minMargins.bottom(), bottomMargin, d->m_maxMargins.bottom());
703 if (QtPrivate::fuzzyCompare(bottomMargin, d->m_margins.bottom()))
706 if (d->m_mode == FullPageMode
707 || (bottomMargin >= d->m_minMargins.bottom() && bottomMargin <= d->m_maxMargins.bottom())) {
709 d->m_margins.setBottom(bottomMargin);
717
718
719
720
722QMarginsF QPageLayout::margins()
const
728
729
730
731
733QMarginsF QPageLayout::margins(Unit units)
const
735 return d->margins(units);
739
740
741
742
744QMargins QPageLayout::marginsPoints()
const
746 return d->marginsPoints().toMargins();
750
751
752
753
755QMargins QPageLayout::marginsPixels(
int resolution)
const
757 return d->marginsPixels(resolution);
761
762
763
764
765
766
767
768
769
770
771
773void QPageLayout::setMinimumMargins(
const QMarginsF &minMargins)
776 d->setDefaultMargins(minMargins);
780
781
782
783
785QMarginsF QPageLayout::minimumMargins()
const
787 return d->m_minMargins;
791
792
793
794
795
796
797
798
799
800
802QMarginsF QPageLayout::maximumMargins()
const
804 return d->m_maxMargins;
808
809
810
811
812
813
814
816QRectF QPageLayout::fullRect()
const
818 return isValid() ? d->fullRect() : QRect();
822
823
824
825
826
827
828
830QRectF QPageLayout::fullRect(Unit units)
const
832 return isValid() ? d->fullRect(units) : QRect();
836
837
838
839
840
841
842
844QRect QPageLayout::fullRectPoints()
const
846 return isValid() ? d->fullRectPoints() : QRect();
850
851
852
853
854
855
856
858QRect QPageLayout::fullRectPixels(
int resolution)
const
860 return isValid() ? d->fullRectPixels(resolution) : QRect();
864
865
866
867
868
869
870
871
873QRectF QPageLayout::paintRect()
const
875 return isValid() ? d->paintRect() : QRectF();
879
880
881
882
883
884
885
886
888QRectF QPageLayout::paintRect(Unit units)
const
892 if (units == d->m_units)
893 return d->paintRect();
894 return d->m_mode == FullPageMode ? d->fullRect(units)
895 : d->fullRect(units) - d->margins(units);
899
900
901
902
903
904
905
906
908QRect QPageLayout::paintRectPoints()
const
912 return d->m_mode == FullPageMode ? d->fullRectPoints()
913 : d->fullRectPoints() - d->marginsPoints().toMargins();
917
918
919
920
921
922
923
924
926QRect QPageLayout::paintRectPixels(
int resolution)
const
930 return d->m_mode == FullPageMode ? d->fullRectPixels(resolution)
931 : d->fullRectPixels(resolution) - d->marginsPixels(resolution);
934#ifndef QT_NO_DEBUG_STREAM
937 QDebugStateSaver saver(dbg);
940 dbg <<
"QPageLayout(";
941 if (layout.isValid()) {
942 const QMarginsF margins = layout.margins();
943 dbg <<
'"' << layout.pageSize().name() <<
"\", "
944 << (layout.orientation() == QPageLayout::Portrait ?
"Portrait" :
"Landscape")
945 <<
", l:" << margins.left() <<
" r:" << margins.right() <<
" t:"
946 << margins.top() <<
" b:" << margins.bottom() <<
' ';
947 switch (layout.units()) {
948 case QPageLayout::Millimeter:
951 case QPageLayout::Point:
954 case QPageLayout::Inch:
957 case QPageLayout::Pica:
960 case QPageLayout::Didot:
963 case QPageLayout::Cicero:
bool isEquivalentTo(const QPageLayoutPrivate &other) const
bool operator==(const QPageLayoutPrivate &other) const
void setDefaultMargins(const QMarginsF &minMargins)
QMargins marginsPixels(int resolution) const
QRect fullRectPixels(int resolution) const
QRectF fullRect(QPageLayout::Unit units) const
QRect fullRectPoints() const
QMarginsF margins(QPageLayout::Unit units) const
QMarginsF marginsPoints() const
QPageLayoutPrivate(const QPageSize &pageSize, QPageLayout::Orientation orientation, const QMarginsF &margins, QPageLayout::Unit units, const QMarginsF &minMargins)
QMarginsF clampMargins(const QMarginsF &margins) const
Combined button and popup list for selecting options.
QDebug operator<<(QDebug dbg, const QFileInfo &fi)