diff options
Diffstat (limited to 'src/pdf/qpdfbookmarkmodel.cpp')
-rw-r--r-- | src/pdf/qpdfbookmarkmodel.cpp | 150 |
1 files changed, 68 insertions, 82 deletions
diff --git a/src/pdf/qpdfbookmarkmodel.cpp b/src/pdf/qpdfbookmarkmodel.cpp index 604c21baf..93dbf5d1f 100644 --- a/src/pdf/qpdfbookmarkmodel.cpp +++ b/src/pdf/qpdfbookmarkmodel.cpp @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtPDF 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$ -** -****************************************************************************/ +// Copyright (C) 2020 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qpdfbookmarkmodel.h" @@ -86,7 +50,7 @@ public: int childCount() const { - return m_childNodes.count(); + return m_childNodes.size(); } int row() const @@ -169,13 +133,12 @@ struct QPdfBookmarkModelPrivate QPdfBookmarkModelPrivate() : m_rootNode(new BookmarkNode(nullptr)) , m_document(nullptr) - , m_structureMode(QPdfBookmarkModel::TreeMode) { } void rebuild() { - const bool documentAvailable = (m_document && m_document->status() == QPdfDocument::Ready); + const bool documentAvailable = (m_document && m_document->status() == QPdfDocument::Status::Ready); if (documentAvailable) { q->beginResetModel(); @@ -202,33 +165,18 @@ struct QPdfBookmarkModelPrivate while (bookmark) { BookmarkNode *childBookmarkNode = nullptr; - if (m_structureMode == QPdfBookmarkModel::TreeMode) { - childBookmarkNode = new BookmarkNode(parentBookmarkNode); - parentBookmarkNode->appendChild(childBookmarkNode); - } else if (m_structureMode == QPdfBookmarkModel::ListMode) { - childBookmarkNode = new BookmarkNode(m_rootNode.data()); - m_rootNode->appendChild(childBookmarkNode); - } + childBookmarkNode = new BookmarkNode(parentBookmarkNode); + parentBookmarkNode->appendChild(childBookmarkNode); Q_ASSERT(childBookmarkNode); const int titleLength = int(FPDFBookmark_GetTitle(bookmark, nullptr, 0)); QList<char16_t> titleBuffer(titleLength); - FPDFBookmark_GetTitle(bookmark, titleBuffer.data(), quint32(titleBuffer.length())); + FPDFBookmark_GetTitle(bookmark, titleBuffer.data(), quint32(titleBuffer.size())); const FPDF_DEST dest = FPDFBookmark_GetDest(document, bookmark); const int pageNumber = FPDFDest_GetDestPageIndex(document, dest); - double pageHeight = 11.69 * 72; // A4 height - { - // get actual page height - const QPdfMutexLocker lock; - FPDF_PAGE pdfPage = FPDF_LoadPage(document, pageNumber); - if (pdfPage) - pageHeight = FPDF_GetPageHeight(pdfPage); - else - qCWarning(qLcBM) << "failed to load page" << pageNumber; - } - + const qreal pageHeight = m_document->pagePointSize(pageNumber).height(); FPDF_BOOL hasX, hasY, hasZoom; FS_FLOAT x, y, zoom; bool ok = FPDFDest_GetLocationInPage(dest, &hasX, &hasY, &hasZoom, &x, &y, &zoom); @@ -261,20 +209,50 @@ struct QPdfBookmarkModelPrivate QScopedPointer<BookmarkNode> m_rootNode; QPointer<QPdfDocument> m_document; - QPdfBookmarkModel::StructureMode m_structureMode; + QHash<int, QByteArray> m_roleNames; }; +/*! + \class QPdfBookmarkModel + \since 5.10 + \inmodule QtPdf + \inherits QAbstractItemModel + + \brief The QPdfBookmarkModel class holds a tree of of links (anchors) + within a PDF document, such as the table of contents. + + This is used in the \l {Model/View Programming} paradigm to display a + table of contents in the form of a tree or list. +*/ + +/*! + \enum QPdfBookmarkModel::Role + + \value Title The name of the bookmark for display. + \value Level The level of indentation. + \value Page The page number of the destination (int). + \value Location The position of the destination (QPointF). + \value Zoom The suggested zoom level (qreal). + \omitvalue NRoles +*/ + +/*! + Constructs a new bookmark model with parent object \a parent. +*/ QPdfBookmarkModel::QPdfBookmarkModel(QObject *parent) : QAbstractItemModel(parent), d(new QPdfBookmarkModelPrivate) { d->q = this; - m_roleNames = QAbstractItemModel::roleNames(); + d->m_roleNames = QAbstractItemModel::roleNames(); QMetaEnum rolesMetaEnum = metaObject()->enumerator(metaObject()->indexOfEnumerator("Role")); - for (int r = Qt::UserRole; r < int(Role::_Count); ++r) - m_roleNames.insert(r, QByteArray(rolesMetaEnum.valueToKey(r)).toLower()); + for (int r = Qt::UserRole; r < int(Role::NRoles); ++r) + d->m_roleNames.insert(r, QByteArray(rolesMetaEnum.valueToKey(r)).toLower()); } +/*! + Destroys the model. +*/ QPdfBookmarkModel::~QPdfBookmarkModel() = default; QPdfDocument* QPdfBookmarkModel::document() const @@ -282,6 +260,10 @@ QPdfDocument* QPdfBookmarkModel::document() const return d->m_document; } +/*! + \property QPdfBookmarkModel::document + \brief the PDF document in which bookmarks are to be found. +*/ void QPdfBookmarkModel::setDocument(QPdfDocument *document) { if (d->m_document == document) @@ -299,33 +281,26 @@ void QPdfBookmarkModel::setDocument(QPdfDocument *document) d->rebuild(); } -QPdfBookmarkModel::StructureMode QPdfBookmarkModel::structureMode() const -{ - return d->m_structureMode; -} - -void QPdfBookmarkModel::setStructureMode(StructureMode mode) -{ - if (d->m_structureMode == mode) - return; - - d->m_structureMode = mode; - emit structureModeChanged(d->m_structureMode); - - d->rebuild(); -} - +/*! + \reimp +*/ int QPdfBookmarkModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent); return 1; } +/*! + \reimp +*/ QHash<int, QByteArray> QPdfBookmarkModel::roleNames() const { - return m_roleNames; + return d->m_roleNames; } +/*! + \reimp +*/ QVariant QPdfBookmarkModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) @@ -343,12 +318,17 @@ QVariant QPdfBookmarkModel::data(const QModelIndex &index, int role) const return node->location(); case Role::Zoom: return node->zoom(); - case Role::_Count: + case Role::NRoles: break; } + if (role == Qt::DisplayRole) + return node->title(); return QVariant(); } +/*! + \reimp +*/ QModelIndex QPdfBookmarkModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) @@ -368,6 +348,9 @@ QModelIndex QPdfBookmarkModel::index(int row, int column, const QModelIndex &par return QModelIndex(); } +/*! + \reimp +*/ QModelIndex QPdfBookmarkModel::parent(const QModelIndex &index) const { if (!index.isValid()) @@ -382,6 +365,9 @@ QModelIndex QPdfBookmarkModel::parent(const QModelIndex &index) const return createIndex(parentNode->row(), 0, parentNode); } +/*! + \reimp +*/ int QPdfBookmarkModel::rowCount(const QModelIndex &parent) const { if (parent.column() > 0) |