22
22
#include "presentationview.h"
24
29
#include "pageitem.h"
30
#include "documentview.h"
26
PresentationView::PresentationView(QMutex* mutex, Poppler::Document* document, QWidget* parent) : QWidget(parent),
32
PresentationView::PresentationView(Model::Document* document, QWidget* parent) : QGraphicsView(parent),
29
35
m_numberOfPages(-1),
37
m_rotation(RotateBy0),
38
m_invertColors(false),
34
m_normalizedTransform(),
39
43
setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
40
44
setWindowState(windowState() | Qt::WindowFullScreen);
41
setMouseTracking(true);
43
m_render = new QFutureWatcher< void >(this);
44
connect(m_render, SIGNAL(finished()), SLOT(on_render_finished()));
46
connect(this, SIGNAL(imageReady(int,qreal,QImage)), SLOT(on_imageReady(int,qreal,QImage)));
46
setFrameShape(QFrame::NoFrame);
48
setAcceptDrops(false);
50
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
51
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
53
new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_Space), this, SLOT(previousPage()));
54
new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_Backspace), this, SLOT(nextPage()));
56
new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Left), this, SLOT(rotateLeft()));
57
new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Right), this, SLOT(rotateRight()));
49
59
m_document = document;
51
m_numberOfPages = m_document->numPages();
61
m_numberOfPages = m_document->numberOfPages();
66
m_pagesScene = new QGraphicsScene(this);
67
setScene(m_pagesScene);
69
m_pages.reserve(m_numberOfPages);
71
for(int index = 0; index < m_numberOfPages; ++index)
73
PageItem* page = new PageItem(m_document->page(index), index, true);
75
page->setPhysicalDpi(physicalDpiX(), physicalDpiY());
77
m_pagesScene->addItem(page);
80
connect(page, SIGNAL(linkClicked(int,qreal,qreal)), SLOT(on_pages_linkClicked(int,qreal,qreal)));
83
m_pagesScene->setBackgroundBrush(QBrush(PageItem::paperColor()));
87
m_prefetchTimer = new QTimer(this);
88
m_prefetchTimer->setInterval(250);
89
m_prefetchTimer->setSingleShot(true);
91
connect(this, SIGNAL(currentPageChanged(int)), m_prefetchTimer, SLOT(start()));
92
connect(this, SIGNAL(rotationChanged(Rotation)), m_prefetchTimer, SLOT(start()));
94
connect(m_prefetchTimer, SIGNAL(timeout()), SLOT(on_prefetch_timeout()));
96
if(DocumentView::prefetch())
98
m_prefetchTimer->blockSignals(false);
99
m_prefetchTimer->start();
103
m_prefetchTimer->blockSignals(true);
104
m_prefetchTimer->stop();
56
111
PresentationView::~PresentationView()
59
m_render->waitForFinished();
64
116
int PresentationView::numberOfPages() const
71
123
return m_currentPage;
126
Rotation PresentationView::rotation() const
131
void PresentationView::setRotation(Rotation rotation)
133
if(m_rotation != rotation)
135
m_rotation = rotation;
140
emit rotationChanged(m_rotation);
144
bool PresentationView::invertColors() const
146
return m_invertColors;
149
void PresentationView::setInvertColors(bool invertColors)
151
if(m_invertColors != invertColors)
153
m_invertColors = invertColors;
155
foreach(PageItem* page, m_pages)
157
page->setInvertColors(m_invertColors);
160
QColor backgroundColor = PageItem::paperColor();
164
backgroundColor.setRgb(~backgroundColor.rgb());
167
m_pagesScene->setBackgroundBrush(QBrush(backgroundColor));
169
emit invertColorsChanged(m_invertColors);
74
173
void PresentationView::show()
118
void PresentationView::startRender()
120
if(!m_render->isRunning())
122
m_render->setFuture(QtConcurrent::run(this, &PresentationView::render, m_currentPage - 1, m_scaleFactor));
126
void PresentationView::cancelRender()
133
void PresentationView::on_render_finished()
138
void PresentationView::on_imageReady(int index, qreal scaleFactor, QImage image)
140
if(m_currentPage - 1 != index || !qFuzzyCompare(m_scaleFactor, scaleFactor))
145
if(PageItem::invertColors())
147
image.invertPixels();
150
if(!m_render->isCanceled())
156
void PresentationView::resizeEvent(QResizeEvent*)
217
void PresentationView::returnToPage()
219
if(!m_returnToPage.isEmpty())
221
jumpToPage(m_returnToPage.pop(), false);
225
void PresentationView::rotateLeft()
231
setRotation(RotateBy270);
234
setRotation(RotateBy0);
237
setRotation(RotateBy90);
240
setRotation(RotateBy180);
245
void PresentationView::rotateRight()
251
setRotation(RotateBy90);
254
setRotation(RotateBy180);
257
setRotation(RotateBy270);
260
setRotation(RotateBy0);
265
void PresentationView::on_prefetch_timeout()
267
int fromPage = m_currentPage, toPage = m_currentPage;
269
fromPage -= DocumentView::prefetchDistance() / 2;
270
toPage += DocumentView::prefetchDistance();
272
fromPage = fromPage >= 1 ? fromPage : 1;
273
toPage = toPage <= m_numberOfPages ? toPage : m_numberOfPages;
275
for(int index = fromPage - 1; index <= toPage - 1; ++index)
277
m_pages.at(index)->startRender(true);
281
void PresentationView::on_pages_linkClicked(int page, qreal left, qreal top)
286
page = page >= 1 ? page : 1;
287
page = page <= m_numberOfPages ? page : m_numberOfPages;
289
jumpToPage(page, true);
292
void PresentationView::resizeEvent(QResizeEvent* event)
294
QGraphicsView::resizeEvent(event);
161
void PresentationView::paintEvent(QPaintEvent*)
163
QPainter painter(this);
165
QColor backgroundColor = PageItem::paperColor();
167
if(PageItem::invertColors())
169
backgroundColor.setRgb(~backgroundColor.rgb());
172
painter.fillRect(rect(), QBrush(backgroundColor));
174
if(!m_image.isNull())
176
painter.drawImage(m_boundingRect.topLeft(), m_image);
184
300
void PresentationView::keyPressEvent(QKeyEvent* event)
186
302
switch(event->key())
343
if(event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_I)
345
setInvertColors(!invertColors());
231
351
QWidget::keyPressEvent(event);
234
void PresentationView::mousePressEvent(QMouseEvent* event)
354
void PresentationView::wheelEvent(QWheelEvent* event)
236
foreach(Poppler::LinkGoto* link, m_links)
238
if(m_normalizedTransform.mapRect(link->linkArea().normalized()).contains(event->pos()))
240
int page = link->destination().pageNumber();
242
page = page >= 1 ? page : 1;
243
page = page <= m_numberOfPages ? page : m_numberOfPages;
252
QWidget::mousePressEvent(event);
356
if(event->modifiers() == DocumentView::rotateModifiers())
358
if(event->delta() > 0)
370
else if(event->modifiers() == Qt::NoModifier)
372
if(event->delta() > 0 && m_currentPage != 1)
379
else if(event->delta() < 0 && m_currentPage != m_numberOfPages)
388
QGraphicsView::wheelEvent(event);
255
void PresentationView::mouseMoveEvent(QMouseEvent* event)
391
void PresentationView::prepareScene()
257
foreach(Poppler::LinkGoto* link, m_links)
393
for(int index = 0; index < m_numberOfPages; ++index)
259
if(m_normalizedTransform.mapRect(link->linkArea().normalized()).contains(event->pos()))
395
PageItem* page = m_pages.at(index);
396
QSizeF size = page->size();
398
qreal visibleWidth = viewport()->width();
399
qreal visibleHeight = viewport()->height();
401
qreal pageWidth = 0.0;
402
qreal pageHeight = 0.0;
261
setCursor(Qt::PointingHandCursor);
262
QToolTip::showText(event->globalPos(), tr("Go to page %1.").arg(link->destination().pageNumber()));
409
pageWidth = physicalDpiX() / 72.0 * size.width();
410
pageHeight = physicalDpiY() / 72.0 * size.height();
414
pageWidth = physicalDpiX() / 72.0 * size.height();
415
pageHeight = physicalDpiY() / 72.0 * size.width();
419
qreal scaleFactor = qMin(visibleWidth / pageWidth, visibleHeight / pageHeight);
421
page->setScaleFactor(scaleFactor);
422
page->setRotation(m_rotation);
269
QToolTip::hideText();
272
426
void PresentationView::prepareView()
276
Poppler::Page* page = m_document->page(m_currentPage - 1);
278
QSizeF size = page->pageSizeF();
287
foreach(Poppler::Link* link, page->links())
289
if(link->linkType() == Poppler::Link::Goto)
291
Poppler::LinkGoto* linkGoto = static_cast< Poppler::LinkGoto* >(link);
293
if(!linkGoto->isExternal())
295
m_links.append(linkGoto);
309
m_scaleFactor = qMin(width() / size.width(), height() / size.height());
311
m_boundingRect.setLeft(0.5 * (width() - m_scaleFactor * size.width()));
312
m_boundingRect.setTop(0.5 * (height() - m_scaleFactor * size.height()));
313
m_boundingRect.setWidth(m_scaleFactor * size.width());
314
m_boundingRect.setHeight(m_scaleFactor * size.height());
316
m_normalizedTransform.reset();
317
m_normalizedTransform.translate(m_boundingRect.left(), m_boundingRect.top());
318
m_normalizedTransform.scale(m_boundingRect.width(), m_boundingRect.height());
326
void PresentationView::render(int index, qreal scaleFactor)
328
QMutexLocker mutexLocker(m_mutex);
330
if(m_render->isCanceled())
335
Poppler::Page* page = m_document->page(index);
337
QImage image = page->renderToImage(scaleFactor * 72.0, scaleFactor * 72.0);
341
if(m_render->isCanceled())
346
emit imageReady(index, scaleFactor, image);
428
for(int index = 0; index < m_numberOfPages; ++index)
430
PageItem* page = m_pages.at(index);
432
if(index == m_currentPage - 1)
434
page->setVisible(true);
436
setSceneRect(page->boundingRect().translated(page->pos()));
440
page->setVisible(false);
442
page->cancelRender();
447
viewport()->update();