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();
272 view->viewManager()->
274 i18nc(
"floating message about rotation",
"Rotation: %1° ",
291 if(isNativeGesture) {
335 Q_ASSERT(kritaCanvas);
338 m_d->
view->viewManager()->showFloatingMessage(i18n(
"You are activating wrap-around mode, but have not enabled OpenGL.\n"
339 "To visualize wrap-around mode, enable OpenGL."), QIcon());
348 Q_ASSERT(kritaCanvas);
356 Q_ASSERT(kritaCanvas);
380 Q_ASSERT(kritaCanvas);
396 Q_ASSERT(kritaCanvas);
402 if (!
value || result) {
403 m_d->
view->viewManager()->showFloatingMessage(
404 i18n(
"Instant Preview Mode: %1", result ?
405 i18n(
"ON") : i18n(
"OFF")),
411 reason = i18n(
"Instant Preview is only supported with OpenGL activated");
415 QString filteringMode =
417 i18n(
"Bilinear") : i18n(
"Nearest Neighbour");
418 reason = i18n(
"Instant Preview is supported\n in Trilinear or High Quality filtering modes.\nCurrent mode is %1", filteringMode);
421 m_d->
view->viewManager()->showFloatingMessage(
422 i18n(
"Failed activating Instant Preview mode!\n\n%1", reason),
432 Q_ASSERT(kritaCanvas);
453 Q_ASSERT(kritaCanvas);
459 float panX = config.
getFloat(
"panX", center.x());
460 float panY = config.
getFloat(
"panY", center.y());
610 QScrollBar *hScroll = horizontalScrollBar();
611 QScrollBar *vScroll = verticalScrollBar();
613 QSignalBlocker b1(hScroll);
614 QSignalBlocker b2(vScroll);
616 hScroll->setRange(minOffset.x(), maxOffset.x());
617 hScroll->setValue(offset.x());
618 vScroll->setRange(minOffset.y(), maxOffset.y());
619 vScroll->setValue(offset.y());
621 const int drawH = viewport()->height() / 4;
622 const int drawW = viewport()->width() / 4;
623 const int fontHeight = QFontMetrics(font()).height();
625 vScroll->setPageStep(drawH);
626 vScroll->setSingleStep(fontHeight);
627 hScroll->setPageStep(drawW);
628 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 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 updateCanvasWidgetSizeInternal(const QSize &newSize) 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