diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-11-02 21:39:34 +0100 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-11-08 11:49:54 +0100 |
commit | b14b1c99f8d122c7988cd6e59b0f3fef15923da4 (patch) | |
tree | c876d2428f7be32a73a1d066fa2d703b59708a1e /src/gui/painting/qpageranges.h | |
parent | 8bf36025f5602e3067448941ee4d0ccca3928a40 (diff) |
Rename QRangeCollection to QPageRanges, make it a proper value type
The type is specific about printing, so give it a name in line with
QPageLayout and QPageSize.
As per API review comment, it's not clear why this type should not be a
regular, copyable and movable value type. It stores a list of intervals.
Give it value-type semantics, as an implicitly shared class.
Convert the parse method into a static factory function.
Add a Range type and use it instead of the semantic-free QPair.
Move QPrinter getter into QPagedPainteDevice, make it return a copy
rather than a pointer, and add a setter.
Extend test case to cover all members and more merge cases. Fix bugs
found that way.
Fixes: QTBUG-88113
Change-Id: If17ea4d410d49f16b097e88b7979db5d72add820
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/gui/painting/qpageranges.h')
-rw-r--r-- | src/gui/painting/qpageranges.h | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/gui/painting/qpageranges.h b/src/gui/painting/qpageranges.h new file mode 100644 index 0000000000..481fee109b --- /dev/null +++ b/src/gui/painting/qpageranges.h @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPAGERANGES_H +#define QPAGERANGES_H + +#include <QtGui/qtguiglobal.h> +#include <QtCore/qstring.h> +#include <QtCore/qlist.h> +#include <QtCore/qshareddata.h> +#include <QtCore/qmetatype.h> + +QT_BEGIN_NAMESPACE + +class QDebug; +class QPageRangesPrivate; +QT_DECLARE_QESDP_SPECIALIZATION_DTOR_WITH_EXPORT(QPageRangesPrivate, Q_GUI_EXPORT) + +class Q_GUI_EXPORT QPageRanges +{ +public: + QPageRanges(); + ~QPageRanges(); + + QPageRanges(const QPageRanges &other) noexcept; + QPageRanges &operator=(const QPageRanges &other) noexcept; + + QPageRanges(QPageRanges &&other) noexcept = default; + QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QPageRanges) + void swap(QPageRanges &other) noexcept + { qSwap(d, other.d); } + + friend bool operator==(const QPageRanges &lhs, const QPageRanges &rhs) noexcept + { return lhs.isEqual(rhs); } + friend bool operator!=(const QPageRanges &lhs, const QPageRanges &rhs) noexcept + { return !lhs.isEqual(rhs); } + + struct Range { + int from = -1; + int to = -1; + bool contains(int pageNumber) const noexcept + { return from <= pageNumber && to >= pageNumber; } + friend bool operator==(Range lhs, Range rhs) noexcept + { return lhs.from == rhs.from && lhs.to == rhs.to; } + friend bool operator!=(Range lhs, Range rhs) noexcept + { return !(lhs == rhs); } + friend bool operator<(Range lhs, Range rhs) noexcept + { return lhs.from < rhs.from || (!(rhs.from < lhs.from) && lhs.to < rhs.to); } + }; + + void addPage(int pageNumber); + void addRange(int from, int to); + QList<Range> toRangeList() const; + void clear(); + + QString toString() const; + static QPageRanges fromString(const QString &ranges); + + bool contains(int pageNumber) const; + bool isEmpty() const; + int firstPage() const; + int lastPage() const; + +private: + bool isEqual(const QPageRanges &other) const noexcept; + void detach(); + + QExplicitlySharedDataPointer<QPageRangesPrivate> d; +}; + +#ifndef QT_NO_DEBUG_STREAM +Q_GUI_EXPORT QDebug operator<<(QDebug dbg, const QPageRanges &pageRanges); +#endif + +Q_DECLARE_SHARED(QPageRanges) +Q_DECLARE_TYPEINFO(QPageRanges::Range, Q_MOVABLE_TYPE); + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(QPageRanges) + +#endif // QPAGERANGES_H |