File indexing completed on 2024-05-12 15:59:14

0001 /* This file is part of the KDE project
0002  * SPDX-FileCopyrightText: 2012 Boudewijn Rempt <boud@kogmbh.com>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 #include "KisSketchView.h"
0007 
0008 #include <QApplication>
0009 #include <QScrollBar>
0010 #include <QFileInfo>
0011 
0012 #include <kactioncollection.h>
0013 
0014 #include <KoZoomController.h>
0015 #include <KoToolManager.h>
0016 
0017 #include "KisDocument.h"
0018 #include "kis_canvas2.h"
0019 #include <kis_canvas_controller.h>
0020 #include "KisViewManager.h"
0021 #include <kis_image_signal_router.h>
0022 #include <input/kis_input_manager.h>
0023 #include <kis_canvas_resource_provider.h>
0024 #include <kis_selection_manager.h>
0025 #include <KisPart.h>
0026 #include <kis_tool_freehand.h>
0027 #include <kis_paintop_box.h>
0028 #include "KisSelectionExtras.h"
0029 
0030 #include "ProgressProxy.h"
0031 #include "DocumentManager.h"
0032 
0033 class KisSketchView::Private
0034 {
0035 public:
0036     Private( KisSketchView* qq)
0037         : q(qq)
0038     { }
0039     ~Private() {
0040         delete selectionExtras;
0041     }
0042 
0043     void imageUpdated(const QRect &updated);
0044     void documentOffsetMoved();
0045     void zoomChanged();
0046     void resetDocumentPosition();
0047     void removeNodeAsync(KisNodeSP removedNode);
0048 
0049     KisSketchView* q {nullptr};
0050 
0051     KisKActionCollection *actionCollection {nullptr};
0052 
0053     QPointer<KisDocument> doc;
0054     QPointer<KisViewManager> viewManager;
0055     QPointer<KisView> view;
0056 
0057     QPointer<KisCanvas2> canvas;
0058     KUndo2Stack* undoStack {nullptr};
0059 
0060     QWidget *canvasWidget {nullptr};
0061 
0062     QString file;
0063 
0064     KisSelectionExtras *selectionExtras {nullptr};
0065 
0066     QTimer *timer {nullptr};
0067 
0068     QTimer *loadedTimer {nullptr};
0069     QTimer *savedTimer {nullptr};
0070     QAction* undoAction {nullptr};
0071     QAction* redoAction {nullptr};
0072 
0073     unsigned char tabletEventCount {0};
0074 };
0075 
0076 KisSketchView::KisSketchView(QQuickItem* parent)
0077     : QQuickItem(parent)
0078     , d(new Private(this))
0079 {
0080     // this is just an interaction overlay, the contents are painted on the sceneview background
0081     setFlag(QQuickItem::ItemHasContents, false);
0082     // QT5TODO
0083 //     setAcceptTouchEvents(true);
0084     setAcceptedMouseButtons(Qt::LeftButton | Qt::MiddleButton | Qt::RightButton);
0085     setAcceptHoverEvents(true);
0086 
0087     d->actionCollection = new KisKActionCollection(this, "krita");
0088     d->viewManager = 0; //new KisViewManager(qApp->activeWindow(), d->actionCollection);
0089 
0090     // QT5TODO
0091 //     grabGesture(Qt::PanGesture);
0092     //grabGesture(Qt::PinchGesture);
0093 
0094     KoZoomMode::setMinimumZoom(0.1);
0095     KoZoomMode::setMaximumZoom(16.0);
0096 
0097     d->timer = new QTimer(this);
0098     d->timer->setSingleShot(true);
0099     connect(d->timer, SIGNAL(timeout()), this, SLOT(resetDocumentPosition()));
0100 
0101     d->loadedTimer = new QTimer(this);
0102     d->loadedTimer->setSingleShot(true);
0103     d->loadedTimer->setInterval(100);
0104     connect(d->loadedTimer, SIGNAL(timeout()), SIGNAL(loadingFinished()));
0105 
0106     d->savedTimer = new QTimer(this);
0107     d->savedTimer->setSingleShot(true);
0108     d->savedTimer->setInterval(100);
0109     connect(d->savedTimer, SIGNAL(timeout()), SIGNAL(savingFinished()));
0110 
0111     connect(DocumentManager::instance(), SIGNAL(aboutToDeleteDocument()), SLOT(documentAboutToBeDeleted()));
0112     connect(DocumentManager::instance(), SIGNAL(documentChanged()), SLOT(documentChanged()));
0113     connect(DocumentManager::instance()->progressProxy(), SIGNAL(valueChanged(int)), SIGNAL(progress(int)));
0114     connect(DocumentManager::instance(), SIGNAL(documentSaved()), d->savedTimer, SLOT(start()));
0115 
0116     if (DocumentManager::instance()->document()) {
0117         documentChanged();
0118     }
0119 }
0120 
0121 KisSketchView::~KisSketchView()
0122 {
0123     if (d->doc) {
0124         DocumentManager::instance()->closeDocument();
0125     }
0126     if (d->canvasWidget) {
0127     // QT5TODO
0128 //         SketchDeclarativeView *v = qobject_cast<SketchDeclarativeView*>(scene()->views().at(0));
0129 //         if (v) {
0130 //             v->setCanvasWidget(0);
0131 //             v->setDrawCanvas(false);
0132 //         }
0133     }
0134 
0135     delete d;
0136 }
0137 
0138 QObject* KisSketchView::selectionManager() const
0139 {
0140     if (!d->viewManager)
0141         return 0;
0142     return d->viewManager->selectionManager();
0143 }
0144 
0145 QObject* KisSketchView::selectionExtras() const
0146 {
0147     if (!d->selectionExtras) {
0148         d->selectionExtras = new KisSelectionExtras(d->viewManager);
0149     }
0150     return d->selectionExtras;
0151 }
0152 
0153 QObject* KisSketchView::doc() const
0154 {
0155     return d->doc;
0156 }
0157 
0158 QObject* KisSketchView::view() const
0159 {
0160     return d->viewManager;
0161 }
0162 
0163 QString KisSketchView::file() const
0164 {
0165     return d->file;
0166 }
0167 
0168 QString KisSketchView::fileTitle() const
0169 {
0170     QFileInfo file(d->file);
0171     return file.fileName();
0172 }
0173 
0174 bool KisSketchView::isModified() const
0175 {
0176     if(d->doc)
0177         return d->doc->isModified();
0178 
0179     return false;
0180 }
0181 
0182 void KisSketchView::setFile(const QString& file)
0183 {
0184     if (!file.isEmpty() && file != d->file) {
0185         d->file = file;
0186         emit fileChanged();
0187 
0188         if (!file.startsWith("temp://")) {
0189             DocumentManager::instance()->openDocument(file);
0190         }
0191     }
0192 }
0193 
0194 void KisSketchView::componentComplete()
0195 {
0196 }
0197 
0198 bool KisSketchView::canUndo() const
0199 {
0200     if (d->undoAction)
0201         return d->undoAction->isEnabled();
0202     return false;
0203 }
0204 
0205 bool KisSketchView::canRedo() const
0206 {
0207     if (d->redoAction)
0208         return d->redoAction->isEnabled();
0209     return false;
0210 }
0211 
0212 int KisSketchView::imageHeight() const
0213 {
0214     if (d->doc)
0215         return d->doc->image()->height();
0216     return 0;
0217 }
0218 
0219 int KisSketchView::imageWidth() const
0220 {
0221     if (d->doc)
0222         return d->doc->image()->width();
0223     return 0;
0224 }
0225 
0226 void KisSketchView::undo()
0227 {
0228     d->undoAction->trigger();
0229 }
0230 
0231 void KisSketchView::redo()
0232 {
0233     d->redoAction->trigger();
0234 }
0235 
0236 void KisSketchView::zoomIn()
0237 {
0238     d->viewManager->actionCollection()->action("zoom_in")->trigger();
0239 }
0240 
0241 void KisSketchView::zoomOut()
0242 {
0243     d->viewManager->actionCollection()->action("zoom_out")->trigger();
0244 }
0245 
0246 void KisSketchView::save()
0247 {
0248     DocumentManager::instance()->save();
0249 }
0250 
0251 void KisSketchView::saveAs(const QString& fileName, const QString& mimeType)
0252 {
0253     DocumentManager::instance()->saveAs(fileName, mimeType);
0254 }
0255 
0256 void KisSketchView::documentAboutToBeDeleted()
0257 {
0258     if (d->undoAction)
0259         d->undoAction->disconnect(this);
0260 
0261     if (d->redoAction)
0262         d->redoAction->disconnect(this);
0263 
0264     delete d->view;
0265     d->view = 0;
0266 
0267     emit viewChanged();
0268 
0269     d->canvas = 0;
0270     d->canvasWidget = 0;
0271 }
0272 
0273 void KisSketchView::documentChanged()
0274 {
0275     d->doc = DocumentManager::instance()->document();
0276     if (!d->doc) return;
0277     if (!d->viewManager) return;
0278 
0279     connect(d->doc, SIGNAL(modified(bool)), SIGNAL(modifiedChanged()));
0280 
0281     QPointer<KisView> view = KisPart::instance()->createView(d->doc, d->viewManager, QApplication::activeWindow());
0282     view->setViewManager(d->viewManager);
0283     view->canvasBase()->setFavoriteResourceManager(d->viewManager->paintOpBox()->favoriteResourcesManager());
0284     view->slotLoadingFinished();
0285 
0286     d->view = view;
0287     d->canvas = d->view->canvasBase();
0288     d->view->setShowFloatingMessage(false);
0289     d->viewManager->setCurrentView(view);
0290     KisCanvasController *controller = static_cast<KisCanvasController*>(d->canvas->canvasController());
0291 
0292     connect(d->viewManager, SIGNAL(floatingMessageRequested(QString,QString)), this, SIGNAL(floatingMessageRequested(QString,QString)));
0293 
0294     controller->setGeometry(x(), y(), width(), height());
0295     d->view->hide();
0296 
0297     d->undoStack = d->doc->undoStack();
0298     d->undoAction = d->viewManager->actionCollection()->action("edit_undo");
0299     connect(d->undoAction, SIGNAL(changed()), this, SIGNAL(canUndoChanged()));
0300 
0301     d->redoAction = d->viewManager->actionCollection()->action("edit_redo");
0302     connect(d->redoAction, SIGNAL(changed()), this, SIGNAL(canRedoChanged()));
0303 
0304     KoToolManager::instance()->switchToolRequested( "KritaShape/KisToolBrush" );
0305 
0306     d->canvasWidget = d->canvas->canvasWidget();
0307 
0308 
0309 
0310     connect(d->doc->image(), SIGNAL(sigImageUpdated(QRect)), SLOT(imageUpdated(QRect)));
0311     connect(controller->proxyObject, SIGNAL(moveDocumentOffset(QPoint)), SLOT(documentOffsetMoved()));
0312     connect(d->view->zoomController(), SIGNAL(zoomChanged(KoZoomMode::Mode,qreal)), SLOT(zoomChanged()));
0313     connect(d->canvas, SIGNAL(updateCanvasRequested(QRect)), SLOT(imageUpdated(QRect)));
0314     connect(d->doc->image()->signalRouter(), SIGNAL(sigRemoveNodeAsync(KisNodeSP)), SLOT(removeNodeAsync(KisNodeSP)));
0315     connect(d->doc->image()->signalRouter(), SIGNAL(sigSizeChanged(QPointF,QPointF)), SIGNAL(imageSizeChanged()));
0316 
0317     // QT5TODO
0318 //     if(scene()) {
0319 //         SketchDeclarativeView *v = qobject_cast<SketchDeclarativeView*>(scene()->views().at(0));
0320 //         if (v) {
0321 //             v->setCanvasWidget(d->canvasWidget);
0322 //             v->setDrawCanvas(true);
0323 //         }
0324 //     }
0325 
0326     d->imageUpdated(d->canvas->image()->bounds());
0327 
0328     static_cast<KoZoomHandler*>(d->canvas->viewConverter())->setResolution(d->doc->image()->xRes(), d->doc->image()->yRes());
0329     d->view->zoomController()->setZoomMode(KoZoomMode::ZOOM_PAGE);
0330     controller->setScrollBarValue(QPoint(0, 0));
0331     controller->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
0332     controller->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
0333 
0334     geometryChanged(QRectF(x(), y(), width(), height()), QRectF());
0335 
0336     d->loadedTimer->start(100);
0337 
0338     d->viewManager->actionCollection()->action("zoom_to_100pct")->trigger();
0339     d->resetDocumentPosition();
0340 
0341     emit viewChanged();
0342 
0343 }
0344 
0345 bool KisSketchView::event( QEvent* event )
0346 {
0347     if (!d->viewManager) return false;
0348     if (!d->viewManager->canvasBase()) return false;
0349 
0350     KisCanvasController *controller = dynamic_cast<KisCanvasController*>(d->viewManager->canvasBase()->canvasController());
0351     if (!controller) return false;
0352 
0353 //    switch(static_cast<int>(event->type())) {
0354 //        case ViewModeSwitchEvent::AboutToSwitchViewModeEvent: {
0355 //            ViewModeSynchronisationObject* syncObject = static_cast<ViewModeSwitchEvent*>(event)->synchronisationObject();
0356 
0357 //            if (d->view && d->viewManager && d->viewManager->canvasBase()) {
0358 
0359 //                controller->setFocus();
0360 //                qApp->processEvents();
0361 
0362 //                KisCanvasResourceProvider* provider = d->view->resourceProvider();
0363 //                syncObject->backgroundColor = provider->bgColor();
0364 //                syncObject->foregroundColor = provider->fgColor();
0365 //                syncObject->exposure = provider->HDRExposure();
0366 //                syncObject->gamma = provider->HDRGamma();
0367 //                syncObject->compositeOp = provider->currentCompositeOp();
0368 //                syncObject->pattern = provider->currentPattern();
0369 //                syncObject->gradient = provider->currentGradient();
0370 //                syncObject->node = provider->currentNode();
0371 //                syncObject->paintOp = provider->currentPreset();
0372 //                syncObject->opacity = provider->opacity();
0373 //                syncObject->globalAlphaLock = provider->globalAlphaLock();
0374 
0375 //                syncObject->documentOffset = controller->scrollBarValue();
0376 //                syncObject->zoomLevel = d->view->zoomController()->zoomAction()->effectiveZoom();
0377 //                syncObject->rotationAngle = d->view->canvasBase()->rotationAngle();
0378 
0379 //                syncObject->activeToolId = KoToolManager::instance()->activeToolId();
0380 
0381 //                syncObject->gridConfig = d->view->document()->gridConfig();
0382 
0383 //                syncObject->mirrorHorizontal = provider->mirrorHorizontal();
0384 //                syncObject->mirrorVertical = provider->mirrorVertical();
0385 //                //syncObject->mirrorAxesCenter = provider->resourceManager()->resource(KoCanvasResource::MirrorAxesCenter).toPointF();
0386 
0387 //                KisToolFreehand* tool = qobject_cast<KisToolFreehand*>(KoToolManager::instance()->toolById(d->view->canvasBase(), syncObject->activeToolId));
0388 //                if(tool) {
0389 //                    syncObject->smoothingOptions = tool->smoothingOptions();
0390 //                }
0391 
0392 //                syncObject->initialized = true;
0393 //            }
0394 
0395 //            return true;
0396 //        }
0397 //        case ViewModeSwitchEvent::SwitchedToSketchModeEvent: {
0398 //            ViewModeSynchronisationObject* syncObject = static_cast<ViewModeSwitchEvent*>(event)->synchronisationObject();
0399 
0400 //            if (d->view && syncObject->initialized) {
0401 //                controller->setFocus();
0402 //                qApp->processEvents();
0403 
0404 //                KisToolFreehand* tool = qobject_cast<KisToolFreehand*>(KoToolManager::instance()->toolById(d->view->canvasBase(), syncObject->activeToolId));
0405 //                if(tool && syncObject->smoothingOptions) {
0406 //                    tool->smoothingOptions()->setSmoothingType(syncObject->smoothingOptions->smoothingType());
0407 //                    tool->smoothingOptions()->setSmoothPressure(syncObject->smoothingOptions->smoothPressure());
0408 //                    tool->smoothingOptions()->setTailAggressiveness(syncObject->smoothingOptions->tailAggressiveness());
0409 //                    tool->smoothingOptions()->setUseScalableDistance(syncObject->smoothingOptions->useScalableDistance());
0410 //                    tool->smoothingOptions()->setSmoothnessDistance(syncObject->smoothingOptions->smoothnessDistance());
0411 //                    tool->smoothingOptions()->setUseDelayDistance(syncObject->smoothingOptions->useDelayDistance());
0412 //                    tool->smoothingOptions()->setDelayDistance(syncObject->smoothingOptions->delayDistance());
0413 //                    tool->smoothingOptions()->setFinishStabilizedCurve(syncObject->smoothingOptions->finishStabilizedCurve());
0414 //                    tool->smoothingOptions()->setStabilizeSensors(syncObject->smoothingOptions->stabilizeSensors());
0415 //                    tool->updateSettingsViews();
0416 //                }
0417 
0418 //                KisCanvasResourceProvider* provider = d->view->resourceProvider();
0419 
0420 //                provider->setMirrorHorizontal(syncObject->mirrorHorizontal);
0421 //                provider->setMirrorVertical(syncObject->mirrorVertical);
0422 //                //provider->resourceManager()->setResource(KoCanvasResource::MirrorAxesCenter, syncObject->mirrorAxesCenter);
0423 
0424 //                provider->setPaintOpPreset(syncObject->paintOp);
0425 //                qApp->processEvents();
0426 
0427 //                KoToolManager::instance()->switchToolRequested("InteractionTool");
0428 //                qApp->processEvents();
0429 //                KoToolManager::instance()->switchToolRequested(syncObject->activeToolId);
0430 //                qApp->processEvents();
0431 
0432 //                provider->setBGColor(syncObject->backgroundColor);
0433 //                provider->setFGColor(syncObject->foregroundColor);
0434 //                provider->setHDRExposure(syncObject->exposure);
0435 //                provider->setHDRGamma(syncObject->gamma);
0436 //                provider->slotPatternActivated(syncObject->pattern);
0437 //                provider->slotGradientActivated(syncObject->gradient);
0438 //                provider->slotNodeActivated(syncObject->node);
0439 //                provider->setOpacity(syncObject->opacity);
0440 //                provider->setGlobalAlphaLock(syncObject->globalAlphaLock);
0441 //                provider->setCurrentCompositeOp(syncObject->compositeOp);
0442 
0443 //                d->view->document()->setGridConfig(syncObject->gridConfig);
0444 
0445 //                zoomIn();
0446 //                qApp->processEvents();
0447 
0448 //                d->view->zoomController()->setZoom(KoZoomMode::ZOOM_CONSTANT, syncObject->zoomLevel);
0449 //                controller->rotateCanvas(syncObject->rotationAngle - d->view->canvasBase()->rotationAngle());
0450 
0451 //                qApp->processEvents();
0452 //                QPoint newOffset = syncObject->documentOffset;
0453 //                controller->setScrollBarValue(newOffset);
0454 //            }
0455 
0456 //            return true;
0457 //        }
0458 //#ifdef Q_OS_X11
0459 //            if(d->tabletEventCount % 2 == 0)
0460 //#endif
0461 //                d->canvas->globalInputManager()->eventFilter(this, event);
0462 //            return true;
0463 //        case QEvent::KeyPress:
0464 //        case QEvent::KeyRelease:
0465 //            emit interactionStarted();
0466 //            QApplication::sendEvent(d->view, event);
0467 //            break;
0468 //        default:
0469 //            break;
0470 //    }
0471 
0472     return QQuickItem::event( event );
0473 }
0474 
0475     // QT5TODO
0476 #if 0
0477 bool KisSketchView::sceneEvent(QEvent* event)
0478 {
0479     if (d->canvas && d->canvasWidget) {
0480         switch(event->type()) {
0481         case QEvent::GraphicsSceneMousePress: {
0482             QGraphicsSceneMouseEvent *gsmevent = static_cast<QGraphicsSceneMouseEvent*>(event);
0483             QMouseEvent mevent(QMouseEvent::MouseButtonPress, gsmevent->pos().toPoint(), gsmevent->button(), gsmevent->buttons(), gsmevent->modifiers());
0484             QApplication::sendEvent(d->canvasWidget, &mevent);
0485             emit interactionStarted();
0486             return true;
0487         }
0488         case QEvent::GraphicsSceneMouseMove: {
0489             QGraphicsSceneMouseEvent *gsmevent = static_cast<QGraphicsSceneMouseEvent*>(event);
0490             QMouseEvent mevent(QMouseEvent::MouseMove, gsmevent->pos().toPoint(), gsmevent->button(), gsmevent->buttons(), gsmevent->modifiers());
0491             QApplication::sendEvent(d->canvasWidget, &mevent);
0492             update();
0493             emit interactionStarted();
0494             return true;
0495         }
0496         case QEvent::GraphicsSceneMouseRelease: {
0497             QGraphicsSceneMouseEvent *gsmevent = static_cast<QGraphicsSceneMouseEvent*>(event);
0498             QMouseEvent mevent(QMouseEvent::MouseButtonRelease, gsmevent->pos().toPoint(), gsmevent->button(), gsmevent->buttons(), gsmevent->modifiers());
0499             QApplication::sendEvent(d->canvasWidget, &mevent);
0500             emit interactionStarted();
0501             return true;
0502         }
0503         case QEvent::GraphicsSceneWheel: {
0504             QGraphicsSceneWheelEvent *gswevent = static_cast<QGraphicsSceneWheelEvent*>(event);
0505             QWheelEvent wevent(gswevent->pos().toPoint(), gswevent->delta(), gswevent->buttons(), gswevent->modifiers(), gswevent->orientation());
0506             QApplication::sendEvent(d->canvasWidget, &wevent);
0507             emit interactionStarted();
0508             return true;
0509         }
0510         case QEvent::GraphicsSceneHoverEnter: {
0511             QGraphicsSceneHoverEvent *hevent = static_cast<QGraphicsSceneHoverEvent*>(event);
0512             QHoverEvent e(QEvent::Enter, hevent->screenPos(), hevent->lastScreenPos());
0513             QApplication::sendEvent(d->canvasWidget, &e);
0514             return true;
0515         }
0516         case QEvent::GraphicsSceneHoverLeave: {
0517             QGraphicsSceneHoverEvent *hevent = static_cast<QGraphicsSceneHoverEvent*>(event);
0518             QHoverEvent e(QEvent::Leave, hevent->screenPos(), hevent->lastScreenPos());
0519             QApplication::sendEvent(d->canvasWidget, &e);
0520             return true;
0521         }
0522         case QEvent::TouchBegin: {
0523             QApplication::sendEvent(d->canvasWidget, event);
0524             event->accept();
0525             emit interactionStarted();
0526             return true;
0527         }
0528         case QEvent::TabletPress:
0529         case QEvent::TabletMove:
0530         case QEvent::TabletRelease:
0531             d->canvas->globalInputManager()->stopIgnoringEvents();
0532             QApplication::sendEvent(d->canvasWidget, event);
0533             return true;
0534         default:
0535             if (QApplication::sendEvent(d->canvasWidget, event)) {
0536                 emit interactionStarted();
0537                 return true;
0538             }
0539         }
0540     }
0541     return QQuickItem::sceneEvent(event);
0542 }
0543 #endif
0544 void KisSketchView::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry)
0545 {
0546     if (d->canvasWidget && !newGeometry.isEmpty()) {
0547         d->view->resize(newGeometry.toRect().size());
0548         // If we don't ask for this event to be sent, the view does not actually handle
0549         // the resize, and we're stuck with a very oddly sized viewport
0550         QResizeEvent *event = new QResizeEvent(newGeometry.toRect().size(), d->view->size());
0551         QApplication::sendEvent(d->view, event);
0552         // This is a touch on the hackish side - i'm sure there's a better way of doing it
0553         // but it's taking a long time to work it out. Problem: When switching orientation,
0554         // the canvas is rendered wrong, in what looks like an off-by-one ish kind of fashion.
0555         if (oldGeometry.height() == oldGeometry.width() && oldGeometry.height() == newGeometry.width()) {
0556             // in this case, we've just rotated the display... do something useful!
0557             // Turns out we get /two/ resize events per rotation, one one per setting each height and width.
0558             // So we can't just check it normally. Annoying, but there you go.
0559             QTimer::singleShot(100, this, SLOT(centerDoc()));
0560             QTimer::singleShot(150, this, SLOT(zoomOut()));
0561         }
0562         if (oldGeometry.height() == oldGeometry.width() && oldGeometry.width() == newGeometry.height()) {
0563             // in this case, we've just rotated the display... do something useful!
0564             // Turns out we get /two/ resize events per rotation, one one per setting each height and width.
0565             // So we can't just check it normally. Annoying, but there you go.
0566             QTimer::singleShot(100, this, SLOT(centerDoc()));
0567             QTimer::singleShot(150, this, SLOT(zoomOut()));
0568         }
0569     }
0570 }
0571 
0572 void KisSketchView::centerDoc()
0573 {
0574     d->viewManager->zoomController()->setZoom(KoZoomMode::ZOOM_PAGE, 1.0);
0575 }
0576 
0577 void KisSketchView::Private::imageUpdated(const QRect &/*updated*/)
0578 {
0579     // QT5TODO
0580 //     if (q->scene()) {
0581 //         q->scene()->views().at(0)->update(updated);
0582 //         q->scene()->invalidate( 0, 0, q->width(), q->height() );
0583 //     }
0584 }
0585 
0586 void KisSketchView::Private::documentOffsetMoved()
0587 {
0588     // QT5TODO
0589 //     if (q->scene()) {
0590 //         q->scene()->views().at(0)->update();
0591 //         q->scene()->invalidate( 0, 0, q->width(), q->height() );
0592 //     }
0593 }
0594 
0595 void KisSketchView::Private::resetDocumentPosition()
0596 {
0597     viewManager->zoomController()->setZoomMode(KoZoomMode::ZOOM_PAGE);
0598 
0599     QPoint pos;
0600     KisCanvasController *controller = dynamic_cast<KisCanvasController*>(viewManager->canvasBase()->canvasController());
0601 
0602     if (!controller) return;
0603 
0604     QScrollBar *sb = controller->horizontalScrollBar();
0605     pos.rx() = sb->minimum() + (sb->maximum() - sb->minimum()) / 2;
0606 
0607     sb = controller->verticalScrollBar();
0608     pos.ry() = sb->minimum() + (sb->maximum() - sb->minimum()) / 2;
0609 
0610     controller->setScrollBarValue(pos);
0611 
0612 }
0613 
0614 
0615 void KisSketchView::Private::removeNodeAsync(KisNodeSP removedNode)
0616 {
0617     if (removedNode) {
0618         imageUpdated(removedNode->extent());
0619     }
0620 }
0621 
0622 void KisSketchView::Private::zoomChanged()
0623 {
0624     // QT5TODO
0625 //     if (q->scene()) {
0626 //         q->scene()->views().at(0)->update();
0627 //         q->scene()->invalidate( 0, 0, q->width(), q->height() );
0628 //     }
0629 }
0630 
0631 void KisSketchView::activate()
0632 {
0633     if (d->canvasWidget != d->canvas->canvasWidget()) {
0634         d->canvasWidget = d->canvas->canvasWidget();
0635     // QT5TODO
0636 //      SketchDeclarativeView *v = qobject_cast<SketchDeclarativeView*>(scene()->views().at(0));
0637 //      if (v) {
0638 //          v->setCanvasWidget(d->canvasWidget);
0639 //          v->setDrawCanvas(true);
0640 //      }
0641     }
0642     d->canvasWidget->setFocus();
0643     Q_ASSERT(d->viewManager);
0644     KisCanvasController *controller = dynamic_cast<KisCanvasController*>(d->viewManager->canvasBase()->canvasController());
0645     Q_ASSERT(controller);
0646     controller->activate();
0647 }
0648 
0649 // for private slots
0650 #include "moc_KisSketchView.cpp"