diff options
author | Szabolcs David <davidsz@inf.u-szeged.hu> | 2019-04-08 13:25:54 +0200 |
---|---|---|
committer | Szabolcs David <davidsz@inf.u-szeged.hu> | 2020-04-09 16:45:32 +0200 |
commit | 926a0886d1961a3f384d3e6c36919e6dd8055dce (patch) | |
tree | 8512058bcec7250a4828f9244b4b431c02eecfa7 /src/printsupport/dialogs/qprintdialog_unix.cpp | |
parent | 4c66b75c894cf2cc7ec15896729d0f93de92f310 (diff) |
Support multiple page ranges in QPrinter
Add a new QRangeCollection type to store and manage
multiple page ranges. This moves out the parser and validator
logic from the platform dependent (UNIX) dialog and makes it
publicly available from QPrinter.
This improves the usability of QPrinter in those applications
which doesn't use print dialog to configure printer.
(e.g.: QTextDocument, QWebEnginePage)
Change-Id: I0be5a8a64781c411f83b96a24f216605a84958e5
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
Diffstat (limited to 'src/printsupport/dialogs/qprintdialog_unix.cpp')
-rw-r--r-- | src/printsupport/dialogs/qprintdialog_unix.cpp | 90 |
1 files changed, 5 insertions, 85 deletions
diff --git a/src/printsupport/dialogs/qprintdialog_unix.cpp b/src/printsupport/dialogs/qprintdialog_unix.cpp index a59d8bbb4a..cc6694d471 100644 --- a/src/printsupport/dialogs/qprintdialog_unix.cpp +++ b/src/printsupport/dialogs/qprintdialog_unix.cpp @@ -59,6 +59,7 @@ #include <QtWidgets/qstyleditemdelegate.h> #include <QtWidgets/qformlayout.h> #include <QtPrintSupport/qprinter.h> +#include <QtGui/qrangecollection.h> #include <qpa/qplatformprintplugin.h> #include <qpa/qplatformprintersupport.h> @@ -745,85 +746,6 @@ void QPrintDialogPrivate::selectPrinter(const QPrinter::OutputFormat outputForma } #if QT_CONFIG(cups) -static std::vector<std::pair<int, int>> pageRangesFromString(const QString &pagesString) noexcept -{ - std::vector<std::pair<int, int>> result; - const QStringList items = pagesString.split(','); - for (const QString &item : items) { - if (item.isEmpty()) - return {}; - - if (item.contains(QLatin1Char('-'))) { - const QStringList rangeItems = item.split('-'); - if (rangeItems.count() != 2) - return {}; - - bool ok; - const int number1 = rangeItems[0].toInt(&ok); - if (!ok) - return {}; - - const int number2 = rangeItems[1].toInt(&ok); - if (!ok) - return {}; - - if (number1 < 1 || number2 < 1 || number2 < number1) - return {}; - - result.push_back(std::make_pair(number1, number2)); - - } else { - bool ok; - const int number = item.toInt(&ok); - if (!ok) - return {}; - - if (number < 1) - return {}; - - result.push_back(std::make_pair(number, number)); - } - } - - // check no range intersects with the next - std::sort(result.begin(), result.end(), - [](const std::pair<int, int> &it1, const std::pair<int, int> &it2) { return it1.first < it2.first; }); - int previousSecond = -1; - for (auto pair : result) { - if (pair.first <= previousSecond) - return {}; - - previousSecond = pair.second; - } - - return result; -} - -static QString stringFromPageRanges(const std::vector<std::pair<int, int>> &pageRanges) noexcept -{ - QString result; - - for (auto pair : pageRanges) { - if (!result.isEmpty()) - result += QLatin1Char(','); - - if (pair.first == pair.second) - result += QString::number(pair.first); - else - result += QStringLiteral("%1-%2").arg(pair.first).arg(pair.second); - } - - return result; -} - -static bool isValidPagesString(const QString &pagesString) noexcept -{ - if (pagesString.isEmpty()) - return false; - - auto pagesRanges = pageRangesFromString(pagesString); - return !pagesRanges.empty(); -} void QPrintDialogPrivate::updatePpdDuplexOption(QRadioButton *radio) { @@ -894,13 +816,11 @@ void QPrintDialogPrivate::setupPrinter() #if QT_CONFIG(cups) if (options.pagesRadioButton->isChecked()) { - auto pageRanges = pageRangesFromString(options.pagesLineEdit->text()); - - p->setPrintRange(QPrinter::AllPages); - p->setFromTo(0, 0); + p->setPrintRange(QPrinter::PageRange); + p->rangeCollection()->parse(options.pagesLineEdit->text()); // server-side page filtering - QCUPSSupport::setPageRange(p, stringFromPageRanges(pageRanges)); + QCUPSSupport::setPageRange(p, p->rangeCollection()->toString()); } // page set @@ -1100,7 +1020,7 @@ void QPrintDialog::accept() { Q_D(QPrintDialog); #if QT_CONFIG(cups) - if (d->options.pagesRadioButton->isChecked() && !isValidPagesString(d->options.pagesLineEdit->text())) { + if (d->options.pagesRadioButton->isChecked() && printer()->rangeCollection()->isEmpty()) { QMessageBox::critical(this, tr("Invalid Pages Definition"), tr("%1 does not follow the correct syntax. Please use ',' to separate " "ranges and pages, '-' to define ranges and make sure ranges do " |