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

okular

  • sources
  • kde-4.12
  • 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 
123 int PageItem::pageNumber() const
124 {
125  return m_viewPort.pageNumber;
126 }
127 
128 void PageItem::setPageNumber(int number)
129 {
130  if ((m_page && m_viewPort.pageNumber == number) ||
131  !m_documentItem ||
132  !m_documentItem.data()->isOpened() ||
133  number < 0 ||
134  (uint)number >= m_documentItem.data()->document()->pages()) {
135  return;
136  }
137 
138  m_viewPort.pageNumber = number;
139  m_page = m_documentItem.data()->document()->page(number);
140 
141  emit pageNumberChanged();
142  emit implicitWidthChanged();
143  emit implicitHeightChanged();
144  checkBookmarksChanged();
145  m_redrawTimer->start();
146 }
147 
148 int PageItem::implicitWidth() const
149 {
150  if (m_page) {
151  return m_page->width();
152  }
153  return 0;
154 }
155 
156 int PageItem::implicitHeight() const
157 {
158  if (m_page) {
159  return m_page->height();
160  }
161  return 0;
162 }
163 
164 void PageItem::setSmooth(const bool smooth)
165 {
166  if (smooth == m_smooth) {
167  return;
168  }
169  m_smooth = smooth;
170  update();
171 }
172 
173 bool PageItem::smooth() const
174 {
175  return m_smooth;
176 }
177 
178 bool PageItem::isBookmarked()
179 {
180  return m_bookmarked;
181 }
182 
183 void PageItem::setBookmarked(bool bookmarked)
184 {
185  if (!m_documentItem) {
186  return;
187  }
188 
189  if (bookmarked == m_bookmarked) {
190  return;
191  }
192 
193  if (bookmarked) {
194  m_documentItem.data()->document()->bookmarkManager()->addBookmark(m_viewPort);
195  } else {
196  m_documentItem.data()->document()->bookmarkManager()->removeBookmark(m_viewPort.pageNumber);
197  }
198  m_bookmarked = bookmarked;
199  emit bookmarkedChanged();
200 }
201 
202 QStringList PageItem::bookmarks() const
203 {
204  QStringList list;
205  foreach(const KBookmark &bookmark, m_documentItem.data()->document()->bookmarkManager()->bookmarks(m_viewPort.pageNumber)) {
206  list << bookmark.url().prettyUrl();
207  }
208  return list;
209 }
210 
211 void PageItem::goToBookmark(const QString &bookmark)
212 {
213  Okular::DocumentViewport viewPort(KUrl(bookmark).htmlRef());
214  setPageNumber(viewPort.pageNumber);
215 
216  //Are we in a flickable?
217  if (m_flickable) {
218  //normalizedX is a proportion, so contentX will be the difference between document and viewport times normalizedX
219  m_flickable.data()->setProperty("contentX", qMax((qreal)0, width() - m_flickable.data()->width()) * viewPort.rePos.normalizedX);
220 
221  m_flickable.data()->setProperty("contentY", qMax((qreal)0, height() - m_flickable.data()->height()) * viewPort.rePos.normalizedY);
222  }
223 }
224 
225 QPointF PageItem::bookmarkPosition(const QString &bookmark) const
226 {
227  Okular::DocumentViewport viewPort(KUrl(bookmark).htmlRef());
228 
229  if (viewPort.pageNumber != m_viewPort.pageNumber) {
230  return QPointF(-1, -1);
231  }
232 
233  return QPointF(qMax((qreal)0, width() - m_flickable.data()->width()) * viewPort.rePos.normalizedX,
234  qMax((qreal)0, height() - m_flickable.data()->height()) * viewPort.rePos.normalizedY);
235 }
236 
237 void PageItem::setBookmarkAtPos(qreal x, qreal y)
238 {
239  Okular::DocumentViewport viewPort(m_viewPort);
240  viewPort.rePos.normalizedX = x;
241  viewPort.rePos.normalizedY = y;
242 
243  m_documentItem.data()->document()->bookmarkManager()->addBookmark(viewPort);
244 
245  if (!m_bookmarked) {
246  m_bookmarked = true;
247  emit bookmarkedChanged();
248  }
249 
250  emit bookmarksChanged();
251 }
252 
253 void PageItem::removeBookmarkAtPos(qreal x, qreal y)
254 {
255  Okular::DocumentViewport viewPort(m_viewPort);
256  viewPort.rePos.enabled = true;
257  viewPort.rePos.normalizedX = x;
258  viewPort.rePos.normalizedY = y;
259 
260  m_documentItem.data()->document()->bookmarkManager()->addBookmark(viewPort);
261 
262  if (m_bookmarked && m_documentItem.data()->document()->bookmarkManager()->bookmarks(m_viewPort.pageNumber).count() == 0) {
263  m_bookmarked = false;
264  emit bookmarkedChanged();
265  }
266 
267  emit bookmarksChanged();
268 }
269 
270 void PageItem::removeBookmark(const QString &bookmark)
271 {
272  m_documentItem.data()->document()->bookmarkManager()->removeBookmark(bookmark);
273  emit bookmarksChanged();
274 }
275 
276 //Reimplemented
277 void PageItem::geometryChanged(const QRectF &newGeometry,
278  const QRectF &oldGeometry)
279 {
280  if (newGeometry.size().isEmpty()) {
281  return;
282  }
283 
284  if (newGeometry.size() != oldGeometry.size()) {
285  m_redrawTimer->start();
286  }
287 
288  QDeclarativeItem::geometryChanged(newGeometry, oldGeometry);
289  //Why aren't they automatically emuitted?
290  emit widthChanged();
291  emit heightChanged();
292 }
293 
294 void PageItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
295 {
296  if (!m_documentItem || !m_page) {
297  QDeclarativeItem::paint(painter, option, widget);
298  return;
299  }
300 
301  const bool setAA = m_smooth && !(painter->renderHints() & QPainter::Antialiasing);
302  if (setAA) {
303  painter->save();
304  painter->setRenderHint(QPainter::Antialiasing, true);
305  }
306 
307  Observer *observer = m_isThumbnail ? m_documentItem.data()->thumbnailObserver() : m_documentItem.data()->pageviewObserver();
308  const int priority = m_isThumbnail ? THUMBNAILS_PRIO : PAGEVIEW_PRIO;
309 
310  if (m_intentionalDraw) {
311  QLinkedList<Okular::PixmapRequest *> requestedPixmaps;
312  requestedPixmaps.push_back(new Okular::PixmapRequest(observer, m_viewPort.pageNumber, width(), height(), priority, Okular::PixmapRequest::Asynchronous));
313  const Okular::Document::PixmapRequestFlag prf = m_isThumbnail ? Okular::Document::NoOption : Okular::Document::RemoveAllPrevious;
314  m_documentItem.data()->document()->requestPixmaps(requestedPixmaps, prf);
315  m_intentionalDraw = false;
316  }
317  const int flags = PagePainter::Accessibility | PagePainter::Highlights | PagePainter::Annotations;
318  PagePainter::paintPageOnPainter(painter, m_page, observer, flags, width(), height(), option->exposedRect.toRect());
319 
320  if (setAA) {
321  painter->restore();
322  }
323 }
324 
325 //Protected slots
326 void PageItem::delayedRedraw()
327 {
328  if (m_documentItem && m_page) {
329  m_intentionalDraw = true;
330  update();
331  }
332 }
333 
334 void PageItem::pageHasChanged(int page, int flags)
335 {
336  if (m_viewPort.pageNumber == page) {
337  if (flags == 32) {
338  // skip bounding box updates
339  //kDebug() << "32" << m_page->boundingBox();
340  } else if (flags == Okular::DocumentObserver::Pixmap) {
341  // if pixmaps have updated, just repaint .. don't bother updating pixmaps AGAIN
342  update();
343  } else {
344  m_redrawTimer->start();
345  }
346  }
347 }
348 
349 void PageItem::checkBookmarksChanged()
350 {
351  if (!m_documentItem) {
352  return;
353  }
354 
355  bool newBookmarked = m_documentItem.data()->document()->bookmarkManager()->isBookmarked(m_viewPort.pageNumber);
356  if (m_bookmarked != newBookmarked) {
357  m_bookmarked = newBookmarked;
358  emit bookmarkedChanged();
359  }
360 
361  //TODO: check the page
362  emit bookmarksChanged();
363 }
364 
365 void PageItem::contentXChanged()
366 {
367  if (!m_flickable || !m_flickable.data()->property("contentX").isValid()) {
368  return;
369  }
370 
371  m_viewPort.rePos.normalizedX = m_flickable.data()->property("contentX").toReal() / (width() - m_flickable.data()->width());
372 }
373 
374 void PageItem::contentYChanged()
375 {
376  if (!m_flickable || !m_flickable.data()->property("contentY").isValid()) {
377  return;
378  }
379 
380  m_viewPort.rePos.normalizedY = m_flickable.data()->property("contentY").toReal() / (height() - m_flickable.data()->height());
381 }
382 
383 void PageItem::setIsThumbnail(bool thumbnail)
384 {
385  if (thumbnail == m_isThumbnail) {
386  return;
387  }
388 
389  m_isThumbnail = thumbnail;
390 
391  if (thumbnail) {
392  m_smooth = false;
393  }
394 
395  /*
396  m_redrawTimer->setInterval(thumbnail ? 0 : REDRAW_TIMEOUT);
397  m_redrawTimer->setSingleShot(true);
398  */
399 }
400 
401 #include "pageitem.moc"
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:211
PageItem::bookmarkedChanged
void bookmarkedChanged()
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:270
Okular::DocumentObserver::Pixmap
Pixmaps has been changed.
Definition: observer.h:42
PageItem::geometryChanged
void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
Definition: pageitem.cpp:277
bookmarkmanager.h
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:253
Okular::Document::bookmarkManager
BookmarkManager * bookmarkManager() const
Returns the bookmark manager of the document.
Definition: document.cpp:3493
QWidget
Okular::Document::NoOption
No options.
Definition: document.h:349
pageitem.h
Okular::DocumentViewport::enabled
bool enabled
Definition: document.h:1051
documentitem.h
PageItem::setSmooth
void setSmooth(bool smooth)
Definition: pageitem.cpp:164
DocumentItem
Definition: documentitem.h:37
page.h
PageItem::setDocument
void setDocument(DocumentItem *doc)
Definition: pageitem.cpp:105
PageItem::~PageItem
~PageItem()
Definition: pageitem.cpp:58
Okular::Page::height
double height() const
Returns the height of the page.
Definition: page.cpp:185
PageItem::flickableChanged
void flickableChanged()
PageItem::documentChanged
void documentChanged()
Okular::Document::PixmapRequestFlag
PixmapRequestFlag
Describes the possible options for the pixmap requests.
Definition: document.h:347
QDeclarativeItem
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:180
document.h
DocumentItem::document
Okular::Document * document()
Definition: documentitem.cpp:193
PageItem::setPageNumber
void setPageNumber(int number)
Definition: pageitem.cpp:128
Okular::DocumentViewport::pageNumber
int pageNumber
The number of the page nearest the center of the viewport.
Definition: document.h:1035
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:225
Observer
Definition: documentitem.h:167
PageItem::setIsThumbnail
void setIsThumbnail(bool thumbnail)
Definition: pageitem.cpp:383
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
Okular::DocumentViewport::normalizedX
double normalizedX
Definition: document.h:1052
PageItem::document
DocumentItem * document() const
Okular::DocumentViewport::normalizedY
double normalizedY
Definition: document.h:1053
PageItem::setBookmarked
void setBookmarked(bool bookmarked)
Definition: pageitem.cpp:183
Okular::DocumentViewport
A view on the document.
Definition: document.h:1003
PageItem::paint
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Definition: pageitem.cpp:294
PageItem::isBookmarked
bool isBookmarked()
Definition: pageitem.cpp:178
PageItem::bookmarks
QStringList bookmarks() const
Okular::PixmapRequest::Asynchronous
Definition: generator.h:531
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:237
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:522
Okular::Document::RemoveAllPrevious
Remove all the previous requests, even for non requested page pixmaps.
Definition: document.h:350
PageItem::implicitWidthChanged
void implicitWidthChanged()
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:45:02 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