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 <jlayt@kde.org>
bb10
Martin Klapetek 2013-09-19 21:58:30 +02:00 committed by The Qt Project
parent c5b58ecd2e
commit 99f9bf9af6
3 changed files with 45 additions and 12 deletions

View File

@ -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<QCUPSSupport::PageSet>();
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<QCUPSSupport::PageSet>();
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

View File

@ -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())

View File

@ -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);