diff options
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 " |