From 99f9bf9af68530302fcb5a920f477a224adc0e09 Mon Sep 17 00:00:00 2001 From: Martin Klapetek Date: Thu, 19 Sep 2013 21:58:30 +0200 Subject: [PATCH] Offer Page Range option for apps that can't do it themselves Some apps may not support printing only a particular page range, but with CUPS we can do "server-side print range", ie. we can select the page range for the application. If CUPS is available, the Page Range widget is now displayed if app advertises no such capability and page range is selected on the server instead. [ChangeLog][QtPrintSupport][QPrintDialog] Added CUPS server-side print range support for apps that can't support print range option themselves Change-Id: Ia7784065ba5a8b53bb05ae46e982c718ef672fa5 Reviewed-by: John Layt --- .../dialogs/qprintdialog_unix.cpp | 49 ++++++++++++++----- src/printsupport/kernel/qcups.cpp | 7 +++ src/printsupport/kernel/qcups_p.h | 1 + 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/src/printsupport/dialogs/qprintdialog_unix.cpp b/src/printsupport/dialogs/qprintdialog_unix.cpp index 5e9e6fcc99..0214c97e24 100644 --- a/src/printsupport/dialogs/qprintdialog_unix.cpp +++ b/src/printsupport/dialogs/qprintdialog_unix.cpp @@ -435,23 +435,41 @@ void QPrintDialogPrivate::setupPrinter() p->setPrintRange(QPrinter::CurrentPage); p->setFromTo(0,0); } else if (options.printRange->isChecked()) { - p->setPrintRange(QPrinter::PageRange); - p->setFromTo(options.from->value(), qMax(options.from->value(), options.to->value())); + if (q->isOptionEnabled(QPrintDialog::PrintPageRange)) { + p->setPrintRange(QPrinter::PageRange); + p->setFromTo(options.from->value(), qMax(options.from->value(), options.to->value())); + } else { + // This case happens when CUPS server-side page range is enabled + // Setting the range to the printer occurs below + p->setPrintRange(QPrinter::AllPages); + p->setFromTo(0,0); + } } #if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) // page set - if (QCUPSSupport::isAvailable() && (p->printRange() == QPrinter::AllPages || p->printRange() == QPrinter::PageRange)) { - //If the application is selecting pages and the first page number is even then need to adjust the odd-even accordingly - QCUPSSupport::PageSet pageSet = options.pageSetCombo->itemData(options.pageSetCombo->currentIndex()).value(); - if (p->printRange() == QPrinter::PageRange && (q->fromPage() % 2 == 0)) { - if (pageSet == QCUPSSupport::OddPages) - QCUPSSupport::setPageSet(p, QCUPSSupport::EvenPages); - else if (pageSet == QCUPSSupport::EvenPages) - QCUPSSupport::setPageSet(p, QCUPSSupport::OddPages); - } else if (pageSet != QCUPSSupport::AllPages) { - QCUPSSupport::setPageSet(p, pageSet); + if (QCUPSSupport::isAvailable()) { + if (p->printRange() == QPrinter::AllPages || p->printRange() == QPrinter::PageRange) { + //If the application is selecting pages and the first page number is even then need to adjust the odd-even accordingly + QCUPSSupport::PageSet pageSet = options.pageSetCombo->itemData(options.pageSetCombo->currentIndex()).value(); + if (q->isOptionEnabled(QPrintDialog::PrintPageRange) + && p->printRange() == QPrinter::PageRange + && (q->fromPage() % 2 == 0)) { + + if (pageSet == QCUPSSupport::OddPages) + QCUPSSupport::setPageSet(p, QCUPSSupport::EvenPages); + else if (pageSet == QCUPSSupport::EvenPages) + QCUPSSupport::setPageSet(p, QCUPSSupport::OddPages); + } else if (pageSet != QCUPSSupport::AllPages) { + QCUPSSupport::setPageSet(p, pageSet); + } + } + + // server-side page range, since we set the page range on the printer to 0-0/AllPages above, + // we need to take the values directly from the widget as q->fromPage() will return 0 + if (!q->isOptionEnabled(QPrintDialog::PrintPageRange) && options.printRange->isChecked()) + QCUPSSupport::setPageRange(p, options.from->value(), qMax(options.from->value(), options.to->value())); } #endif @@ -532,6 +550,13 @@ void QPrintDialogPrivate::updateWidgets() options.pageSetCombo->setVisible(true); options.pageSetLabel->setVisible(true); } + + if (!q->isOptionEnabled(QPrintDialog::PrintPageRange)) { + // If we can do CUPS server side pages selection, + // display the page range widgets + options.gbPrintRange->setVisible(true); + options.printRange->setEnabled(true); + } } #endif diff --git a/src/printsupport/kernel/qcups.cpp b/src/printsupport/kernel/qcups.cpp index 7c426d4d36..c724bde4fa 100644 --- a/src/printsupport/kernel/qcups.cpp +++ b/src/printsupport/kernel/qcups.cpp @@ -522,6 +522,13 @@ void QCUPSSupport::setPagesPerSheetLayout(QPrinter *printer, const PagesPerShee setCupsOptions(printer, cupsOptions); } +void QCUPSSupport::setPageRange(QPrinter *printer, int pageFrom, int pageTo) +{ + QStringList cupsOptions = cupsOptionsList(printer); + setCupsOption(cupsOptions, QStringLiteral("page-ranges"), QString("%1-%2").arg(pageFrom).arg(pageTo)); + setCupsOptions(printer, cupsOptions); +} + bool QCUPSSupport::printerHasPPD(const char *printerName) { if (!isAvailable()) diff --git a/src/printsupport/kernel/qcups_p.h b/src/printsupport/kernel/qcups_p.h index f3e71df3e3..726bc7eba6 100644 --- a/src/printsupport/kernel/qcups_p.h +++ b/src/printsupport/kernel/qcups_p.h @@ -175,6 +175,7 @@ public: static void setPageSet(QPrinter *printer, const PageSet pageSet); static void setPagesPerSheetLayout(QPrinter *printer, const PagesPerSheet pagesPerSheet, const PagesPerSheetLayout pagesPerSheetLayout); + static void setPageRange(QPrinter *printer, int pageFrom, int pageTo); static bool printerHasPPD(const char *printerName);