From 50ec06da2c8a1c680d48b84f8c1267fe78a86b6a Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Thu, 25 Oct 2012 06:43:01 +0200 Subject: Only use the user set page margins for custom paper When the QPrinter is initalized then it will set up page margins based on the default paper size. If the paper size is changed to be a custom one then it should disregard the margins for the default paper size. If the page margins are set explicitly beforehand then it will use these page margins. Change-Id: Ic535c3a80b8b217dbd5eb5f4fb2cbc0ab1354563 Reviewed-by: Titta Heikkala Reviewed-by: Friedemann Kleint Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/plugins/platforms/cocoa/qprintengine_mac.mm | 4 +- src/printsupport/kernel/qprintengine_pdf.cpp | 9 +++- src/printsupport/kernel/qprintengine_pdf_p.h | 2 +- src/printsupport/kernel/qprintengine_win.cpp | 16 +++--- .../printsupport/kernel/qprinter/tst_qprinter.cpp | 59 ++++++++++++++++++++++ 5 files changed, 80 insertions(+), 10 deletions(-) diff --git a/src/plugins/platforms/cocoa/qprintengine_mac.mm b/src/plugins/platforms/cocoa/qprintengine_mac.mm index f2c567f0eb..94c89ad8db 100644 --- a/src/plugins/platforms/cocoa/qprintengine_mac.mm +++ b/src/plugins/platforms/cocoa/qprintengine_mac.mm @@ -795,13 +795,15 @@ QVariant QMacPrintEngine::property(PrintEnginePropertyKey key) const if (d->hasCustomPageMargins) { margins << d->leftMargin << d->topMargin << d->rightMargin << d->bottomMargin; - } else { + } else if (!d->hasCustomPaperSize) { PMPaperMargins paperMargins; PMPaper paper; PMGetPageFormatPaper(d->format(), &paper); PMPaperGetMargins(paper, &paperMargins); margins << paperMargins.left << paperMargins.top << paperMargins.right << paperMargins.bottom; + } else { + margins << 0 << 0 << 0 << 0; } ret = margins; break; diff --git a/src/printsupport/kernel/qprintengine_pdf.cpp b/src/printsupport/kernel/qprintengine_pdf.cpp index 3e343176ba..c4bcb697f5 100644 --- a/src/printsupport/kernel/qprintengine_pdf.cpp +++ b/src/printsupport/kernel/qprintengine_pdf.cpp @@ -213,6 +213,7 @@ void QPdfPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va d->topMargin = margins.at(1).toReal(); d->rightMargin = margins.at(2).toReal(); d->bottomMargin = margins.at(3).toReal(); + d->pageMarginsSet = true; break; } default: @@ -298,8 +299,11 @@ QVariant QPdfPrintEngine::property(PrintEnginePropertyKey key) const case PPK_PageMargins: { QList margins; - margins << d->leftMargin << d->topMargin - << d->rightMargin << d->bottomMargin; + if (d->printerPaperSize == QPrinter::Custom && !d->pageMarginsSet) + margins << 0 << 0 << 0 << 0; + else + margins << d->leftMargin << d->topMargin + << d->rightMargin << d->bottomMargin; ret = margins; break; } @@ -353,6 +357,7 @@ QPdfPrintEnginePrivate::QPdfPrintEnginePrivate(QPrinter::PrinterMode m) pageOrder(QPrinter::FirstPageFirst), paperSource(QPrinter::Auto), printerPaperSize(QPrinter::A4), + pageMarginsSet(false), fd(-1) { resolution = 72; diff --git a/src/printsupport/kernel/qprintengine_pdf_p.h b/src/printsupport/kernel/qprintengine_pdf_p.h index 36df233f72..2d70c4619e 100644 --- a/src/printsupport/kernel/qprintengine_pdf_p.h +++ b/src/printsupport/kernel/qprintengine_pdf_p.h @@ -151,7 +151,7 @@ private: QPrinter::PaperSize printerPaperSize; QSizeF customPaperSize; // in postscript points - + bool pageMarginsSet; int fd; }; diff --git a/src/printsupport/kernel/qprintengine_win.cpp b/src/printsupport/kernel/qprintengine_win.cpp index 28e0363d6e..200b5fd102 100644 --- a/src/printsupport/kernel/qprintengine_win.cpp +++ b/src/printsupport/kernel/qprintengine_win.cpp @@ -1540,13 +1540,17 @@ QVariant QWin32PrintEngine::property(PrintEnginePropertyKey key) const case PPK_PageMargins: { QList margins; - QRect pageMargins(d->getPageMargins()); + if (d->has_custom_paper_size && !d->pageMarginsSet) { + margins << 0 << 0 << 0 << 0; + } else { + QRect pageMargins(d->getPageMargins()); - // specified in 1/100 mm - margins << (mmToInches(pageMargins.left()/100.0) * 72) - << (mmToInches(pageMargins.top()/100.0) * 72) - << (mmToInches(pageMargins.width()/100.0) * 72) - << (mmToInches(pageMargins.height()/100.0) * 72); + // specified in 1/100 mm + margins << (mmToInches(pageMargins.left()/100.0) * 72) + << (mmToInches(pageMargins.top()/100.0) * 72) + << (mmToInches(pageMargins.width()/100.0) * 72) + << (mmToInches(pageMargins.height()/100.0) * 72); + } value = margins; break; } diff --git a/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp b/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp index 0f7c7f7a84..b01f311f4f 100644 --- a/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp +++ b/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp @@ -109,6 +109,8 @@ private slots: void valuePreservation(); void errorReporting(); void testCustomPageSizes(); + void customPaperSizeAndMargins_data(); + void customPaperSizeAndMargins(); #if !defined(QT_NO_COMPLETER) && !defined(QT_NO_FILEDIALOG) void printDialogCompleter(); #endif @@ -933,6 +935,63 @@ void tst_QPrinter::testCustomPageSizes() QCOMPARE(paperSize, customSize); } +void tst_QPrinter::customPaperSizeAndMargins_data() +{ + QTest::addColumn("pdf"); + QTest::addColumn("before"); + QTest::addColumn("left"); + QTest::addColumn("top"); + QTest::addColumn("right"); + QTest::addColumn("bottom"); + + QTest::newRow("beforeNoPDF") << false << true << qreal(2) << qreal(2) << qreal(2) << qreal(2); + QTest::newRow("beforePDF") << true << true << qreal(2) << qreal(2) << qreal(2) << qreal(2); + QTest::newRow("afterNoPDF") << false << false << qreal(2) << qreal(2) << qreal(2) << qreal(2); + QTest::newRow("afterAfterPDF") << true << false << qreal(2) << qreal(2) << qreal(2) << qreal(2); +} + +void tst_QPrinter::customPaperSizeAndMargins() +{ + QFETCH(bool, pdf); + QFETCH(bool, before); + QFETCH(qreal, left); + QFETCH(qreal, top); + QFETCH(qreal, right); + QFETCH(qreal, bottom); + + qreal tolerance = 0.05; + qreal getLeft = 0; + qreal getRight = 0; + qreal getTop = 0; + qreal getBottom = 0; + QSizeF customSize(8.5, 11.0); + + QPrinter p; + if (pdf) + p.setOutputFormat(QPrinter::PdfFormat); + if (before) + p.setPageMargins(left, top, right, bottom, QPrinter::Millimeter); + p.setPaperSize(customSize, QPrinter::Millimeter); + p.getPageMargins(&getLeft, &getTop, &getRight, &getBottom, QPrinter::Millimeter); + if (before) { + QVERIFY(fabs(left - getLeft) < tolerance); + QVERIFY(fabs(left - getTop) < tolerance); + QVERIFY(fabs(left - getRight) < tolerance); + QVERIFY(fabs(left - getBottom) < tolerance); + } else { + QVERIFY(getLeft == 0); + QVERIFY(getTop == 0); + QVERIFY(getRight == 0); + QVERIFY(getBottom == 0); + p.setPageMargins(left, top, right, bottom, QPrinter::Millimeter); + p.getPageMargins(&getLeft, &getTop, &getRight, &getBottom, QPrinter::Millimeter); + QVERIFY(fabs(left - getLeft) < tolerance); + QVERIFY(fabs(left - getTop) < tolerance); + QVERIFY(fabs(left - getRight) < tolerance); + QVERIFY(fabs(left - getBottom) < tolerance); + } +} + #if !defined(QT_NO_COMPLETER) && !defined(QT_NO_FILEDIALOG) void tst_QPrinter::printDialogCompleter() { -- cgit v1.2.3