diff options
author | Tobias Koenig <tobias.koenig@kdab.com> | 2017-02-21 15:21:08 +0100 |
---|---|---|
committer | Michal Klocek <michal.klocek@qt.io> | 2019-11-25 12:01:39 +0100 |
commit | b67822d16d219dbee9d0819cd3c4a8c18d7e0356 (patch) | |
tree | 067423ed828118e31a4fb6cd0a1966d919f0d63a /src | |
parent | 9bfe4bf9802281fabc5b9e607621ea4cb5e9bd39 (diff) |
Add QPdfPageNavigation class
The QPdfPageNavigation class encapsulates the logic of navigating
inside a QPdfDocument. It has the notion of a 'current' page and
provides slots to navigate to the previous/next page or jump
directly to a given page.
Additionally it provides properties to indicate whether there is
a previous or next page, relative to the current one.
Change-Id: I053f3c49ab4a70b2610b64d96d2c274c3d0f629b
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/pdf/pdf.pro | 4 | ||||
-rw-r--r-- | src/pdf/qpdfpagenavigation.cpp | 314 | ||||
-rw-r--r-- | src/pdf/qpdfpagenavigation.h | 92 |
3 files changed, 409 insertions, 1 deletions
diff --git a/src/pdf/pdf.pro b/src/pdf/pdf.pro index 606a2cb36..319e24464 100644 --- a/src/pdf/pdf.pro +++ b/src/pdf/pdf.pro @@ -23,7 +23,8 @@ msvc { SOURCES += \ jsbridge.cpp \ qpdfbookmarkmodel.cpp \ - qpdfdocument.cpp + qpdfdocument.cpp \ + qpdfpagenavigation.cpp HEADERS += \ qpdfbookmarkmodel.h \ @@ -31,4 +32,5 @@ HEADERS += \ qpdfdocument_p.h \ qpdfdocumentrenderoptions.h \ qpdfnamespace.h \ + qpdfpagenavigation.h \ qtpdfglobal.h diff --git a/src/pdf/qpdfpagenavigation.cpp b/src/pdf/qpdfpagenavigation.cpp new file mode 100644 index 000000000..8eff89b38 --- /dev/null +++ b/src/pdf/qpdfpagenavigation.cpp @@ -0,0 +1,314 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Tobias König <tobias.koenig@kdab.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPDF module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** 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 http://www.qt.io/terms-conditions. For further +** information use the contact form at http://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.LGPLv3 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.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 later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qpdfpagenavigation.h" + +#include "qpdfdocument.h" + +#include <private/qobject_p.h> + +#include <QPointer> + +QT_BEGIN_NAMESPACE + +class QPdfPageNavigationPrivate : public QObjectPrivate +{ +public: + QPdfPageNavigationPrivate() + : QObjectPrivate() + { + } + + void update() + { + Q_Q(QPdfPageNavigation); + + const bool documentAvailable = m_document && m_document->status() == QPdfDocument::Ready; + + if (documentAvailable) { + const int newPageCount = m_document->pageCount(); + if (m_pageCount != newPageCount) { + m_pageCount = newPageCount; + emit q->pageCountChanged(m_pageCount); + } + } else { + if (m_pageCount != 0) { + m_pageCount = 0; + emit q->pageCountChanged(m_pageCount); + } + } + + if (m_currentPage != 0) { + m_currentPage = 0; + emit q->currentPageChanged(m_currentPage); + } + + updatePrevNext(); + } + + void updatePrevNext() + { + Q_Q(QPdfPageNavigation); + + const bool hasPreviousPage = m_currentPage > 0; + const bool hasNextPage = m_currentPage < (m_pageCount - 1); + + if (m_canGoToPreviousPage != hasPreviousPage) { + m_canGoToPreviousPage = hasPreviousPage; + emit q->canGoToPreviousPageChanged(m_canGoToPreviousPage); + } + + if (m_canGoToNextPage != hasNextPage) { + m_canGoToNextPage = hasNextPage; + emit q->canGoToNextPageChanged(m_canGoToNextPage); + } + } + + void documentStatusChanged() + { + update(); + } + + Q_DECLARE_PUBLIC(QPdfPageNavigation) + + QPointer<QPdfDocument> m_document = nullptr; + int m_currentPage = 0; + int m_pageCount = 0; + bool m_canGoToPreviousPage = false; + bool m_canGoToNextPage = false; + + QMetaObject::Connection m_documentStatusChangedConnection; +}; + +/*! + \class QPdfPageNavigation + \since 5.10 + \inmodule QtPdf + + \brief The QPdfPageNavigation class handles the navigation through a PDF document. + + \sa QPdfDocument +*/ + + +/*! + Constructs a page navigation object with parent object \a parent. +*/ +QPdfPageNavigation::QPdfPageNavigation(QObject *parent) + : QObject(*new QPdfPageNavigationPrivate, parent) +{ +} + +/*! + Destroys the page navigation object. +*/ +QPdfPageNavigation::~QPdfPageNavigation() +{ +} + +/*! + \property QPdfPageNavigation::document + \brief the document instance on which this object navigates + + By default, this property is \c nullptr. + + \sa document(), setDocument(), QPdfDocument +*/ + +/*! + Returns the document on which this object navigates, or a \c nullptr + if none has set before. + + \sa QPdfDocument +*/ +QPdfDocument* QPdfPageNavigation::document() const +{ + Q_D(const QPdfPageNavigation); + + return d->m_document; +} + +/*! + Sets the \a document this object navigates on. + + After a new document has been set, the currentPage will be \c 0. + + \sa QPdfDocument +*/ +void QPdfPageNavigation::setDocument(QPdfDocument *document) +{ + Q_D(QPdfPageNavigation); + + if (d->m_document == document) + return; + + if (d->m_document) + disconnect(d->m_documentStatusChangedConnection); + + d->m_document = document; + emit documentChanged(d->m_document); + + if (d->m_document) + d->m_documentStatusChangedConnection = connect(d->m_document.data(), &QPdfDocument::statusChanged, this, [d](){ d->documentStatusChanged(); }); + + d->update(); +} + +/*! + \property QPdfPageNavigation::currentPage + \brief the current page number in the document + + \sa currentPage(), setCurrentPage() +*/ + +/*! + Returns the current page number or \c 0 if there is no document set. + + After a document has been loaded, the currentPage will always be \c 0. +*/ +int QPdfPageNavigation::currentPage() const +{ + Q_D(const QPdfPageNavigation); + + return d->m_currentPage; +} + +/*! + \fn void QPdfPageNavigation::setCurrentPage(int page) + + Sets the current \a page number. +*/ +void QPdfPageNavigation::setCurrentPage(int newPage) +{ + Q_D(QPdfPageNavigation); + + if (newPage < 0 || newPage >= d->m_pageCount) + return; + + if (d->m_currentPage == newPage) + return; + + d->m_currentPage = newPage; + emit currentPageChanged(d->m_currentPage); + + d->updatePrevNext(); +} + +/*! + \property QPdfPageNavigation::pageCount + \brief the number of pages in the document + + \sa pageCount() +*/ + +/*! + Returns the number of pages in the document or \c 0 if there + is no document set. +*/ +int QPdfPageNavigation::pageCount() const +{ + Q_D(const QPdfPageNavigation); + + return d->m_pageCount; +} + +/*! + \property QPdfPageNavigation::canGoToPreviousPage + \brief whether there is a page before the current page + + \sa canGoToPreviousPage(), goToPreviousPage() +*/ + +/*! + Returns whether there is a page before the current one. +*/ +bool QPdfPageNavigation::canGoToPreviousPage() const +{ + Q_D(const QPdfPageNavigation); + + return d->m_canGoToPreviousPage; +} + +/*! + \property QPdfPageNavigation::canGoToNextPage + \brief whether there is a page after the current page + + \sa canGoToNextPage(), goToNextPage() +*/ + +/*! + Returns whether there is a page after the current one. +*/ +bool QPdfPageNavigation::canGoToNextPage() const +{ + Q_D(const QPdfPageNavigation); + + return d->m_canGoToNextPage; +} + +/*! + Changes the current page to the previous page. + + If there is no previous page in the document, nothing happens. + + \sa canGoToPreviousPage +*/ +void QPdfPageNavigation::goToPreviousPage() +{ + Q_D(QPdfPageNavigation); + + if (d->m_currentPage > 0) + setCurrentPage(d->m_currentPage - 1); +} + +/*! + Changes the current page to the next page. + + If there is no next page in the document, nothing happens. + + \sa canGoToNextPage +*/ +void QPdfPageNavigation::goToNextPage() +{ + Q_D(QPdfPageNavigation); + + if (d->m_currentPage < d->m_pageCount - 1) + setCurrentPage(d->m_currentPage + 1); +} + +QT_END_NAMESPACE + +#include "moc_qpdfpagenavigation.cpp" diff --git a/src/pdf/qpdfpagenavigation.h b/src/pdf/qpdfpagenavigation.h new file mode 100644 index 000000000..b3649fac6 --- /dev/null +++ b/src/pdf/qpdfpagenavigation.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Tobias König <tobias.koenig@kdab.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPDF module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** 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 http://www.qt.io/terms-conditions. For further +** information use the contact form at http://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.LGPLv3 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.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 later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPDFPAGENAVIGATION_H +#define QPDFPAGENAVIGATION_H + +#include "qtpdfglobal.h" + +#include <QObject> + +QT_BEGIN_NAMESPACE + +class QPdfDocument; +class QPdfPageNavigationPrivate; + +class Q_PDF_EXPORT QPdfPageNavigation : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QPdfDocument* document READ document WRITE setDocument NOTIFY documentChanged) + + Q_PROPERTY(int currentPage READ currentPage WRITE setCurrentPage NOTIFY currentPageChanged) + Q_PROPERTY(int pageCount READ pageCount NOTIFY pageCountChanged) + Q_PROPERTY(bool canGoToPreviousPage READ canGoToPreviousPage NOTIFY canGoToPreviousPageChanged) + Q_PROPERTY(bool canGoToNextPage READ canGoToNextPage NOTIFY canGoToNextPageChanged) + +public: + explicit QPdfPageNavigation(QObject *parent = nullptr); + ~QPdfPageNavigation(); + + QPdfDocument* document() const; + void setDocument(QPdfDocument *document); + + int currentPage() const; + void setCurrentPage(int currentPage); + + int pageCount() const; + + bool canGoToPreviousPage() const; + bool canGoToNextPage() const; + +public Q_SLOTS: + void goToPreviousPage(); + void goToNextPage(); + +Q_SIGNALS: + void documentChanged(QPdfDocument *document); + void currentPageChanged(int currentPage); + void pageCountChanged(int pageCount); + void canGoToPreviousPageChanged(bool canGo); + void canGoToNextPageChanged(bool canGo); + +private: + Q_DECLARE_PRIVATE(QPdfPageNavigation) +}; + +QT_END_NAMESPACE + +#endif |