summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/pdfwidgets/pdfviewer/mainwindow.cpp8
-rw-r--r--examples/pdfwidgets/pdfviewer/mainwindow.h1
-rw-r--r--examples/pdfwidgets/pdfviewer/mainwindow.ui39
-rw-r--r--src/pdf/qpdfdocument.cpp26
4 files changed, 73 insertions, 1 deletions
diff --git a/examples/pdfwidgets/pdfviewer/mainwindow.cpp b/examples/pdfwidgets/pdfviewer/mainwindow.cpp
index d7527a8d5..f5dae88e1 100644
--- a/examples/pdfwidgets/pdfviewer/mainwindow.cpp
+++ b/examples/pdfwidgets/pdfviewer/mainwindow.cpp
@@ -49,7 +49,7 @@ MainWindow::MainWindow(QWidget *parent)
ui->bookmarkView->setModel(bookmarkModel);
connect(ui->bookmarkView, &QAbstractItemView::activated, this, &MainWindow::bookmarkSelected);
- ui->tabWidget->setTabEnabled(1, false); // disable 'Pages' tab for now
+ ui->thumbnailsView->setModel(m_document->pageModel());
ui->pdfView->setDocument(m_document);
@@ -150,6 +150,12 @@ void MainWindow::on_actionNext_Page_triggered()
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() ?
diff --git a/examples/pdfwidgets/pdfviewer/mainwindow.h b/examples/pdfwidgets/pdfviewer/mainwindow.h
index 2827fb2b6..84b779be1 100644
--- a/examples/pdfwidgets/pdfviewer/mainwindow.h
+++ b/examples/pdfwidgets/pdfviewer/mainwindow.h
@@ -47,6 +47,7 @@ private slots:
void on_actionZoom_Out_triggered();
void on_actionPrevious_Page_triggered();
void on_actionNext_Page_triggered();
+ void on_thumbnailsView_activated(const QModelIndex &index);
void on_actionContinuous_triggered();
void on_actionBack_triggered();
void on_actionForward_triggered();
diff --git a/examples/pdfwidgets/pdfviewer/mainwindow.ui b/examples/pdfwidgets/pdfviewer/mainwindow.ui
index 304d4cfc8..458c5a8c9 100644
--- a/examples/pdfwidgets/pdfviewer/mainwindow.ui
+++ b/examples/pdfwidgets/pdfviewer/mainwindow.ui
@@ -111,6 +111,45 @@
<attribute name="title">
<string>Pages</string>
</attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <property name="leftMargin">
+ <number>2</number>
+ </property>
+ <property name="topMargin">
+ <number>2</number>
+ </property>
+ <property name="rightMargin">
+ <number>2</number>
+ </property>
+ <property name="bottomMargin">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QListView" name="thumbnailsView">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>128</width>
+ <height>128</height>
+ </size>
+ </property>
+ <property name="movement">
+ <enum>QListView::Static</enum>
+ </property>
+ <property name="resizeMode">
+ <enum>QListView::Adjust</enum>
+ </property>
+ <property name="viewMode">
+ <enum>QListView::IconMode</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
</widget>
</widget>
<widget class="QPdfView" name="pdfView" native="true">
diff --git a/src/pdf/qpdfdocument.cpp b/src/pdf/qpdfdocument.cpp
index a6aed4bfe..695b30c59 100644
--- a/src/pdf/qpdfdocument.cpp
+++ b/src/pdf/qpdfdocument.cpp
@@ -15,6 +15,7 @@
#include <QLoggingCategory>
#include <QMetaEnum>
#include <QMutex>
+#include <QPixmap>
#include <QVector2D>
#include <QtCore/private/qtools_p.h>
@@ -56,6 +57,7 @@ public:
{
if (!index.isValid())
return QVariant();
+
switch (QPdfDocument::PageModelRole(role)) {
case QPdfDocument::PageModelRole::Label:
return document()->pageLabel(index.row());
@@ -64,6 +66,14 @@ public:
case QPdfDocument::PageModelRole::NRoles:
break;
}
+
+ switch (role) {
+ case Qt::DecorationRole:
+ return pageThumbnail(index.row());
+ case Qt::DisplayRole:
+ return document()->pageLabel(index.row());
+ }
+
return QVariant();
}
@@ -73,8 +83,24 @@ public:
private:
QPdfDocument *document() const { return static_cast<QPdfDocument *>(parent()); }
+ QPixmap pageThumbnail(int page) const
+ {
+ auto it = m_thumbnails.constFind(page);
+ if (it == m_thumbnails.constEnd()) {
+ auto doc = document();
+ auto size = doc->pagePointSize(page);
+ size.scale(128, 128, Qt::KeepAspectRatio);
+ // TODO use QPdfPageRenderer for threading?
+ auto image = document()->render(page, size.toSize());
+ QPixmap ret = QPixmap::fromImage(image);
+ m_thumbnails.insert(page, ret);
+ return ret;
+ }
+ return it.value();
+ }
QHash<int, QByteArray> m_roleNames;
+ mutable QHash<int, QPixmap> m_thumbnails;
};
QPdfDocumentPrivate::QPdfDocumentPrivate()