summaryrefslogtreecommitdiffstats
path: root/src/printsupport/dialogs/qpagesetupdialog_unix.cpp
diff options
context:
space:
mode:
authorMartin Klapetek <mklapetek@kde.org>2013-09-18 16:22:48 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-20 00:50:04 +0200
commit00e50fb97c3d9b91193fef50d63b430e4648ac52 (patch)
tree5e4753cf8d8b7d3c2f5f54600f5d1ce6013f511a /src/printsupport/dialogs/qpagesetupdialog_unix.cpp
parent438912f27350cfe5f63f8abc68f4fc99614ee7c5 (diff)
Expose more CUPS options via the 'Properties' dialog
On systems with CUPS support users can now choose how many pages from a document are to be printed on paper. This can vary from 1 page per document to 16 pages per document. The page preview changes upon the users selection. Also included in the patch is an option to choose the flow for text. Users can now print documents in the "Right to Left" order or "Bottom to Top", including many other options. [ChangeLog][QtPrintSupport][QPrintDialog] Added support for setting CUPS Pages Per Sheet and Pages Per Sheet Layout options Change-Id: I4e60a4523c6e06d4c15fe9ee9590248fa7ae2038 Reviewed-by: John Layt <jlayt@kde.org>
Diffstat (limited to 'src/printsupport/dialogs/qpagesetupdialog_unix.cpp')
-rw-r--r--src/printsupport/dialogs/qpagesetupdialog_unix.cpp95
1 files changed, 93 insertions, 2 deletions
diff --git a/src/printsupport/dialogs/qpagesetupdialog_unix.cpp b/src/printsupport/dialogs/qpagesetupdialog_unix.cpp
index 1add522cb8..cdb80f96a8 100644
--- a/src/printsupport/dialogs/qpagesetupdialog_unix.cpp
+++ b/src/printsupport/dialogs/qpagesetupdialog_unix.cpp
@@ -158,6 +158,13 @@ public:
update();
}
+ void setPagePreviewLayout(int columns, int rows)
+ {
+ m_pagePreviewColumns = columns;
+ m_pagePreviewRows = rows;
+ update();
+ }
+
protected:
void paintEvent(QPaintEvent *)
{
@@ -202,13 +209,27 @@ protected:
QString text(QLatin1String("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi."));
for (int i=0; i<3; ++i)
text += text;
- p.drawText(marginRect, Qt::TextWordWrap|Qt::AlignVCenter, text);
+
+ const int spacing = pageRect.width() * 0.1;
+ const int textWidth = (marginRect.width() - (spacing * (m_pagePreviewColumns-1))) / m_pagePreviewColumns;
+ const int textHeight = (marginRect.height() - (spacing * (m_pagePreviewRows-1))) / m_pagePreviewRows;
+
+ for (int x = 0 ; x < m_pagePreviewColumns; ++x) {
+ for (int y = 0 ; y < m_pagePreviewRows; ++y) {
+ QRect textRect(marginRect.left() + x * (textWidth + spacing),
+ marginRect.top() + y * (textHeight + spacing),
+ textWidth, textHeight);
+ p.drawText(textRect, Qt::TextWordWrap|Qt::AlignVCenter, text);
+ }
+ }
}
}
private:
// all these are in points
qreal m_left, m_top, m_right, m_bottom;
+ // specify width / height of one page in preview
+ int m_pagePreviewColumns, m_pagePreviewRows;
QSizeF m_size;
};
@@ -272,6 +293,8 @@ QPageSetupWidget::QPageSetupWidget(QWidget *parent)
QVBoxLayout *lay = new QVBoxLayout(widget.preview);
widget.preview->setLayout(lay);
m_pagePreview = new QPagePreview(widget.preview);
+ m_pagePreview->setPagePreviewLayout(1, 1);
+
lay->addWidget(m_pagePreview);
setAttribute(Qt::WA_WState_Polished, false);
@@ -288,7 +311,7 @@ QPageSetupWidget::QPageSetupWidget(QWidget *parent)
widget.reversePortrait->setVisible(false);
populatePaperSizes(widget.paperSize);
-
+ initPagesPerSheet();
QStringList units;
units << tr("Centimeters (cm)") << tr("Millimeters (mm)") << tr("Inches (in)") << tr("Points (pt)");
widget.unit->addItems(units);
@@ -306,6 +329,8 @@ QPageSetupWidget::QPageSetupWidget(QWidget *parent)
connect(widget.portrait, SIGNAL(clicked()), this, SLOT(_q_pageOrientationChanged()));
connect(widget.landscape, SIGNAL(clicked()), this, SLOT(_q_pageOrientationChanged()));
+ connect(widget.pagesPerSheetCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(_q_pagesPerSheetChanged()));
+
}
void QPageSetupWidget::setPrinter(QPrinter *printer)
@@ -366,6 +391,14 @@ void QPageSetupWidget::setupPrinter() const
#endif
m_printer->setPageMargins(m_leftMargin, m_topMargin, m_rightMargin, m_bottomMargin, QPrinter::Point);
+#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
+ QCUPSSupport::PagesPerSheet pagesPerSheet = widget.pagesPerSheetCombo->currentData()
+ .value<QCUPSSupport::PagesPerSheet>();
+ QCUPSSupport::PagesPerSheetLayout pagesPerSheetLayout = widget.pagesPerSheetLayoutCombo->currentData()
+ .value<QCUPSSupport::PagesPerSheetLayout>();
+
+ QCUPSSupport::setPagesPerSheetLayout(m_printer, pagesPerSheet, pagesPerSheetLayout);
+#endif
}
void QPageSetupWidget::selectPrinter()
@@ -500,6 +533,36 @@ void QPageSetupWidget::_q_pageOrientationChanged()
_q_paperSizeChanged();
}
+void QPageSetupWidget::_q_pagesPerSheetChanged()
+{
+#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
+ QCUPSSupport::PagesPerSheet pagesPerSheet = widget.pagesPerSheetCombo->currentData()
+ .value<QCUPSSupport::PagesPerSheet>();
+
+ switch (pagesPerSheet) {
+ case QCUPSSupport::TwoPagesPerSheet:
+ m_pagePreview->setPagePreviewLayout(1, 2);
+ break;
+ case QCUPSSupport::FourPagesPerSheet:
+ m_pagePreview->setPagePreviewLayout(2, 2);
+ break;
+ case QCUPSSupport::SixPagesPerSheet:
+ m_pagePreview->setPagePreviewLayout(3, 2);
+ break;
+ case QCUPSSupport::NinePagesPerSheet:
+ m_pagePreview->setPagePreviewLayout(3, 3);
+ break;
+ case QCUPSSupport::SixteenPagesPerSheet:
+ m_pagePreview->setPagePreviewLayout(4, 4);
+ break;
+ case QCUPSSupport::OnePagePerSheet:
+ default:
+ m_pagePreview->setPagePreviewLayout(1, 1);
+ break;
+ }
+#endif
+}
+
extern double qt_multiplierForUnit(QPrinter::Unit unit, int resolution);
void QPageSetupWidget::unitChanged(int item)
@@ -598,6 +661,34 @@ int QPageSetupDialog::exec()
return ret;
}
+void QPageSetupWidget::initPagesPerSheet()
+{
+#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
+ widget.pagesPerSheetLayoutCombo->addItem(QPrintDialog::tr("Left to Right, Top to Bottom"), QVariant::fromValue(QCUPSSupport::LeftToRightTopToBottom));
+ widget.pagesPerSheetLayoutCombo->addItem(QPrintDialog::tr("Left to Right, Bottom to Top"), QVariant::fromValue(QCUPSSupport::LeftToRightBottomToTop));
+ widget.pagesPerSheetLayoutCombo->addItem(QPrintDialog::tr("Right to Left, Bottom to Top"), QVariant::fromValue(QCUPSSupport::RightToLeftBottomToTop));
+ widget.pagesPerSheetLayoutCombo->addItem(QPrintDialog::tr("Right to Left, Top to Bottom"), QVariant::fromValue(QCUPSSupport::RightToLeftTopToBottom));
+ widget.pagesPerSheetLayoutCombo->addItem(QPrintDialog::tr("Bottom to Top, Left to Right"), QVariant::fromValue(QCUPSSupport::BottomToTopLeftToRight));
+ widget.pagesPerSheetLayoutCombo->addItem(QPrintDialog::tr("Bottom to Top, Right to Left"), QVariant::fromValue(QCUPSSupport::BottomToTopRightToLeft));
+ widget.pagesPerSheetLayoutCombo->addItem(QPrintDialog::tr("Top to Bottom, Left to Right"), QVariant::fromValue(QCUPSSupport::TopToBottomLeftToRight));
+ widget.pagesPerSheetLayoutCombo->addItem(QPrintDialog::tr("Top to Bottom, Right to Left"), QVariant::fromValue(QCUPSSupport::TopToBottomRightToLeft));
+
+ widget.pagesPerSheetCombo->addItem(QPrintDialog::tr("1 (1x1)"), QVariant::fromValue(QCUPSSupport::OnePagePerSheet));
+ widget.pagesPerSheetCombo->addItem(QPrintDialog::tr("2 (2x1)"), QVariant::fromValue(QCUPSSupport::TwoPagesPerSheet));
+ widget.pagesPerSheetCombo->addItem(QPrintDialog::tr("4 (2x2)"), QVariant::fromValue(QCUPSSupport::FourPagesPerSheet));
+ widget.pagesPerSheetCombo->addItem(QPrintDialog::tr("6 (2x3)"), QVariant::fromValue(QCUPSSupport::SixPagesPerSheet));
+ widget.pagesPerSheetCombo->addItem(QPrintDialog::tr("9 (3x3)"), QVariant::fromValue(QCUPSSupport::NinePagesPerSheet));
+ widget.pagesPerSheetCombo->addItem(QPrintDialog::tr("16 (4x4)"), QVariant::fromValue(QCUPSSupport::SixteenPagesPerSheet));
+
+ // Set the combo to "1 (1x1)" -- QCUPSSupport::OnePagePerSheet
+ widget.pagesPerSheetCombo->setCurrentIndex(0);
+ // Set the layout combo to QCUPSSupport::LeftToRightTopToBottom
+ widget.pagesPerSheetLayoutCombo->setCurrentIndex(0);
+#else
+ // Disable if CUPS wasn't found
+ widget.pagesPerSheetButtonGroup->hide();
+#endif
+}
QT_END_NAMESPACE