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"