Only use the user set page margins for custom paper
authorAndy Shaw <andy.shaw@digia.com>
Thu, 25 Oct 2012 04:43:01 +0000 (06:43 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Tue, 30 Oct 2012 11:53:46 +0000 (12:53 +0100)
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 <titta.heikkala@digia.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
src/plugins/platforms/cocoa/qprintengine_mac.mm
src/printsupport/kernel/qprintengine_pdf.cpp
src/printsupport/kernel/qprintengine_pdf_p.h
src/printsupport/kernel/qprintengine_win.cpp
tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp

index f2c567f..94c89ad 100644 (file)
@@ -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;
index 3e34317..c4bcb69 100644 (file)
@@ -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<QVariant> 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;
index 36df233..2d70c46 100644 (file)
@@ -151,7 +151,7 @@ private:
 
     QPrinter::PaperSize printerPaperSize;
     QSizeF customPaperSize; // in postscript points
-
+    bool pageMarginsSet;
     int fd;
 };
 
index 28e0363..200b5fd 100644 (file)
@@ -1540,13 +1540,17 @@ QVariant QWin32PrintEngine::property(PrintEnginePropertyKey key) const
     case PPK_PageMargins:
     {
         QList<QVariant> 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;
     }
index 0f7c7f7..b01f311 100644 (file)
@@ -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<bool>("pdf");
+    QTest::addColumn<bool>("before");
+    QTest::addColumn<qreal>("left");
+    QTest::addColumn<qreal>("top");
+    QTest::addColumn<qreal>("right");
+    QTest::addColumn<qreal>("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()
 {