• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdegraphics API Reference
  • KDE Home
  • Contact Us
 

okular

  • sources
  • kde-4.14
  • kdegraphics
  • okular
  • active
  • components
pageitem.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2012 by Marco Martin <mart@kde.org>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2,
7  * or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details
13  *
14  * You should have received a copy of the GNU General Public
15  * License along with this program; if not, write to the
16  * Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  */
19 
20 #include "pageitem.h"
21 #include "documentitem.h"
22 
23 #include <QPainter>
24 #include <QTimer>
25 #include <QStyleOptionGraphicsItem>
26 
27 #include <core/bookmarkmanager.h>
28 #include <core/document.h>
29 #include <core/generator.h>
30 #include <core/page.h>
31 
32 #include "ui/pagepainter.h"
33 #include "ui/priorities.h"
34 #include "settings.h"
35 
36 #define REDRAW_TIMEOUT 250
37 
38 PageItem::PageItem(QDeclarativeItem *parent)
39  : QDeclarativeItem(parent),
40  Okular::View( QString::fromLatin1( "PageView" ) ),
41  m_page(0),
42  m_smooth(false),
43  m_intentionalDraw(false),
44  m_bookmarked(false),
45  m_isThumbnail(false)
46 {
47  setFlag(QGraphicsItem::ItemHasNoContents, false);
48 
49  m_viewPort.rePos.enabled = true;
50 
51  m_redrawTimer = new QTimer(this);
52  m_redrawTimer->setInterval(REDRAW_TIMEOUT);
53  m_redrawTimer->setSingleShot(true);
54  connect(m_redrawTimer, SIGNAL(timeout()), this, SLOT(delayedRedraw()));
55 }
56 
57 
58 PageItem::~PageItem()
59 {
60 }
61 
62 void PageItem::setFlickable(QDeclarativeItem *flickable)
63 {
64  if (m_flickable.data() == flickable) {
65  return;
66  }
67 
68  //check the object can act as a flickable
69  if (!flickable->property("contentX").isValid() ||
70  !flickable->property("contentY").isValid()) {
71  return;
72  }
73 
74  if (m_flickable) {
75  disconnect(m_flickable.data(), 0, this, 0);
76  }
77 
78  //check the object can act as a flickable
79  if (!flickable->property("contentX").isValid() ||
80  !flickable->property("contentY").isValid()) {
81  m_flickable.clear();
82  return;
83  }
84 
85  m_flickable = flickable;
86 
87  if (flickable) {
88  connect(flickable, SIGNAL(contentXChanged()), this, SLOT(contentXChanged()));
89  connect(flickable, SIGNAL(contentYChanged()), this, SLOT(contentYChanged()));
90  }
91 
92  emit flickableChanged();
93 }
94 
95 QDeclarativeItem *PageItem::flickable() const
96 {
97  return m_flickable.data();
98 }
99 
100 DocumentItem *PageItem::document() const
101 {
102  return m_documentItem.data();
103 }
104 
105 void PageItem::setDocument(DocumentItem *doc)
106 {
107  if (doc == m_documentItem.data() || !doc) {
108  return;
109  }
110 
111  m_page = 0;
112  disconnect(doc, 0, this, 0);
113  m_documentItem = doc;
114  Observer *observer = m_isThumbnail ? m_documentItem.data()->thumbnailObserver() : m_documentItem.data()->pageviewObserver();
115  connect(observer, SIGNAL(pageChanged(int, int)), this, SLOT(pageHasChanged(int, int)));
116  connect(doc->document()->bookmarkManager(), SIGNAL(bookmarksChanged(KUrl)),
117  this, SLOT(checkBookmarksChanged()));
118  setPageNumber(0);
119  emit documentChanged();
120  m_redrawTimer->start();
121 
122  connect(doc, SIGNAL(pathChanged()), this, SLOT(documentPathChanged()));
123 }
124 
125 int PageItem::pageNumber() const
126 {
127  return m_viewPort.pageNumber;
128 }
129 
130 void PageItem::setPageNumber(int number)
131 {
132  if ((m_page && m_viewPort.pageNumber == number) ||
133  !m_documentItem ||
134  !m_documentItem.data()->isOpened() ||
135  number < 0 ||
136  (uint)number >= m_documentItem.data()->document()->pages()) {
137  return;
138  }
139 
140  m_viewPort.pageNumber = number;
141  m_page = m_documentItem.data()->document()->page(number);
142 
143  emit pageNumberChanged();
144  emit implicitWidthChanged();
145  emit implicitHeightChanged();
146  checkBookmarksChanged();
147  m_redrawTimer->start();
148 }
149 
150 int PageItem::implicitWidth() const
151 {
152  if (m_page) {
153  return m_page->width();
154  }
155  return 0;
156 }
157 
158 int PageItem::implicitHeight() const
159 {
160  if (m_page) {
161  return m_page->height();
162  }
163  return 0;
164 }
165 
166 void PageItem::setSmooth(const bool smooth)
167 {
168  if (smooth == m_smooth) {
169  return;
170  }
171  m_smooth = smooth;
172  update();
173 }
174 
175 bool PageItem::smooth() const
176 {
177  return m_smooth;
178 }
179 
180 bool PageItem::isBookmarked()
181 {
182  return m_bookmarked;
183 }
184 
185 void PageItem::setBookmarked(bool bookmarked)
186 {
187  if (!m_documentItem) {
188  return;
189  }
190 
191  if (bookmarked == m_bookmarked) {
192  return;
193  }
194 
195  if (bookmarked) {
196  m_documentItem.data()->document()->bookmarkManager()->addBookmark(m_viewPort);
197  } else {
198  m_documentItem.data()->document()->bookmarkManager()->removeBookmark(m_viewPort.pageNumber);
199  }
200  m_bookmarked = bookmarked;
201  emit bookmarkedChanged();
202 }
203 
204 QStringList PageItem::bookmarks() const
205 {
206  QStringList list;
207  foreach(const KBookmark &bookmark, m_documentItem.data()->document()->bookmarkManager()->bookmarks(m_viewPort.pageNumber)) {
208  list << bookmark.url().prettyUrl();
209  }
210  return list;
211 }
212 
213 void PageItem::goToBookmark(const QString &bookmark)
214 {
215  Okular::DocumentViewport viewPort(KUrl(bookmark).htmlRef());
216  setPageNumber(viewPort.pageNumber);
217 
218  //Are we in a flickable?
219  if (m_flickable) {
220  //normalizedX is a proportion, so contentX will be the difference between document and viewport times normalizedX
221  m_flickable.data()->setProperty("contentX", qMax((qreal)0, width() - m_flickable.data()->width()) * viewPort.rePos.normalizedX);
222 
223  m_flickable.data()->setProperty("contentY", qMax((qreal)0, height() - m_flickable.data()->height()) * viewPort.rePos.normalizedY);
224  }
225 }
226 
227 QPointF PageItem::bookmarkPosition(const QString &bookmark) const
228 {
229  Okular::DocumentViewport viewPort(KUrl(bookmark).htmlRef());
230 
231  if (viewPort.pageNumber != m_viewPort.pageNumber) {
232  return QPointF(-1, -1);
233  }
234 
235  return QPointF(qMax((qreal)0, width() - m_flickable.data()->width()) * viewPort.rePos.normalizedX,
236  qMax((qreal)0, height() - m_flickable.data()->height()) * viewPort.rePos.normalizedY);
237 }
238 
239 void PageItem::setBookmarkAtPos(qreal x, qreal y)
240 {
241  Okular::DocumentViewport viewPort(m_viewPort);
242  viewPort.rePos.normalizedX = x;
243  viewPort.rePos.normalizedY = y;
244 
245  m_documentItem.data()->document()->bookmarkManager()->addBookmark(viewPort);
246 
247  if (!m_bookmarked) {
248  m_bookmarked = true;
249  emit bookmarkedChanged();
250  }
251 
252  emit bookmarksChanged();
253 }
254 
255 void PageItem::removeBookmarkAtPos(qreal x, qreal y)
256 {
257  Okular::DocumentViewport viewPort(m_viewPort);
258  viewPort.rePos.enabled = true;
259  viewPort.rePos.normalizedX = x;
260  viewPort.rePos.normalizedY = y;
261 
262  m_documentItem.data()->document()->bookmarkManager()->addBookmark(viewPort);
263 
264  if (m_bookmarked && m_documentItem.data()->document()->bookmarkManager()->bookmarks(m_viewPort.pageNumber).count() == 0) {
265  m_bookmarked = false;
266  emit bookmarkedChanged();
267  }
268 
269  emit bookmarksChanged();
270 }
271 
272 void PageItem::removeBookmark(const QString &bookmark)
273 {
274  m_documentItem.data()->document()->bookmarkManager()->removeBookmark(bookmark);
275  emit bookmarksChanged();
276 }
277 
278 //Reimplemented
279 void PageItem::geometryChanged(const QRectF &newGeometry,
280  const QRectF &oldGeometry)
281 {
282  if (newGeometry.size().isEmpty()) {
283  return;
284  }
285 
286  if (newGeometry.size() != oldGeometry.size()) {
287  m_redrawTimer->start();
288  }
289 
290  QDeclarativeItem::geometryChanged(newGeometry, oldGeometry);
291  //Why aren't they automatically emuitted?
292  emit widthChanged();
293  emit heightChanged();
294 }
295 
296 void PageItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
297 {
298  if (!m_documentItem || !m_page) {
299  QDeclarativeItem::paint(painter, option, widget);
300  return;
301  }
302 
303  const bool setAA = m_smooth && !(painter->renderHints() & QPainter::Antialiasing);
304  if (setAA) {
305  painter->save();
306  painter->setRenderHint(QPainter::Antialiasing, true);
307  }
308 
309  Observer *observer = m_isThumbnail ? m_documentItem.data()->thumbnailObserver() : m_documentItem.data()->pageviewObserver();
310  const int priority = m_isThumbnail ? THUMBNAILS_PRIO : PAGEVIEW_PRIO;
311 
312  if (m_intentionalDraw) {
313  QLinkedList<Okular::PixmapRequest *> requestedPixmaps;
314  requestedPixmaps.push_back(new Okular::PixmapRequest(observer, m_viewPort.pageNumber, width(), height(), priority, Okular::PixmapRequest::Asynchronous));
315  const Okular::Document::PixmapRequestFlag prf = m_isThumbnail ? Okular::Document::NoOption : Okular::Document::RemoveAllPrevious;
316  m_documentItem.data()->document()->requestPixmaps(requestedPixmaps, prf);
317  m_intentionalDraw = false;
318  }
319  const int flags = PagePainter::Accessibility | PagePainter::Highlights | PagePainter::Annotations;
320  PagePainter::paintPageOnPainter(painter, m_page, observer, flags, width(), height(), option->exposedRect.toRect());
321 
322  if (setAA) {
323  painter->restore();
324  }
325 }
326 
327 //Protected slots
328 void PageItem::delayedRedraw()
329 {
330  if (m_documentItem && m_page) {
331  m_intentionalDraw = true;
332  update();
333  }
334 }
335 
336 void PageItem::pageHasChanged(int page, int flags)
337 {
338  if (m_viewPort.pageNumber == page) {
339  if (flags == 32) {
340  // skip bounding box updates
341  //kDebug() << "32" << m_page->boundingBox();
342  } else if (flags == Okular::DocumentObserver::Pixmap) {
343  // if pixmaps have updated, just repaint .. don't bother updating pixmaps AGAIN
344  update();
345  } else {
346  m_redrawTimer->start();
347  }
348  }
349 }
350 
351 void PageItem::checkBookmarksChanged()
352 {
353  if (!m_documentItem) {
354  return;
355  }
356 
357  bool newBookmarked = m_documentItem.data()->document()->bookmarkManager()->isBookmarked(m_viewPort.pageNumber);
358  if (m_bookmarked != newBookmarked) {
359  m_bookmarked = newBookmarked;
360  emit bookmarkedChanged();
361  }
362 
363  //TODO: check the page
364  emit bookmarksChanged();
365 }
366 
367 void PageItem::contentXChanged()
368 {
369  if (!m_flickable || !m_flickable.data()->property("contentX").isValid()) {
370  return;
371  }
372 
373  m_viewPort.rePos.normalizedX = m_flickable.data()->property("contentX").toReal() / (width() - m_flickable.data()->width());
374 }
375 
376 void PageItem::contentYChanged()
377 {
378  if (!m_flickable || !m_flickable.data()->property("contentY").isValid()) {
379  return;
380  }
381 
382  m_viewPort.rePos.normalizedY = m_flickable.data()->property("contentY").toReal() / (height() - m_flickable.data()->height());
383 }
384 
385 void PageItem::documentPathChanged()
386 {
387  m_page = 0;
388  setPageNumber(0);
389 
390  m_redrawTimer->start();
391 }
392 
393 
394 void PageItem::setIsThumbnail(bool thumbnail)
395 {
396  if (thumbnail == m_isThumbnail) {
397  return;
398  }
399 
400  m_isThumbnail = thumbnail;
401 
402  if (thumbnail) {
403  m_smooth = false;
404  }
405 
406  /*
407  m_redrawTimer->setInterval(thumbnail ? 0 : REDRAW_TIMEOUT);
408  m_redrawTimer->setSingleShot(true);
409  */
410 }
411 
412 #include "pageitem.moc"
QTimer::setInterval
void setInterval(int msec)
generator.h
PageItem::goToBookmark
Q_INVOKABLE void goToBookmark(const QString &bookmark)
loads a page bookmark and tries to ensure the bookmarked position is visible
Definition: pageitem.cpp:213
PageItem::bookmarkedChanged
void bookmarkedChanged()
QGraphicsItem::x
qreal x() const
QGraphicsItem::y
qreal y() const
QWidget
PageItem::pageNumberChanged
void pageNumberChanged()
PageItem::removeBookmark
Q_INVOKABLE void removeBookmark(const QString &bookmark)
Remove a bookmark at a given position, if any.
Definition: pageitem.cpp:272
QGraphicsItem::paint
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)=0
Okular::DocumentObserver::Pixmap
Pixmaps has been changed.
Definition: observer.h:42
QPainter::setRenderHint
void setRenderHint(RenderHint hint, bool on)
PageItem::geometryChanged
void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
Definition: pageitem.cpp:279
bookmarkmanager.h
QGraphicsItem::setFlag
void setFlag(GraphicsItemFlag flag, bool enabled)
QPainter::renderHints
RenderHints renderHints() const
PageItem::implicitHeight
int implicitHeight() const
PageItem::removeBookmarkAtPos
Q_INVOKABLE void removeBookmarkAtPos(qreal x, qreal y)
Remove a bookmark ar a given position of the current page (if present)
Definition: pageitem.cpp:255
Okular::Document::bookmarkManager
BookmarkManager * bookmarkManager() const
Returns the bookmark manager of the document.
Definition: document.cpp:3511
QRectF::size
QSizeF size() const
QPainter::save
void save()
Okular::Document::NoOption
No options.
Definition: document.h:356
pageitem.h
QWeakPointer::data
T * data() const
Okular::DocumentViewport::enabled
bool enabled
Definition: document.h:1064
documentitem.h
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
PageItem::setSmooth
void setSmooth(bool smooth)
Definition: pageitem.cpp:166
DocumentItem
Definition: documentitem.h:37
QGraphicsItem::update
void update(const QRectF &rect)
page.h
PageItem::setDocument
void setDocument(DocumentItem *doc)
Definition: pageitem.cpp:105
QPointF
PageItem::~PageItem
~PageItem()
Definition: pageitem.cpp:58
QLinkedList< Okular::PixmapRequest * >
Okular::Page::height
double height() const
Returns the height of the page.
Definition: page.cpp:169
PageItem::flickableChanged
void flickableChanged()
PageItem::documentChanged
void documentChanged()
QSizeF::isEmpty
bool isEmpty() const
Okular::Document::PixmapRequestFlag
PixmapRequestFlag
Describes the possible options for the pixmap requests.
Definition: document.h:354
QObject::property
QVariant property(const char *name) const
QTimer
QLinkedList::push_back
void push_back(const T &value)
QPainter
PageItem::bookmarked
bool bookmarked
True if the page contains at least a bookmark.
Definition: pageitem.h:76
PageItem::pageNumber
int pageNumber() const
PageItem::flickable
QDeclarativeItem * flickable() const
Okular::Page::width
double width() const
Returns the width of the page.
Definition: page.cpp:164
document.h
QString
QGraphicsItem::flags
GraphicsItemFlags flags() const
QWeakPointer::clear
void clear()
DocumentItem::document
Okular::Document * document()
Definition: documentitem.cpp:194
QStringList
PageItem::setPageNumber
void setPageNumber(int number)
Definition: pageitem.cpp:130
QDeclarativeItem::geometryChanged
virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
Okular::DocumentViewport::pageNumber
int pageNumber
The number of the page nearest the center of the viewport.
Definition: document.h:1048
PageItem::implicitHeightChanged
void implicitHeightChanged()
Okular::DocumentViewport::rePos
struct Okular::DocumentViewport::@0 rePos
If 'rePos.enabled == true' then this structure contains the viewport center or top left depending on ...
PageItem::bookmarkPosition
Q_INVOKABLE QPointF bookmarkPosition(const QString &bookmark) const
Returns the position in the page for a bookmark QPointF(-1,-1) if doesn't belong to this page...
Definition: pageitem.cpp:227
Observer
Definition: documentitem.h:167
PageItem::setIsThumbnail
void setIsThumbnail(bool thumbnail)
Definition: pageitem.cpp:394
PageItem::implicitWidth
int implicitWidth() const
PageItem::PageItem
PageItem(QDeclarativeItem *parent=0)
Definition: pageitem.cpp:38
PageItem::setFlickable
void setFlickable(QDeclarativeItem *flickable)
Definition: pageitem.cpp:62
QPainter::restore
void restore()
Okular::DocumentViewport::normalizedX
double normalizedX
Definition: document.h:1065
PageItem::document
DocumentItem * document() const
Okular::DocumentViewport::normalizedY
double normalizedY
Definition: document.h:1066
QRectF
PageItem::setBookmarked
void setBookmarked(bool bookmarked)
Definition: pageitem.cpp:185
QTimer::start
void start(int msec)
QStyleOptionGraphicsItem
QVariant::isValid
bool isValid() const
QDeclarativeItem
Okular::DocumentViewport
A view on the document.
Definition: document.h:1016
PageItem::paint
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Definition: pageitem.cpp:296
PageItem::isBookmarked
bool isBookmarked()
Definition: pageitem.cpp:180
PageItem::bookmarks
QStringList bookmarks() const
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Okular::PixmapRequest::Asynchronous
Definition: generator.h:584
PageItem::setBookmarkAtPos
Q_INVOKABLE void setBookmarkAtPos(qreal x, qreal y)
Add a new bookmark ar a given position of the current page.
Definition: pageitem.cpp:239
PageItem::bookmarksChanged
void bookmarksChanged()
REDRAW_TIMEOUT
#define REDRAW_TIMEOUT
Definition: pageitem.cpp:36
PageItem::smooth
bool smooth() const
Okular::PixmapRequest
Describes a pixmap type request.
Definition: generator.h:575
Okular::Document::RemoveAllPrevious
Remove all the previous requests, even for non requested page pixmaps.
Definition: document.h:357
QTimer::setSingleShot
void setSingleShot(bool singleShot)
PageItem::implicitWidthChanged
void implicitWidthChanged()
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:19:25 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

okular

Skip menu "okular"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdegraphics API Reference

Skip menu "kdegraphics API Reference"
  •     libkdcraw
  •     libkexiv2
  •     libkipi
  •     libksane
  • okular

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal