diff options
Diffstat (limited to 'src/pdfquick/qquickpdfsearchmodel.cpp')
-rw-r--r-- | src/pdfquick/qquickpdfsearchmodel.cpp | 157 |
1 files changed, 64 insertions, 93 deletions
diff --git a/src/pdfquick/qquickpdfsearchmodel.cpp b/src/pdfquick/qquickpdfsearchmodel.cpp index 40875cd21..896584ad7 100644 --- a/src/pdfquick/qquickpdfsearchmodel.cpp +++ b/src/pdfquick/qquickpdfsearchmodel.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 "qquickpdfsearchmodel_p.h" #include <QtCore/qloggingcategory.h> @@ -110,15 +74,16 @@ void QQuickPdfSearchModel::setDocument(QQuickPdfDocument *document) } \endqml + It becomes empty whenever \c {currentPage != currentResultLink.page}. + \sa PathMultiline */ QList<QPolygonF> QQuickPdfSearchModel::currentResultBoundingPolygons() const { QList<QPolygonF> ret; - const auto &results = const_cast<QQuickPdfSearchModel *>(this)->resultsOnPage(m_currentPage); - if (m_currentResult < 0 || m_currentResult >= results.count()) + const auto result = currentResultLink(); + if (result.page() != m_currentPage) return ret; - const auto result = results[m_currentResult]; for (auto rect : result.rectangles()) ret << QPolygonF(rect); return ret; @@ -127,23 +92,21 @@ QList<QPolygonF> QQuickPdfSearchModel::currentResultBoundingPolygons() const /*! \qmlproperty point PdfSearchModel::currentResultBoundingRect - The bounding box containing all \l currentResultBoundingPolygons. - - When this property changes, a scrollable view should automatically scroll - itself in such a way as to ensure that this region is visible; for example, - it could try to position the upper-left corner near the upper-left of its - own viewport, subject to the constraints of the scrollable area. + The bounding box containing all \l currentResultBoundingPolygons, + if \c {currentPage == currentResultLink.page}; otherwise, an invalid rectangle. */ QRectF QQuickPdfSearchModel::currentResultBoundingRect() const { QRectF ret; - const auto &results = const_cast<QQuickPdfSearchModel *>(this)->resultsOnPage(m_currentPage); - if (m_currentResult < 0 || m_currentResult >= results.count()) + const auto result = currentResultLink(); + if (result.page() != m_currentPage) return ret; - auto rects = results[m_currentResult].rectangles(); - ret = rects.takeFirst(); - for (auto rect : rects) - ret = ret.united(rect); + auto rects = result.rectangles(); + if (!rects.isEmpty()) { + ret = rects.takeFirst(); + for (auto rect : rects) + ret = ret.united(rect); + } return ret; } @@ -219,9 +182,9 @@ QList<QPolygonF> QQuickPdfSearchModel::boundingPolygonsOnPage(int page) updatePage(page); QList<QPolygonF> ret; - auto m = QPdfSearchModel::resultsOnPage(page); - for (auto result : m) { - for (auto rect : result.rectangles()) + const auto m = QPdfSearchModel::resultsOnPage(page); + for (const auto &result : m) { + for (const auto &rect : result.rectangles()) ret << QPolygonF(rect); } @@ -236,7 +199,7 @@ QList<QPolygonF> QQuickPdfSearchModel::boundingPolygonsOnPage(int page) */ void QQuickPdfSearchModel::setCurrentPage(int currentPage) { - if (m_currentPage == currentPage) + if (m_currentPage == currentPage || !document()) return; const auto pageCount = document()->document()->pageCount(); @@ -255,51 +218,50 @@ void QQuickPdfSearchModel::setCurrentPage(int currentPage) /*! \qmlproperty int PdfSearchModel::currentResult - The result index on \l currentPage for which \l currentResultBoundingPolygons - should provide the regions to highlight. + The result index within the whole set of search results, for which + \l currentResultBoundingPolygons should provide the regions to highlight + if currentPage matches \c currentResultLink.page. */ void QQuickPdfSearchModel::setCurrentResult(int currentResult) { if (m_currentResult == currentResult) return; - int currentResultWas = currentResult; - int currentPageWas = m_currentPage; - if (currentResult < 0) { - setCurrentPage(m_currentPage - 1); - while (resultsOnPage(m_currentPage).count() == 0 && m_currentPage != currentPageWas) { - m_suspendSignals = true; - setCurrentPage(m_currentPage - 1); - } - if (m_suspendSignals) { - emit currentPageChanged(); - m_suspendSignals = false; - } - const auto results = resultsOnPage(m_currentPage); - currentResult = results.count() - 1; + const int currentResultWas = m_currentResult; + const int currentPageWas = m_currentPage; + const int resultCount = rowCount({}); + + // wrap around at the ends + if (currentResult >= resultCount) { + currentResult = 0; + } else if (currentResult < 0) { + currentResult = resultCount - 1; + } + + const QPdfLink link = resultAtIndex(currentResult); + if (link.isValid()) { + setCurrentPage(link.page()); + m_currentResult = currentResult; + emit currentResultChanged(); + emit currentResultLinkChanged(); + emit currentResultBoundingPolygonsChanged(); + emit currentResultBoundingRectChanged(); + qCDebug(qLcSearch) << "currentResult was" << currentResultWas + << "requested" << currentResult << "on page" << currentPageWas + << "->" << m_currentResult << "on page" << m_currentPage; } else { - const auto results = resultsOnPage(m_currentPage); - if (currentResult >= results.count()) { - setCurrentPage(m_currentPage + 1); - while (resultsOnPage(m_currentPage).count() == 0 && m_currentPage != currentPageWas) { - m_suspendSignals = true; - setCurrentPage(m_currentPage + 1); - } - if (m_suspendSignals) { - emit currentPageChanged(); - m_suspendSignals = false; - } - currentResult = 0; - } + qWarning() << "failed to find result" << currentResult << "in range 0 ->" << resultCount; } - qCDebug(qLcSearch) << "currentResult was" << m_currentResult - << "requested" << currentResultWas << "on page" << currentPageWas - << "->" << currentResult << "on page" << m_currentPage; +} - m_currentResult = currentResult; - emit currentResultChanged(); - emit currentResultBoundingPolygonsChanged(); - emit currentResultBoundingRectChanged(); +/*! + \qmlproperty QPdfLink PdfSearchModel::currentResultLink + + The result at index \l currentResult. +*/ +QPdfLink QQuickPdfSearchModel::currentResultLink() const +{ + return resultAtIndex(m_currentResult); } /*! @@ -308,4 +270,13 @@ void QQuickPdfSearchModel::setCurrentResult(int currentResult) The string to search for. */ +/*! + \since 6.8 + \qmlproperty int PdfSearchModel::count + + The number of search results found. +*/ + QT_END_NAMESPACE + +#include "moc_qquickpdfsearchmodel_p.cpp" |