Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_zoom_manager.cc
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006, 2010 Boudewijn Rempt <boud@valdyas.org>
3 * SPDX-FileCopyrightText: 2009 Lukáš Tvrdý <lukast.dev@gmail.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8#include "kis_zoom_manager.h"
9
10
11#include <QGridLayout>
12
13#include <kactioncollection.h>
14#include <ktoggleaction.h>
15#include <kis_debug.h>
16
17#include <KisView.h>
18#include <KoZoomAction.h>
19#include <KoRuler.h>
20#include <KoZoomHandler.h>
22#include <KoUnit.h>
23
24#include "KisDocument.h"
25#include "KisViewManager.h"
26#include "canvas/kis_canvas2.h"
28#include "kis_image.h"
29#include "kis_statusbar.h"
30#include "kis_config.h"
31#include "krita_utils.h"
34#include "kis_guides_config.h"
35#include "kis_guides_manager.h"
36#include <kis_config_notifier.h>
37
38
39// A delay longer than 80 ms is needed for a visibly smoother canvas updates
40// (due to the canvas getting affected by the frequent ruler updates).
41static constexpr int guiUpdateDelay = 160;
42
44 KoCanvasController * canvasController)
45 : m_view(view)
46 , m_zoomHandler(zoomHandler)
47 , m_canvasController(canvasController)
48 , m_zoomChangedCompressor(guiUpdateDelay, KisSignalCompressor::FIRST_ACTIVE)
49 , m_documentRectChangedCompressor(guiUpdateDelay, KisSignalCompressor::FIRST_ACTIVE)
50 , m_previousZoomMode(KoZoomMode::ZOOM_PAGE)
51 , m_previousZoomPoint(QPointF(0.0, 0.0))
52{
53}
54
61
63{
64
65 KisImageWSP image = m_view->image();
66 if (!image) return;
67
68 m_zoomAction = new KoZoomAction(i18n("Zoom"), this);
70
72 [this](KoZoomMode::Mode mode, qreal zoom) {
73 m_canvasController->setZoom(mode, zoom);
74 });
77
78 // Put the canvascontroller in a layout so it resizes with us
79 QGridLayout * layout = new QGridLayout(m_view);
80 layout->setSpacing(0);
81 layout->setContentsMargins(0, 0, 0, 0);
82
83 m_view->document()->setUnit(KoUnit(KoUnit::Pixel));
84
85 m_horizontalRuler = new KoRuler(m_view, Qt::Horizontal, m_zoomHandler);
88 m_horizontalRuler->setVisible(false); // this prevents the rulers from flashing on to off when a new document is created
89
90 m_verticalRuler = new KoRuler(m_view, Qt::Vertical, m_zoomHandler);
93 m_verticalRuler->setVisible(false);
94
95
96 QAction *rulerAction = actionCollection->action("ruler_pixel_multiple2");
97 if (m_view->document()->guidesConfig().rulersMultiple2()) {
100 }
101 QList<QAction*> unitActions = m_view->createChangeUnitActions(true);
102 unitActions.append(rulerAction);
105
106 connect(m_view->document(), SIGNAL(unitChanged(KoUnit)), SLOT(applyRulersUnit(KoUnit)));
107 connect(rulerAction, SIGNAL(toggled(bool)), SLOT(setRulersPixelMultiple2(bool)));
108 applyRulersUnit(m_view->document()->unit());
109
110 layout->addWidget(m_horizontalRuler, 0, 1);
111 layout->addWidget(m_verticalRuler, 1, 0);
112 layout->addWidget(static_cast<KoCanvasControllerWidget*>(m_canvasController), 1, 1);
113
119 this,
123 this,
125
129}
130
132{
133 const QRectF docRect = m_view->canvasBase()->coordinatesConverter()->imageRectInDocumentPixels();
134 const QPointF docCenter = docRect.center();
135
136 KoSnapGuide *snapGuide = m_view->canvasBase()->snapGuide();
137
138 {
139 KisSnapLineStrategy *boundsSnap =
141
142 boundsSnap->addLine(Qt::Horizontal, docRect.y());
143 boundsSnap->addLine(Qt::Horizontal, docRect.bottom());
144 boundsSnap->addLine(Qt::Vertical, docRect.x());
145 boundsSnap->addLine(Qt::Vertical, docRect.right());
146
148 }
149
150 {
151 KisSnapLineStrategy *centerSnap =
153
154 centerSnap->addLine(Qt::Horizontal, docCenter.y());
155 centerSnap->addLine(Qt::Vertical, docCenter.x());
156
158 }
159}
160
165
167{
168 const qreal effectiveZoom =
169 m_view->canvasBase()->coordinatesConverter()->effectiveZoom();
170 const qreal effectivePhysicalZoom =
171 m_view->canvasBase()->coordinatesConverter()->effectivePhysicalZoom();
172
173 m_view->canvasBase()->resourceManager()->setResource(KoCanvasResource::EffectiveZoom, effectiveZoom);
174 m_view->canvasBase()->resourceManager()->setResource(KoCanvasResource::EffectivePhysicalZoom, effectivePhysicalZoom);
175}
176
178{
179 bool value = m_horizontalRuler->isVisible() &&
180 m_verticalRuler->isVisible() &&
183
185
186 if (value) {
188 SIGNAL(canvasMousePositionChanged(QPoint)),
189 this,
190 SLOT(mousePositionChanged(QPoint)));
191 }
192}
193
198
203
204void KisZoomManager::mousePositionChanged(const QPoint &viewPos)
205{
206 QPoint pt = viewPos - m_cachedRulersRect.topLeft();
207
210}
211
213{
214 m_horizontalRuler->setVisible(show);
215 m_verticalRuler->setVisible(show);
217}
218
225
227{
228 if (m_view && m_view->image()) {
229 m_horizontalRuler->setUnit(KoUnit(baseUnit.type(), m_view->image()->xRes()));
230 m_verticalRuler->setUnit(KoUnit(baseUnit.type(), m_view->image()->yRes()));
231 }
232 if (m_view->viewManager()) {
233 m_view->viewManager()->guidesManager()->setUnitType(baseUnit.type());
234 }
235}
236
238{
241 if (m_view->viewManager()) {
242 m_view->viewManager()->guidesManager()->setRulersMultiple2(enabled);
243 }
244}
245
247{
248 const qreal zoomValue = m_view->canvasBase()->coordinatesConverter()->zoom();
249 const qreal humanZoom = zoomValue * 100.0;
250
251 // XXX: KOMVC -- this is very irritating in MDI mode
252
253 if (m_view->viewManager()) {
254 m_view->viewManager()->
255 showFloatingMessage(
256 i18nc("floating message about zoom", "Zoom: %1 %",
258 QIcon(), 500, KisFloatingMessage::Low, Qt::AlignCenter);
259 }
260
262}
263
268
270{
271 return m_zoomActionWidget;
272}
273
275{
276 const QRectF widgetRect = m_view->canvasBase()->coordinatesConverter()->imageRectInWidgetPixels();
277 const QRect alignedWidgetRect = widgetRect.toAlignedRect();
278
279 if (m_cachedRulersRect == alignedWidgetRect) return;
280
282
283 // A bit weird conversion: convert the widget rect as if it were unrotated
284 const QRectF documentRect = m_view->canvasBase()->coordinatesConverter()->flakeToDocument(widgetRect);
285 const QSize documentSize = documentRect.toAlignedRect().size();
286
287 m_horizontalRuler->setRulerLength(documentSize.width());
288 m_verticalRuler->setRulerLength(documentSize.height());
289
290 m_horizontalRuler->setOffset(alignedWidgetRect.x());
291 m_verticalRuler->setOffset(alignedWidgetRect.y());
292
293 m_cachedRulersRect = alignedWidgetRect;
294}
295
300
305
310
315
324
339
341{
342 KisConfig cfg(true);
343
344 KisCoordinatesConverter *converter =
346 KIS_ASSERT_RECOVER_RETURN(converter);
347
348 const int oldZoomMarginSize = converter->zoomMarginSize();
349 if (oldZoomMarginSize != cfg.zoomMarginSize()) {
350 converter->setZoomMarginSize(cfg.zoomMarginSize());
351 if (converter->zoomMode() != KoZoomMode::ZOOM_CONSTANT) {
352 m_canvasController->setZoom(converter->zoomMode(), converter->zoom());
353 }
354 }
355}
356
357
float value(const T *src, size_t ch)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
static KisConfigNotifier * instance()
void configChanged(void)
int zoomMarginSize(bool defaultValue=false) const
A container for a set of QAction objects.
QAction * action(int index) const
void addConnection(Sender sender, Signal signal, Receiver receiver, Method method, Qt::ConnectionType type=Qt::AutoConnection)
void addLine(Qt::Orientation orientation, qreal pos)
KoRuler * m_horizontalRuler
void slotUpdateGuiAfterZoomChange()
KisSignalAutoConnectionsStore m_mouseTrackingConnections
void updateMouseTrackingConnections()
KoRuler * m_verticalRuler
KoZoomHandler * m_zoomHandler
void mousePositionChanged(const QPoint &viewPos)
KoZoomAction * zoomAction() const
KoZoomMode::Mode m_previousZoomMode
KoRuler * verticalRuler() const
KisSignalCompressor m_zoomChangedCompressor
KoRuler * horizontalRuler() const
void slotUpdateGuiAfterDocumentRectChanged()
void updateCurrentZoomResource()
void applyRulersUnit(const KoUnit &baseUnit)
void setup(KisKActionCollection *actionCollection)
void setRulersPixelMultiple2(bool enabled)
QPointer< QWidget > m_zoomActionWidget
QPointF m_previousZoomPoint
KisZoomManager(QPointer< KisView > view, KoZoomHandler *, KoCanvasController *)
void syncOnImageResolutionChange()
void setShowRulers(bool show)
KisSignalCompressor m_documentRectChangedCompressor
~KisZoomManager() override
QWidget * zoomActionWidget() const
void updateImageBoundsSnapping()
QPointer< KisView > m_view
KoZoomAction * m_zoomAction
KoCanvasController * m_canvasController
void setRulersTrackMouse(bool value)
void documentRectInWidgetPixelsChanged(const QRectF &documentRectInWidgetPixels)
void zoomStateChanged(const KoZoomState &zoomState)
virtual QPointF preferredCenter() const =0
Returns the currently set preferred center point in view coordinates (pixels)
virtual void setPreferredCenter(const QPointF &viewPoint)=0
QPointer< KoCanvasControllerProxyObject > proxyObject
virtual void zoomIn(const KoViewTransformStillPoint &stillPoint)=0
zooms in keeping stillPoint not moved.
virtual KoZoomState zoomState() const =0
virtual void setZoom(KoZoomMode::Mode mode, qreal zoom)=0
virtual void zoomOut(const KoViewTransformStillPoint &stillPoint)=0
zooms out keeping stillPoint not moved.
bool showMousePosition() const
Definition KoRuler.cpp:935
void updateMouseCoordinate(int coordinate)
Definition KoRuler.cpp:921
KoUnit unit() const
The ruler's unit.
Definition KoRuler.cpp:838
void setUnit(const KoUnit &unit)
Set the unit of the ruler.
Definition KoRuler.cpp:843
void createGuideToolConnection(KoCanvasBase *canvas)
Definition KoRuler.cpp:1359
void setRulerLength(qreal length)
Sets the length of the ruler to length in points (pt)
Definition KoRuler.cpp:865
void setUnitPixelMultiple2(bool enabled)
Definition KoRuler.cpp:1368
void setOffset(int offset)
Definition KoRuler.cpp:859
void setPopupActionList(const QList< QAction * > &popupActionList)
Definition KoRuler.cpp:1054
void setShowMousePosition(bool show)
Definition KoRuler.cpp:929
@ DocumentBoundsSnapping
Definition KoSnapGuide.h:57
@ DocumentCenterSnapping
Definition KoSnapGuide.h:58
void overrideSnapStrategy(Strategy type, KoSnapStrategy *strategy)
KoUnit::Type type() const
Definition KoUnit.h:118
@ Pixel
Definition KoUnit.h:82
QWidget * createWidget(QWidget *parent) override
void zoomChanged(KoZoomMode::Mode mode, qreal zoom)
void slotZoomStateChanged(const KoZoomState &zoomState)
KoZoomMode::Mode zoomMode() const
int zoomMarginSize() const
void setZoomMarginSize(int size)
void zoom(qreal *zoomX, qreal *zoomY) const override
@ ZOOM_CONSTANT
zoom x %
Definition KoZoomMode.h:24
@ ZOOM_PAGE
zoom page
Definition KoZoomMode.h:25
@ ZOOM_WIDTH
zoom pagewidth
Definition KoZoomMode.h:26
@ ZOOM_HEIGHT
zoom pageheight
Definition KoZoomMode.h:27
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
static constexpr int guiUpdateDelay
@ EffectiveZoom
-Used only by painting tools for non-displaying purposes
@ EffectivePhysicalZoom
-Used by tool for displaying purposes
QString KRITAIMAGE_EXPORT prettyFormatReal(qreal value)