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

KritaWidgets

  • sources
  • kfour-appscomplete
  • krita
  • libs
  • widgets
KoZoomController.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE project
2  * SPDX-FileCopyrightText: 2007 C. Boemann <[email protected]>
3  * SPDX-FileCopyrightText: 2007 Thomas Zander <[email protected]>
4  * SPDX-FileCopyrightText: 2007 Jan Hambrecht <[email protected]>
5  * SPDX-FileCopyrightText: 2010 Boudewijn Rempt <[email protected]>
6  * SPDX-FileCopyrightText: 2011 Arjen Hiemstra <[email protected]>
7  *
8  * SPDX-License-Identifier: LGPL-2.0-or-later
9  */
10 #include <KoZoomController.h>
11 #include <KoZoomController_p.h>
12 
13 #include <kactioncollection.h>
14 #include <klocalizedstring.h>
15 #include <WidgetsDebug.h>
16 
17 #include <KoZoomHandler.h>
18 #include <KoCanvasBase.h>
19 #include <KoCanvasController.h>
20 
21 #include <QtMath>
22 
23 void KoZoomController::Private::init(KoCanvasController *co,
24  KoZoomHandler *zh,
25  KActionCollection *actionCollection)
26 {
27  canvasController = co;
28  fitMargin = co->margin();
29  zoomHandler = zh;
30  connect(action, SIGNAL(zoomChanged(KoZoomMode::Mode,qreal)),
31  parent, SLOT(setZoom(KoZoomMode::Mode,qreal)));
32  connect(action, SIGNAL(aspectModeChanged(bool)),
33  parent, SIGNAL(aspectModeChanged(bool)));
34  connect(action, SIGNAL(zoomedToSelection()),
35  parent, SIGNAL(zoomedToSelection()));
36  connect(action, SIGNAL(zoomedToAll()),
37  parent, SIGNAL(zoomedToAll()));
38 
39  actionCollection->addAction("view_zoom", action);
40 
41  connect(canvasController->proxyObject, SIGNAL(sizeChanged(QSize)), parent, SLOT(setAvailableSize()) );
42 
43  connect(canvasController->proxyObject, SIGNAL(zoomRelative(qreal,QPointF)), parent, SLOT(requestZoomRelative(qreal,QPointF)) );
44 }
45 
46 KoZoomController::KoZoomController(KoCanvasController *co, KoZoomHandler *zh, KActionCollection *actionCollection, QObject *parent)
47  : QObject(parent),
48  d(new Private(this))
49 {
50  d->init(co, zh, actionCollection);
51 }
52 
53 KoZoomController::~KoZoomController()
54 {
55  delete d;
56 }
57 
58 KoZoomAction *KoZoomController::zoomAction() const
59 {
60  return d->action;
61 }
62 
63 void KoZoomController::setZoomMode(KoZoomMode::Mode mode)
64 {
65  setZoom(mode, 1.0);
66 }
67 
68 KoZoomMode::Mode KoZoomController::zoomMode() const
69 {
70  return d->zoomHandler->zoomMode();
71 }
72 
73 void KoZoomController::setPageSize(const QSizeF &pageSize)
74 {
75  if(d->pageSize == pageSize) return;
76  d->pageSize = pageSize;
77 
78  if(d->zoomHandler->zoomMode() == KoZoomMode::ZOOM_WIDTH)
79  setZoom(KoZoomMode::ZOOM_WIDTH, 0);
80  if(d->zoomHandler->zoomMode() == KoZoomMode::ZOOM_PAGE)
81  setZoom(KoZoomMode::ZOOM_PAGE, 0);
82  if(d->zoomHandler->zoomMode() == KoZoomMode::ZOOM_HEIGHT)
83  setZoom(KoZoomMode::ZOOM_HEIGHT, 0);
84 }
85 
86 QSizeF KoZoomController::pageSize() const
87 {
88  return d->pageSize;
89 }
90 
91 void KoZoomController::setDocumentSize(const QSizeF &documentSize, bool recalculateCenter)
92 {
93  d->documentSize = documentSize;
94  d->canvasController->updateDocumentSize(documentToViewport(d->documentSize), recalculateCenter);
95 
96  // Finally ask the canvasController to recenter
97  d->canvasController->recenterPreferred();
98 }
99 
100 QSizeF KoZoomController::documentSize() const
101 {
102  return d->documentSize;
103 }
104 
105 void KoZoomController::setZoom(KoZoomMode::Mode mode, qreal zoom)
106 {
107  setZoom(mode, zoom, d->canvasController->preferredCenter());
108 }
109 
110 void KoZoomController::setZoom(KoZoomMode::Mode mode, qreal zoom, const QPointF &stillPoint)
111 {
112  setZoom(mode, zoom, d->zoomHandler->resolutionX(), d->zoomHandler->resolutionY(), stillPoint);
113 }
114 
115 void KoZoomController::setZoom(KoZoomMode::Mode mode, qreal zoom, qreal resolutionX, qreal resolutionY)
116 {
117  setZoom(mode, zoom, resolutionX, resolutionY, d->canvasController->preferredCenter());
118 }
119 
120 void KoZoomController::setZoom(KoZoomMode::Mode mode, qreal zoom, qreal resolutionX, qreal resolutionY, const QPointF &stillPoint)
121 {
122  if (d->zoomHandler->zoomMode() == mode &&
123  qFuzzyCompare(d->zoomHandler->zoom(), zoom) &&
124  qFuzzyCompare(d->zoomHandler->resolutionX(), resolutionX) &&
125  qFuzzyCompare(d->zoomHandler->resolutionY(), resolutionY)) {
126  return; // no change
127  }
128 
129  qreal oldEffectiveZoom = d->action->effectiveZoom();
130  QSizeF oldPageViewportSize = documentToViewport(d->pageSize);
131 
132  if(!qFuzzyCompare(d->zoomHandler->resolutionX(), resolutionX) ||
133  !qFuzzyCompare(d->zoomHandler->resolutionY(), resolutionY)) {
134 
135  d->zoomHandler->setResolution(resolutionX, resolutionY);
136  }
137 
138  if(mode == KoZoomMode::ZOOM_CONSTANT) {
139  if(zoom == 0.0) return;
140  d->action->setZoom(zoom);
141  }
142  else if(mode == KoZoomMode::ZOOM_WIDTH) {
143  zoom = (d->canvasController->viewportSize().width() - 2 * d->fitMargin)
144  / (oldPageViewportSize.width() / d->zoomHandler->zoom());
145  d->action->setSelectedZoomMode(mode);
146  d->action->setEffectiveZoom(zoom);
147  }
148  else if(mode == KoZoomMode::ZOOM_PAGE) {
149  zoom = (d->canvasController->viewportSize().width() - 2 * d->fitMargin)
150  / (oldPageViewportSize.width() / d->zoomHandler->zoom());
151  zoom = qMin(zoom, (d->canvasController->viewportSize().height() - 2 * d->fitMargin)
152  / (oldPageViewportSize.height() / d->zoomHandler->zoom()));
153 
154  d->action->setSelectedZoomMode(mode);
155  d->action->setEffectiveZoom(zoom);
156  }
157  else if(mode == KoZoomMode::ZOOM_HEIGHT) {
158  zoom = (d->canvasController->viewportSize().height() - 2 * d->fitMargin)
159  / (oldPageViewportSize.height() / d->zoomHandler->zoom());
160 
161  d->action->setSelectedZoomMode(mode);
162  d->action->setEffectiveZoom(zoom);
163  }
164 
165  d->zoomHandler->setZoomMode(mode);
166  d->zoomHandler->setZoom(d->action->effectiveZoom());
167 
168 #ifdef DEBUG
169  if(! d->documentSize.isValid())
170  warnWidgets << "Setting zoom while there is no document size set, this will fail";
171  else if (d->pageSize.width() > d->documentSize.width() || d->pageSize.height() > d->documentSize.height())
172  warnWidgets << "ZoomController; Your page size is larger than your document size (" <<
173  d->pageSize << " > " << d->documentSize << ")\n";
174 #endif
175 
176  QSizeF documentViewportSize = documentToViewport(d->documentSize);
177 
178  // Tell the canvasController that the zoom has changed
179  // Actually canvasController doesn't know about zoom, but the document in pixels
180  // has changed as a result of the zoom change
181  // To allow listeners of offset changes to react on the real new offset and not on the
182  // intermediate offsets, we block the signals here, and emit by ourselves later.
183  d->canvasController->proxyObject->blockSignals(true);
184  d->canvasController->updateDocumentSize(documentViewportSize, true);
185  d->canvasController->proxyObject->blockSignals(false);
186 
187  // Finally ask the canvasController to recenter
188  QPointF documentCenter;
189  if (mode == KoZoomMode::ZOOM_WIDTH || mode == KoZoomMode::ZOOM_PAGE || mode == KoZoomMode::ZOOM_HEIGHT) {
190  documentCenter = QRectF(QPointF(), documentViewportSize).center();
191  }
192  else {
193  qreal zoomCoeff = d->action->effectiveZoom() / oldEffectiveZoom;
194  QPointF oldCenter = d->canvasController->preferredCenter();
195  documentCenter = stillPoint * zoomCoeff - (stillPoint - 1.0 / zoomCoeff * oldCenter);
196  }
197  d->canvasController->setPreferredCenter(documentCenter);
198  emit zoomChanged(mode, d->action->effectiveZoom());
199 }
200 
201 QSizeF KoZoomController::documentToViewport(const QSizeF &size)
202 {
203  return d->zoomHandler->documentToView(size).toSize();
204 }
205 
206 QSize KoZoomController::documentToViewportCeil(const QSizeF &size)
207 {
208  QSizeF viewport = documentToViewport(size);
209  return QSize(qCeil(viewport.width()), qCeil(viewport.height()));
210 }
211 
212 void KoZoomController::setAspectMode(bool status)
213 {
214  if (d->action) {
215  d->action->setAspectMode(status);
216  }
217 }
218 //have to include this because of Q_PRIVATE_SLOT
219 #include <moc_KoZoomController.cpp>
QSizeF::height
qreal height() const
KoZoomController::KoZoomController
KoZoomController(KoCanvasController *controller, KoZoomHandler *zoomHandler, KActionCollection *actionCollection, QObject *parent=0)
Constructor.
Definition: KoZoomController.cpp:46
KoZoomController::pageSize
QSizeF pageSize() const
Returns the size of the current page in document coordinates.
KoZoomController_p.h
KoZoomController::setZoom
void setZoom(KoZoomMode::Mode mode, qreal zoom, qreal resolutionX, qreal resolutionY, const QPointF &stillPoint)
Set the resolution, zoom, the zoom mode for this zoom Controller.
Definition: KoZoomController.cpp:120
KoZoomHandler
This class handles the zooming and DPI stuff (conversions between postscript pt values and pixels).
Definition: KoZoomHandler.h:24
QSize
KoZoomController::setPageSize
void setPageSize(const QSizeF &pageSize)
Set the size of the current page in document coordinates which allows zoom modes that use the pageSiz...
Definition: KoZoomController.cpp:73
KoZoomHandler.h
QPointF
KoZoomController::documentToViewport
virtual QSizeF documentToViewport(const QSizeF &size)
Definition: KoZoomController.cpp:201
KoZoomController::documentToViewportCeil
QSize documentToViewportCeil(const QSizeF &size)
Definition: KoZoomController.cpp:206
QObject
KoZoomController::documentSize
QSizeF documentSize() const
Returns the size of the whole document currently being shown on the canvas.
KoZoomMode::ZOOM_HEIGHT
zoom pageheight
Definition: KoZoomMode.h:26
KoZoomMode::Mode
Mode
Definition: KoZoomMode.h:21
KoZoomController::setZoomMode
void setZoomMode(KoZoomMode::Mode mode)
Alter the current zoom mode which updates the Gui.
Definition: KoZoomController.cpp:63
warnWidgets
#define warnWidgets
Definition: WidgetsDebug.h:16
KoZoomController::setDocumentSize
void setDocumentSize(const QSizeF &documentSize, bool recalculateCenter=false)
Set the size of the whole document currently being shown on the canvas.
Definition: KoZoomController.cpp:91
QRectF::center
QPointF center() const
KoZoomController.h
KoZoomMode::ZOOM_PAGE
zoom to pagesize
Definition: KoZoomMode.h:25
WidgetsDebug.h
KoZoomMode::ZOOM_CONSTANT
zoom x %
Definition: KoZoomMode.h:23
QSizeF
KoZoomMode::ZOOM_WIDTH
zoom pagewidth
Definition: KoZoomMode.h:24
QRectF
Private
KoZoomController::setAspectMode
void setAspectMode(bool status)
Set Aspect Mode button status and begin a chain of signals.
Definition: KoZoomController.cpp:212
KoZoomController::zoomChanged
void zoomChanged(KoZoomMode::Mode mode, qreal zoom)
This signal is emitted whenever either the zoommode or the zoom level is changed by the user.
KoZoomController::zoomMode
KoZoomMode::Mode zoomMode() const
Definition: KoZoomController.cpp:68
KoZoomController::~KoZoomController
~KoZoomController() override
destructor
Definition: KoZoomController.cpp:53
KoZoomController::zoomAction
KoZoomAction * zoomAction() const
returns the zoomAction that is maintained by this controller
Definition: KoZoomController.cpp:58
QSizeF::width
qreal width() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Sat Jan 23 2021 11:48:23 by doxygen 1.8.16 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KritaWidgets

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

krita API Reference

Skip menu "krita API Reference"
  • libs
  •   KritaBasicFlakes
  •   brush
  •   KritaUndo2
  •   KritaFlake
  •   image
  •   KritaPlugin
  •   Krita
  •   KritaPigment
  •   KritaResources
  •   KritaStore
  •   ui
  •   KritaWidgets
  •   KritaWidgetUtils
  • plugins
  •   Assitants
  •   Extensions
  •   Filters
  •   Generators
  •   Formats
  •           src
  •   PaintOps
  •     libpaintop

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