11#include <QTabletEvent>
13#include <klocalizedstring.h>
38 using namespace std::placeholders;
40 std::function<
void (QPoint)> callback(
70 q->
proxyObject->emitDocumentMousePositionChanged(documentPos);
71 q->
proxyObject->emitCanvasMousePositionChanged(pointerPos);
137 QWidget *canvasWidget =
canvas->canvasWidget();
138 const QPointF cursorPosWidget = canvasWidget->mapFromGlobal(QCursor::pos());
166 if (!canvas || !
canvas->canvasWidget() ||
canvas->canvasWidget() != watched)
return false;
168 if (event->type() == QEvent::MouseMove) {
169 QMouseEvent *mevent =
static_cast<QMouseEvent*
>(event);
171 }
else if (event->type() == QEvent::TabletMove) {
172 QTabletEvent *tevent =
static_cast<QTabletEvent*
>(event);
174 }
else if (event->type() == QEvent::FocusIn) {
175 m_d->
view->syncLastActiveNodeToDocument();
183 const QRect currentVisible = viewport()->rect();
186 if (!viewRect.isValid() || currentVisible.contains(viewRect))
190 int jumpWidth = smooth ? 0 : currentVisible.width() / 5;
191 int jumpHeight = smooth ? 0 : currentVisible.height() / 5;
192 if (!smooth && viewRect.width() + jumpWidth > currentVisible.width())
194 if (!smooth && viewRect.height() + jumpHeight > currentVisible.height())
197 int horizontalMove = 0;
198 if (currentVisible.width() <= viewRect.width())
199 horizontalMove = viewRect.center().x() - currentVisible.center().x();
200 else if (currentVisible.x() > viewRect.x())
201 horizontalMove = viewRect.x() - currentVisible.x() - jumpWidth;
202 else if (currentVisible.right() < viewRect.right())
203 horizontalMove = viewRect.right() - qMax(0, currentVisible.right() - jumpWidth);
205 int verticalMove = 0;
206 if (currentVisible.height() <= viewRect.height())
207 verticalMove = viewRect.center().y() - currentVisible.center().y();
208 if (currentVisible.y() > viewRect.y())
209 verticalMove = viewRect.y() - currentVisible.y() - jumpHeight;
210 else if (currentVisible.bottom() < viewRect.bottom())
211 verticalMove = viewRect.bottom() - qMax(0, currentVisible.bottom() - jumpHeight);
213 pan(QPoint(horizontalMove, verticalMove));
220 view->viewManager()->
222 i18nc(
"floating message about mirroring",
223 "Horizontal mirroring: %1 ", isXMirrored ? i18n(
"ON") : i18n(
"OFF")),
244 QVariant customPos = sender()->property(
"customPosition");
245 QPoint pos = customPos.isValid()
246 ? customPos.value<QPoint>()
249 QWidget *canvasWidget =
canvas->canvasWidget();
250 const QPointF cursorPosWidget = canvasWidget->mapFromGlobal(pos);
252 std::optional<KoViewTransformStillPoint> stillPoint;
254 if (canvasWidget->rect().contains(cursorPosWidget.toPoint())) {
271 qreal rotationAngle = coordinatesConverter->rotationAngle();
273 if (rotationAngle > -0.05 && rotationAngle < 0.05) {
276 view->viewManager()->
277 showFloatingRotationMessage(
278 i18nc(
"floating message about rotation",
"Rotation: %1° ",
294 if(isNativeGesture) {
338 Q_ASSERT(kritaCanvas);
341 m_d->
view->viewManager()->showFloatingMessage(i18n(
"You are activating wrap-around mode, but have not enabled OpenGL.\n"
342 "To visualize wrap-around mode, enable OpenGL."), QIcon());
351 Q_ASSERT(kritaCanvas);
359 Q_ASSERT(kritaCanvas);
383 Q_ASSERT(kritaCanvas);
399 Q_ASSERT(kritaCanvas);
405 if (!
value || result) {
406 m_d->
view->viewManager()->showFloatingMessage(
407 i18n(
"Instant Preview Mode: %1", result ?
408 i18n(
"ON") : i18n(
"OFF")),
414 reason = i18n(
"Instant Preview is only supported with OpenGL activated");
418 QString filteringMode =
420 i18n(
"Bilinear") : i18n(
"Nearest Neighbour");
421 reason = i18n(
"Instant Preview is supported\n in Trilinear or High Quality filtering modes.\nCurrent mode is %1", filteringMode);
424 m_d->
view->viewManager()->showFloatingMessage(
425 i18n(
"Failed activating Instant Preview mode!\n\n%1", reason),
435 Q_ASSERT(kritaCanvas);
456 Q_ASSERT(kritaCanvas);
462 float panX = config.
getFloat(
"panX", center.x());
463 float panY = config.
getFloat(
"panY", center.y());
614 QScrollBar *hScroll = horizontalScrollBar();
615 QScrollBar *vScroll = verticalScrollBar();
617 QSignalBlocker b1(hScroll);
618 QSignalBlocker b2(vScroll);
620 hScroll->setRange(minOffset.x(), maxOffset.x());
621 hScroll->setValue(offset.x());
622 vScroll->setRange(minOffset.y(), maxOffset.y());
623 vScroll->setValue(offset.y());
625 const int drawH = viewport()->height() / 4;
626 const int drawW = viewport()->width() / 4;
627 const int fontHeight = QFontMetrics(font()).height();
629 vScroll->setPageStep(drawH);
630 vScroll->setSingleStep(fontHeight);
631 hScroll->setPageStep(drawW);
632 hScroll->setSingleStep(fontHeight);
float value(const T *src, size_t ch)
constexpr qreal POINT_TO_INCH(qreal px)
void setLodPreferredInCanvas(bool value)
bool wrapAroundViewingMode() const
void setWrapAroundViewingMode(bool value)
KisCoordinatesConverter * coordinatesConverter
KisImageWSP image() const
WrapAroundAxis wrapAroundViewingModeAxis() const
bool canvasIsOpenGL() const override
bool lodPreferredInCanvas() const
void setWrapAroundViewingModeAxis(WrapAroundAxis value)
bool eventFilter(QObject *watched, QEvent *event) override
void zoomInImpl(const std::optional< KoViewTransformStillPoint > &stillPoint)
void syncOnImageResolutionChange()
void mirrorCanvas(bool enable)
void slotSetWrapAroundModeAxisHV()
void saveCanvasState(KisPropertiesConfiguration &config) const
void updateCanvasOffsetInternal(const QPointF &newOffset) override
void keyPressEvent(QKeyEvent *event) override
void slotSetWrapAroundModeAxisV()
void syncOnReferencesChange(const QRectF &referencesRect)
void setPreferredCenter(const QPointF &viewPoint) override
void mirrorCanvasImpl(const std::optional< KoViewTransformStillPoint > &stillPoint, bool enable)
WrapAroundAxis wrapAroundModeAxis() const
void slotSetWrapAroundModeAxisH()
void updateCanvasWidgetSizeInternal(const QSize &newSize, qreal devicePixelRatio) override
void ensureVisibleDoc(const QRectF &docRect, bool smooth) override
Scrolls the content of the canvas so that the given rect is visible.
void updateScreenResolution(QWidget *parentWidget)
void slotToggleLevelOfDetailMode(bool value)
KoZoomState zoomState() const override
void resetScrollBars() override
void setUsePrintResolutionMode(bool value)
bool wrapAroundMode() const
void setCanvas(KoCanvasBase *canvas) override
void syncOnImageSizeChange(const QPointF &oldStillPoint, const QPointF &newStillPoint)
bool levelOfDetailMode() const
KisCanvasController(QPointer< KisView >parent, KoCanvasSupervisor *observerProvider, KisKActionCollection *actionCollection)
bool usePrintResolutionMode()
void resetCanvasRotation()
void zoomOutImpl(const std::optional< KoViewTransformStillPoint > &stillPoint)
void updateCanvasZoomInternal(KoZoomMode::Mode mode, qreal zoom, qreal resolutionX, qreal resolutionY, const std::optional< KoViewTransformStillPoint > &docStillPoint) override
void slotToggleWrapAroundMode(bool value)
qreal effectiveCanvasResolutionY() const
void mirrorCanvasAroundCanvas(bool enable)
void wheelEvent(QWheelEvent *event) override
KisCanvasState canvasState() const override
void mirrorCanvasAroundCursor(bool enable)
void rotateCanvasLeft15()
void activate() override
Reimplemented from KoCanvasController.
void slotTogglePixelGrid(bool value)
QPointF currentCursorPosition() const override
void beginCanvasRotation()
void rotateCanvasRight15()
void sigUsePrintResolutionModeChanged(bool value)
void zoomToInternal(const QRect &viewRect) override
qreal effectiveCanvasResolutionX() const
void rotateCanvas(qreal angle, const std::optional< KoViewTransformStillPoint > &stillPoint, bool isNativeGesture=false)
void restoreCanvasState(const KisPropertiesConfiguration &config)
~KisCanvasController() override
void slotSetWrapAroundModeAxis(WrapAroundAxis axis)
QPointF preferredCenter() const override
Returns the currently set preferred center point in view coordinates (pixels)
KoZoomState zoomState() const
static KisCanvasState fromConverter(const KisCoordinatesConverter &converter)
static KisConfigNotifier * instance()
void notifyPixelGridModeChanged()
void enablePixelGrid(bool v) const
QPoint documentOffset() const
QPointF widgetCenterPoint() const
void setDevicePixelRatio(qreal value)
bool xAxisMirrored() const
_Private::Traits< T >::Result widgetToDocument(const T &obj) const
QPoint maximumOffset() const
void setZoom(qreal zoom) override
void resetRotation(const std::optional< KoViewTransformStillPoint > &stillPoint)
resets canvas rotation
static qreal findNextZoom(qreal currentZoom, const QVector< qreal > &zoomLevels)
QRectF imageRectInDocumentPixels() const
_Private::Traits< T >::Result documentToWidget(const T &obj) const
void enableNatureGestureFlag()
void setCanvasWidgetSizeKeepZoom(const QSizeF &size)
QRectF imageRectInWidgetPixels() const
void setExtraReferencesBounds(const QRect &imageRect)
void setImageResolution(qreal xRes, qreal yRes)
void setImageBounds(const QRect &rect, const QPointF oldImageStillPoint, const QPointF newImageStillPoint)
void setDocumentOffset(const QPointF &offset)
QVector< qreal > standardZoomLevels() const
qreal rotationAngle() const
void rotate(const std::optional< KoViewTransformStillPoint > &stillPoint, qreal angle)
rotates the canvas
KoViewTransformStillPoint makeWidgetStillPoint(const QPointF &viewPoint) const override
Creates a still point that links the viewPoint of the widget to the corresponding point of the image.
KoViewTransformStillPoint makeDocStillPoint(const QPointF &docPoint) const override
Creates a still point that links the docPoint of the image (in document pixels!) to the corresponding...
static qreal findPrevZoom(qreal currentZoom, const QVector< qreal > &zoomLevels)
void mirror(const std::optional< KoViewTransformStillPoint > &stillPoint, bool mirrorXAxis, bool mirrorYAxis)
mirrors the canvas
void zoomTo(const QRectF &widgetRect)
QPoint minimumOffset() const
QPointF imageCenterInWidgetPixel() const
void setWrapAroundModeAxis(WrapAroundAxis value)
QRect bounds() const override
void setWrapAroundModePermitted(bool value)
A container for a set of QAction objects.
QPointer< KoCanvasControllerProxyObject > proxyObject
KisKActionCollection * actionCollection
KoZoomMode::Mode zoomMode() const
void zoom(qreal *zoomX, qreal *zoomY) const override
static bool qFuzzyCompare(half p1, half p2)
static const int gRulersUpdateDelay
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
QString KRITAIMAGE_EXPORT prettyFormatReal(qreal value)
bool usePrintResolutionMode
void showMirrorStateOnCanvas()
KisCoordinatesConverter * coordinatesConverter
QScopedPointer< KisSignalCompressorWithParam< QPoint > > mousePositionCompressor
void emitPointerPositionChangedSignals(QPoint pointerPos)
void showRotationValueOnCanvas()
Private(KisCanvasController *qq)
virtual void setProperty(const QString &name, const QVariant &value)
bool getBool(const QString &name, bool def=false) const
int getInt(const QString &name, int def=0) const
float getFloat(const QString &name, float def=0.0) const