3
Copyright 2012 Adam Reichold
5
This file is part of qpdfview.
7
qpdfview is free software: you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation, either version 2 of the License, or
10
(at your option) any later version.
12
qpdfview is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License for more details.
17
You should have received a copy of the GNU General Public License
18
along with qpdfview. If not, see <http://www.gnu.org/licenses/>.
22
#include "presentationview.h"
24
PresentationView::PresentationView(QMutex* mutex, Poppler::Document* document) : QWidget(),
38
setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
39
setWindowState(windowState() | Qt::WindowFullScreen);
40
setMouseTracking(true);
42
m_render = new QFutureWatcher< void >(this);
43
connect(m_render, SIGNAL(finished()), SLOT(on_render_finished()));
46
m_document = document;
48
m_numberOfPages = m_document->numPages();
55
PresentationView::~PresentationView()
58
m_render->waitForFinished();
61
int PresentationView::numberOfPages() const
63
return m_numberOfPages;
66
int PresentationView::currentPage() const
71
void PresentationView::previousPage()
73
jumpToPage(currentPage() - 1);
76
void PresentationView::nextPage()
78
jumpToPage(currentPage() + 1);
81
void PresentationView::firstPage()
86
void PresentationView::lastPage()
88
jumpToPage(numberOfPages());
91
void PresentationView::jumpToPage(int page)
93
if(m_currentPage != page && page >= 1 && page <= m_numberOfPages)
95
m_returnToPage = m_currentPage;
102
void PresentationView::on_render_finished()
104
if(!m_render->isCanceled())
109
if(!m_render->isRunning())
117
void PresentationView::resizeEvent(QResizeEvent* event)
124
void PresentationView::paintEvent(QPaintEvent* event)
131
painter.fillRect(rect(), QBrush(Qt::black));
133
if(!m_image1.isNull())
135
painter.drawImage(m_boundingRect.topLeft(), m_image1);
139
if(!m_render->isRunning())
141
m_render->setFuture(QtConcurrent::run(this, &PresentationView::render, m_currentPage - 1, m_scaleFactor));
148
void PresentationView::keyPressEvent(QKeyEvent* event)
150
if(event->modifiers() == Qt::NoModifier)
157
case Qt::Key_Backspace:
162
case Qt::Key_PageDown:
181
jumpToPage(m_returnToPage);
194
QWidget::keyPressEvent(event);
197
void PresentationView::mouseMoveEvent(QMouseEvent* event)
199
QApplication::restoreOverrideCursor();
201
foreach(Poppler::Link* link, m_links)
203
if(m_linkTransform.mapRect(link->linkArea().normalized()).contains(event->pos()))
205
if(link->linkType() == Poppler::Link::Goto)
207
if(!static_cast< Poppler::LinkGoto* >(link)->isExternal())
209
QApplication::setOverrideCursor(Qt::PointingHandCursor);
210
QToolTip::showText(event->globalPos(), tr("Go to page %1.").arg(static_cast< Poppler::LinkGoto* >(link)->destination().pageNumber()));
218
QToolTip::hideText();
221
void PresentationView::mousePressEvent(QMouseEvent* event)
223
foreach(Poppler::Link* link, m_links)
225
if(m_linkTransform.mapRect(link->linkArea().normalized()).contains(event->pos()))
227
if(link->linkType() == Poppler::Link::Goto)
229
Poppler::LinkGoto* linkGoto = static_cast< Poppler::LinkGoto* >(link);
231
if(!linkGoto->isExternal())
233
int page = linkGoto->destination().pageNumber();
235
page = page >= 1 ? page : 1;
236
page = page <= m_numberOfPages ? page : m_numberOfPages;
247
void PresentationView::prepareView()
251
Poppler::Page* page = m_document->page(m_currentPage - 1);
254
m_links = page->links();
256
QSizeF size = page->pageSizeF();
263
m_scaleFactor = qMin(width() / size.width(), height() / size.height());
265
m_boundingRect.setLeft(0.5 * (width() - m_scaleFactor * size.width()));
266
m_boundingRect.setTop(0.5 * (height() - m_scaleFactor * size.height()));
267
m_boundingRect.setWidth(m_scaleFactor * size.width());
268
m_boundingRect.setHeight(m_scaleFactor * size.height());
270
m_linkTransform.reset();
271
m_linkTransform.translate(m_boundingRect.left(), m_boundingRect.top());
272
m_linkTransform.scale(m_boundingRect.width(), m_boundingRect.height());
281
void PresentationView::render(int index, qreal scaleFactor)
283
QMutexLocker mutexLocker(m_mutex);
285
if(m_render->isCanceled())
290
Poppler::Page* page = m_document->page(index);
292
m_image2 = page->renderToImage(scaleFactor * 72.0, scaleFactor * 72.0);