summaryrefslogtreecommitdiffstats
path: root/src/printsupport
diff options
context:
space:
mode:
Diffstat (limited to 'src/printsupport')
-rw-r--r--src/printsupport/dialogs/qprintdialog_unix.cpp90
-rw-r--r--src/printsupport/kernel/qprinter.cpp31
-rw-r--r--src/printsupport/kernel/qprinter.h3
3 files changed, 28 insertions, 96 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 "
diff --git a/src/printsupport/kernel/qprinter.cpp b/src/printsupport/kernel/qprinter.cpp
index fbf5e5c2ba..25855d6da7 100644
--- a/src/printsupport/kernel/qprinter.cpp
+++ b/src/printsupport/kernel/qprinter.cpp
@@ -49,6 +49,7 @@
#include "qlist.h"
#include <qcoreapplication.h>
#include <qfileinfo.h>
+#include <QtGui/qrangecollection.h>
#include <private/qpagedpaintdevice_p.h>
@@ -1981,12 +1982,12 @@ void QPrinter::setPrinterSelectionOption(const QString &option)
\note If fromPage() and toPage() both return 0, this indicates that
\e{the whole document will be printed}.
- \sa setFromTo(), toPage()
+ \sa setFromTo(), toPage(), rangeCollection()
*/
int QPrinter::fromPage() const
{
- return d->fromPage;
+ return d->rangeCollection->firstPage();
}
/*!
@@ -2005,12 +2006,12 @@ int QPrinter::fromPage() const
The programmer is responsible for reading this setting and
printing accordingly.
- \sa setFromTo(), fromPage()
+ \sa setFromTo(), fromPage(), rangeCollection()
*/
int QPrinter::toPage() const
{
- return d->toPage;
+ return d->rangeCollection->lastPage();
}
/*!
@@ -2027,17 +2028,25 @@ int QPrinter::toPage() const
This function is mostly used to set a default value that the user can
override in the print dialog when you call setup().
- \sa fromPage(), toPage()
+ \sa fromPage(), toPage(), rangeCollection()
*/
void QPrinter::setFromTo(int from, int to)
{
- if (from > to) {
- qWarning("QPrinter::setFromTo: 'from' must be less than or equal to 'to'");
- from = to;
- }
- d->fromPage = from;
- d->toPage = to;
+ d->rangeCollection->clear();
+ d->rangeCollection->addRange(from, to);
+}
+
+/*!
+ \since 6.0
+
+ Returns the range collection associated with this device.
+
+ \sa QRangeCollection, fromPage(), toPage()
+*/
+QRangeCollection *QPrinter::rangeCollection()
+{
+ return d->rangeCollection;
}
/*!
diff --git a/src/printsupport/kernel/qprinter.h b/src/printsupport/kernel/qprinter.h
index 28dca78a63..e606ceba47 100644
--- a/src/printsupport/kernel/qprinter.h
+++ b/src/printsupport/kernel/qprinter.h
@@ -56,6 +56,7 @@ QT_BEGIN_NAMESPACE
#endif
class QPrinterPrivate;
+class QRangeCollection;
class QPaintEngine;
class QPrintEngine;
class QPrinterInfo;
@@ -249,6 +250,8 @@ public:
int fromPage() const;
int toPage() const;
+ QRangeCollection *rangeCollection();
+
void setPrintRange(PrintRange range);
PrintRange printRange() const;