diff options
Diffstat (limited to 'examples/pdfwidgets/pdfviewer/mainwindow.cpp')
-rw-r--r-- | examples/pdfwidgets/pdfviewer/mainwindow.cpp | 176 |
1 files changed, 101 insertions, 75 deletions
diff --git a/examples/pdfwidgets/pdfviewer/mainwindow.cpp b/examples/pdfwidgets/pdfviewer/mainwindow.cpp index 25bdaf25e..ce19359fc 100644 --- a/examples/pdfwidgets/pdfviewer/mainwindow.cpp +++ b/examples/pdfwidgets/pdfviewer/mainwindow.cpp @@ -1,64 +1,22 @@ -/**************************************************************************** -** -** Copyright (C) 2016 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:BSD$ -** 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. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "mainwindow.h" #include "ui_mainwindow.h" +#include "searchresultdelegate.h" #include "zoomselector.h" #include <QFileDialog> +#include <QLineEdit> #include <QMessageBox> -#include <QSpinBox> #include <QPdfBookmarkModel> #include <QPdfDocument> -#include <QPdfNavigationStack> +#include <QPdfPageNavigator> +#include <QPdfPageSelector> +#include <QPdfSearchModel> +#include <QShortcut> +#include <QStandardPaths> #include <QtMath> const qreal zoomMultiplier = qSqrt(2.0); @@ -69,7 +27,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) , m_zoomSelector(new ZoomSelector(this)) - , m_pageSelector(new QSpinBox(this)) + , m_pageSelector(new QPdfPageSelector(this)) + , m_searchModel(new QPdfSearchModel(this)) + , m_searchField(new QLineEdit(this)) , m_document(new QPdfDocument(this)) { ui->setupUi(this); @@ -78,11 +38,12 @@ MainWindow::MainWindow(QWidget *parent) ui->mainToolBar->insertWidget(ui->actionZoom_In, m_zoomSelector); ui->mainToolBar->insertWidget(ui->actionForward, m_pageSelector); - connect(m_pageSelector, &QSpinBox::valueChanged, this, &MainWindow::pageSelected); - auto nav = ui->pdfView->pageNavigation(); - connect(nav, &QPdfNavigationStack::currentPageChanged, m_pageSelector, &QSpinBox::setValue); - connect(nav, &QPdfNavigationStack::backAvailableChanged, ui->actionBack, &QAction::setEnabled); - connect(nav, &QPdfNavigationStack::forwardAvailableChanged, ui->actionForward, &QAction::setEnabled); + connect(m_pageSelector, &QPdfPageSelector::currentPageChanged, this, &MainWindow::pageSelected); + m_pageSelector->setDocument(m_document); + auto nav = ui->pdfView->pageNavigator(); + connect(nav, &QPdfPageNavigator::currentPageChanged, m_pageSelector, &QPdfPageSelector::setCurrentPage); + connect(nav, &QPdfPageNavigator::backAvailableChanged, ui->actionBack, &QAction::setEnabled); + connect(nav, &QPdfPageNavigator::forwardAvailableChanged, ui->actionForward, &QAction::setEnabled); connect(m_zoomSelector, &ZoomSelector::zoomModeChanged, ui->pdfView, &QPdfView::setZoomMode); connect(m_zoomSelector, &ZoomSelector::zoomFactorChanged, ui->pdfView, &QPdfView::setZoomFactor); @@ -92,9 +53,26 @@ MainWindow::MainWindow(QWidget *parent) bookmarkModel->setDocument(m_document); ui->bookmarkView->setModel(bookmarkModel); - connect(ui->bookmarkView, SIGNAL(activated(QModelIndex)), this, SLOT(bookmarkSelected(QModelIndex))); - - ui->tabWidget->setTabEnabled(1, false); // disable 'Pages' tab for now + connect(ui->bookmarkView, &QAbstractItemView::activated, this, &MainWindow::bookmarkSelected); + + ui->thumbnailsView->setModel(m_document->pageModel()); + + m_searchModel->setDocument(m_document); + ui->pdfView->setSearchModel(m_searchModel); + ui->searchToolBar->insertWidget(ui->actionFindPrevious, m_searchField); + connect(new QShortcut(QKeySequence::Find, this), &QShortcut::activated, this, [this]() { + m_searchField->setFocus(Qt::ShortcutFocusReason); + }); + m_searchField->setPlaceholderText(tr("Find in document")); + m_searchField->setMaximumWidth(400); + connect(m_searchField, &QLineEdit::textEdited, this, [this](const QString &text) { + m_searchModel->setSearchString(text); + ui->tabWidget->setCurrentWidget(ui->searchResultsTab); + }); + ui->searchResultsView->setModel(m_searchModel); + ui->searchResultsView->setItemDelegate(new SearchResultDelegate(this)); + connect(ui->searchResultsView->selectionModel(), &QItemSelectionModel::currentChanged, + this, &MainWindow::searchResultSelected); ui->pdfView->setDocument(m_document); @@ -111,13 +89,11 @@ void MainWindow::open(const QUrl &docLocation) { if (docLocation.isLocalFile()) { m_document->load(docLocation.toLocalFile()); - const auto documentTitle = m_document->metaData(QPdfDocument::Title).toString(); - setWindowTitle(!documentTitle.isEmpty() ? documentTitle : QStringLiteral("PDF Viewer")); pageSelected(0); - m_pageSelector->setMaximum(m_document->pageCount() - 1); } else { - qCDebug(lcExample) << docLocation << "is not a valid local file"; - QMessageBox::critical(this, tr("Failed to open"), tr("%1 is not a valid local file").arg(docLocation.toString())); + const QString message = tr("%1 is not a valid local file").arg(docLocation.toString()); + qCDebug(lcExample).noquote() << message; + QMessageBox::critical(this, tr("Failed to open"), message); } qCDebug(lcExample) << docLocation; } @@ -129,20 +105,46 @@ void MainWindow::bookmarkSelected(const QModelIndex &index) const int page = index.data(int(QPdfBookmarkModel::Role::Page)).toInt(); const qreal zoomLevel = index.data(int(QPdfBookmarkModel::Role::Level)).toReal(); - ui->pdfView->pageNavigation()->jump(page, {}, zoomLevel); + ui->pdfView->pageNavigator()->jump(page, {}, zoomLevel); } void MainWindow::pageSelected(int page) { - auto nav = ui->pdfView->pageNavigation(); + auto nav = ui->pdfView->pageNavigator(); nav->jump(page, {}, nav->currentZoom()); + const auto documentTitle = m_document->metaData(QPdfDocument::MetaDataField::Title).toString(); + setWindowTitle(!documentTitle.isEmpty() ? documentTitle : QStringLiteral("PDF Viewer")); + setWindowTitle(tr("%1: page %2 (%3 of %4)") + .arg(documentTitle.isEmpty() ? u"PDF Viewer"_qs : documentTitle, + m_pageSelector->currentPageLabel(), QString::number(page + 1), QString::number(m_document->pageCount()))); +} + +void MainWindow::searchResultSelected(const QModelIndex ¤t, const QModelIndex &previous) +{ + Q_UNUSED(previous); + if (!current.isValid()) + return; + + const int page = current.data(int(QPdfSearchModel::Role::Page)).toInt(); + const QPointF location = current.data(int(QPdfSearchModel::Role::Location)).toPointF(); + ui->pdfView->pageNavigator()->jump(page, location); + ui->pdfView->setCurrentSearchResultIndex(current.row()); } void MainWindow::on_actionOpen_triggered() { - QUrl toOpen = QFileDialog::getOpenFileUrl(this, tr("Choose a PDF"), QUrl(), "Portable Documents (*.pdf)"); - if (toOpen.isValid()) - open(toOpen); + if (m_fileDialog == nullptr) { + m_fileDialog = new QFileDialog(this, tr("Choose a PDF"), + QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)); + m_fileDialog->setAcceptMode(QFileDialog::AcceptOpen); + m_fileDialog->setMimeTypeFilters({"application/pdf"}); + } + + if (m_fileDialog->exec() == QDialog::Accepted) { + const QUrl toOpen = m_fileDialog->selectedUrls().constFirst(); + if (toOpen.isValid()) + open(toOpen); + } } void MainWindow::on_actionQuit_triggered() @@ -173,27 +175,51 @@ void MainWindow::on_actionZoom_Out_triggered() void MainWindow::on_actionPrevious_Page_triggered() { - auto nav = ui->pdfView->pageNavigation(); + auto nav = ui->pdfView->pageNavigator(); nav->jump(nav->currentPage() - 1, {}, nav->currentZoom()); } void MainWindow::on_actionNext_Page_triggered() { - auto nav = ui->pdfView->pageNavigation(); + auto nav = ui->pdfView->pageNavigator(); nav->jump(nav->currentPage() + 1, {}, nav->currentZoom()); } +void MainWindow::on_thumbnailsView_activated(const QModelIndex &index) +{ + auto nav = ui->pdfView->pageNavigator(); + nav->jump(index.row(), {}, nav->currentZoom()); +} + void MainWindow::on_actionContinuous_triggered() { - ui->pdfView->setPageMode(ui->actionContinuous->isChecked() ? QPdfView::MultiPage : QPdfView::SinglePage); + ui->pdfView->setPageMode(ui->actionContinuous->isChecked() ? + QPdfView::PageMode::MultiPage : + QPdfView::PageMode::SinglePage); } void MainWindow::on_actionBack_triggered() { - ui->pdfView->pageNavigation()->back(); + ui->pdfView->pageNavigator()->back(); } void MainWindow::on_actionForward_triggered() { - ui->pdfView->pageNavigation()->forward(); + ui->pdfView->pageNavigator()->forward(); +} + +void MainWindow::on_actionFindNext_triggered() +{ + int next = ui->searchResultsView->currentIndex().row() + 1; + if (next >= m_searchModel->rowCount({})) + next = 0; + ui->searchResultsView->setCurrentIndex(m_searchModel->index(next)); +} + +void MainWindow::on_actionFindPrevious_triggered() +{ + int prev = ui->searchResultsView->currentIndex().row() - 1; + if (prev < 0) + prev = m_searchModel->rowCount({}) - 1; + ui->searchResultsView->setCurrentIndex(m_searchModel->index(prev)); } |