Warning, file /office/calligra/libs/flake/KoCanvasControllerWidget.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /* This file is part of the KDE project
0002  *
0003  * Copyright (C) 2006, 2008-2009 Thomas Zander <zander@kde.org>
0004  * Copyright (C) 2006 Peter Simonsson <peter.simonsson@gmail.com>
0005  * Copyright (C) 2006, 2009 Thorsten Zachmann <zachmann@kde.org>
0006  * Copyright (C) 2007-2010 Boudewijn Rempt <boud@valdyas.org>
0007  * Copyright (C) 2007 C. Boemann <cbo@boemann.dk>
0008  * Copyright (C) 2006-2008 Jan Hambrecht <jaham@gmx.net>
0009  *
0010  * This library is free software; you can redistribute it and/or
0011  * modify it under the terms of the GNU Library General Public
0012  * License as published by the Free Software Foundation; either
0013  * version 2 of the License, or (at your option) any later version.
0014  *
0015  * This library is distributed in the hope that it will be useful,
0016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0018  * Library General Public License for more details.
0019  *
0020  * You should have received a copy of the GNU Library General Public License
0021  * along with this library; see the file COPYING.LIB.  If not, write to
0022  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0023  * Boston, MA 02110-1301, USA.
0024  */
0025 
0026 #include "KoCanvasControllerWidget.h"
0027 #include "KoCanvasControllerWidget_p.h"
0028 
0029 #include "KoCanvasControllerWidgetViewport_p.h"
0030 #include "KoShape.h"
0031 #include "KoViewConverter.h"
0032 #include "KoCanvasBase.h"
0033 #include "KoCanvasObserverBase.h"
0034 #include "KoCanvasSupervisor.h"
0035 #include "KoToolManager_p.h"
0036 
0037 #include <FlakeDebug.h>
0038 #include <QMouseEvent>
0039 #include <QPainter>
0040 #include <QScrollBar>
0041 #include <QEvent>
0042 #include <QDockWidget>
0043 #include <QTimer>
0044 #include <QPointer>
0045 
0046 #include <KoConfig.h>
0047 
0048 #include <math.h>
0049 
0050 void KoCanvasControllerWidget::Private::setDocumentOffset()
0051 {
0052     // The margins scroll the canvas widget inside the viewport, not
0053     // the document. The documentOffset is meant to be the value that
0054     // the canvas must add to the update rect in its paint event, to
0055     // compensate.
0056 
0057     QPoint pt(q->horizontalScrollBar()->value(), q->verticalScrollBar()->value());
0058     q->proxyObject->emitMoveDocumentOffset(pt);
0059 
0060     QWidget *canvasWidget = canvas->canvasWidget();
0061 
0062     if (canvasWidget) {
0063         QWidget *canvasWidget = canvas->canvasWidget();
0064         QPoint diff = q->documentOffset() - pt;
0065         if (q->canvasMode() == Spreadsheet && canvasWidget->layoutDirection() == Qt::RightToLeft) {
0066             canvasWidget->scroll(-diff.x(), diff.y());
0067         } else {
0068             canvasWidget->scroll(diff.x(), diff.y());
0069         }
0070     }
0071 
0072     q->setDocumentOffset(pt);
0073 }
0074 
0075 void KoCanvasControllerWidget::Private::resetScrollBars()
0076 {
0077     // The scrollbar value always points at the top-left corner of the
0078     // bit of image we paint.
0079 
0080     int docH = q->documentSize().height() + q->margin();
0081     int docW = q->documentSize().width() + q->margin();
0082     int drawH = viewportWidget->height();
0083     int drawW = viewportWidget->width();
0084 
0085     QScrollBar *hScroll = q->horizontalScrollBar();
0086     QScrollBar *vScroll = q->verticalScrollBar();
0087 
0088     int horizontalReserve = vastScrollingFactor * drawW;
0089     int verticalReserve = vastScrollingFactor * drawH;
0090 
0091     int xMin = -horizontalReserve;
0092     int yMin = -verticalReserve;
0093 
0094     int xMax = docW - drawW + horizontalReserve;
0095     int yMax = docH - drawH + verticalReserve;
0096 
0097     hScroll->setRange(xMin, xMax);
0098     vScroll->setRange(yMin, yMax);
0099 
0100     int fontheight = QFontMetrics(q->font()).height();
0101 
0102     vScroll->setPageStep(drawH);
0103     vScroll->setSingleStep(fontheight);
0104     hScroll->setPageStep(drawW);
0105     hScroll->setSingleStep(fontheight);
0106 
0107 }
0108 
0109 void KoCanvasControllerWidget::Private::emitPointerPositionChangedSignals(QEvent *event)
0110 {
0111     if (!canvas) return;
0112     if (!canvas->viewConverter()) return;
0113 
0114     QPoint pointerPos;
0115     QMouseEvent *mouseEvent = dynamic_cast<QMouseEvent*>(event);
0116     if (mouseEvent) {
0117         pointerPos = mouseEvent->pos();
0118     } else {
0119         QTabletEvent *tabletEvent = dynamic_cast<QTabletEvent*>(event);
0120         if (tabletEvent) {
0121             pointerPos = tabletEvent->pos();
0122         }
0123     }
0124 
0125     QPoint pixelPos = (pointerPos - canvas->documentOrigin()) + q->documentOffset();
0126     QPointF documentPos = canvas->viewConverter()->viewToDocument(pixelPos);
0127 
0128     q->proxyObject->emitDocumentMousePositionChanged(documentPos);
0129     q->proxyObject->emitCanvasMousePositionChanged(pointerPos);
0130 }
0131 
0132 
0133 #include <QTime>
0134 
0135 void KoCanvasControllerWidget::Private::activate()
0136 {
0137     QWidget *parent = q;
0138     while (parent->parentWidget()) {
0139         parent = parent->parentWidget();
0140     }
0141     KoCanvasSupervisor *observerProvider = dynamic_cast<KoCanvasSupervisor*>(parent);
0142     if (!observerProvider) {
0143         return;
0144     }
0145     foreach(KoCanvasObserverBase *docker, observerProvider->canvasObservers()) {
0146         KoCanvasObserverBase *observer = dynamic_cast<KoCanvasObserverBase*>(docker);
0147         if (observer) {
0148             observer->setObservedCanvas(q->canvas());
0149         }
0150     }
0151 
0152 }
0153 
0154 void KoCanvasControllerWidget::Private::unsetCanvas()
0155 {
0156     QWidget *parent = q;
0157     while (parent->parentWidget()) {
0158         parent = parent->parentWidget();
0159     }
0160     KoCanvasSupervisor *observerProvider = dynamic_cast<KoCanvasSupervisor*>(parent);
0161     if (!observerProvider) {
0162         return;
0163     }
0164     foreach(KoCanvasObserverBase *docker, observerProvider->canvasObservers()) {
0165         KoCanvasObserverBase *observer = dynamic_cast<KoCanvasObserverBase*>(docker);
0166         if (observer && observer->observedCanvas() == q->canvas()) {
0167             observer->unsetObservedCanvas();
0168         }
0169     }
0170 }
0171 
0172 ////////////
0173 KoCanvasControllerWidget::KoCanvasControllerWidget(KActionCollection * actionCollection, QWidget *parent)
0174     : QAbstractScrollArea(parent)
0175     , KoCanvasController(actionCollection)
0176     , d(new Private(this))
0177 {
0178     // We need to set this as QDeclarativeView sets them a bit different from QAbstractScrollArea
0179     setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
0180 
0181     // And then our own Viewport
0182     d->viewportWidget = new Viewport(this);
0183     setViewport(d->viewportWidget);
0184     d->viewportWidget->setFocusPolicy(Qt::NoFocus);
0185     setFocusPolicy(Qt::NoFocus);
0186     setFrameStyle(0);
0187 
0188     //setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
0189     setAutoFillBackground(false);
0190     /*
0191       Fixes:   apps starting at zero zoom.
0192       Details: Since the document is set on the mainwindow before loading commences the initial show/layout can choose
0193           to set the document to be very small, even to be zero pixels tall.  Setting a sane minimum size on the
0194           widget means we no longer get rounding errors in zooming and we no longer end up with zero-zoom.
0195       Note: KoPage apps should probably startup with a sane document size; for Krita that's impossible
0196      */
0197     setMinimumSize(QSize(50, 50));
0198     setMouseTracking(true);
0199 
0200     connect(horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(updateCanvasOffsetX()));
0201     connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(updateCanvasOffsetY()));
0202     connect(d->viewportWidget, SIGNAL(sizeChanged()), this, SLOT(updateCanvasOffsetX()));
0203     connect(proxyObject, SIGNAL(moveDocumentOffset(QPoint)), d->viewportWidget, SLOT(documentOffsetMoved(QPoint)));
0204 }
0205 
0206 KoCanvasControllerWidget::~KoCanvasControllerWidget()
0207 {
0208     d->viewportWidget->canvas()->removeEventFilter(this);
0209     d->unsetCanvas();
0210     delete d;
0211 }
0212 
0213 void KoCanvasControllerWidget::activate()
0214 {
0215     d->activate();
0216 }
0217 
0218 void KoCanvasControllerWidget::scrollContentsBy(int dx, int dy)
0219 {
0220     Q_UNUSED(dx);
0221     Q_UNUSED(dy);
0222     d->setDocumentOffset();
0223 }
0224 
0225 QSize KoCanvasControllerWidget::viewportSize() const
0226 {
0227     return viewport()->size();
0228 }
0229 
0230 void KoCanvasControllerWidget::setDrawShadow(bool drawShadow)
0231 {
0232     d->viewportWidget->setDrawShadow(drawShadow);
0233 }
0234 
0235 void KoCanvasControllerWidget::resizeEvent(QResizeEvent *resizeEvent)
0236 {
0237     proxyObject->emitSizeChanged(resizeEvent->size());
0238 
0239     // XXX: When resizing, keep the area we're looking at now in the
0240     // center of the resized view.
0241     d->resetScrollBars();
0242     d->setDocumentOffset();
0243 }
0244 
0245 void KoCanvasControllerWidget::setCanvas(KoCanvasBase *canvas)
0246 {
0247     Q_ASSERT(canvas); // param is not null
0248     if (d->canvas) {
0249         d->unsetCanvas();
0250         proxyObject->emitCanvasRemoved(this);
0251         canvas->setCanvasController(0);
0252         d->canvas->canvasWidget()->removeEventFilter(this);
0253     }
0254     canvas->setCanvasController(this);
0255     d->canvas = canvas;
0256 
0257     changeCanvasWidget(canvas->canvasWidget());
0258 
0259     proxyObject->emitCanvasSet(this);
0260     QTimer::singleShot(0, this, SLOT(activate()));
0261 
0262     setPreferredCenterFractionX(0);
0263     setPreferredCenterFractionY(0);
0264 }
0265 
0266 KoCanvasBase* KoCanvasControllerWidget::canvas() const
0267 {
0268     return d->canvas;
0269 }
0270 
0271 void KoCanvasControllerWidget::changeCanvasWidget(QWidget *widget)
0272 {
0273     if (d->viewportWidget->canvas()) {
0274         widget->setCursor(d->viewportWidget->canvas()->cursor());
0275         d->viewportWidget->canvas()->removeEventFilter(this);
0276     }
0277 
0278     d->viewportWidget->setCanvas(widget);
0279     setFocusProxy(d->canvas->canvasWidget());
0280 
0281     widget->installEventFilter(this);
0282     widget->setMouseTracking(true);
0283 }
0284 
0285 int KoCanvasControllerWidget::visibleHeight() const
0286 {
0287     if (d->canvas == 0)
0288         return 0;
0289     QWidget *canvasWidget = canvas()->canvasWidget();
0290 
0291     int height1;
0292     if (canvasWidget == 0)
0293         height1 = viewport()->height();
0294     else
0295         height1 = qMin(viewport()->height(), canvasWidget->height());
0296     int height2 = height();
0297     return qMin(height1, height2);
0298 }
0299 
0300 int KoCanvasControllerWidget::visibleWidth() const
0301 {
0302     if (d->canvas == 0)
0303         return 0;
0304     QWidget *canvasWidget = canvas()->canvasWidget();
0305 
0306     int width1;
0307     if (canvasWidget == 0)
0308         width1 = viewport()->width();
0309     else
0310         width1 = qMin(viewport()->width(), canvasWidget->width());
0311     int width2 = width();
0312     return qMin(width1, width2);
0313 }
0314 
0315 int KoCanvasControllerWidget::canvasOffsetX() const
0316 {
0317     int offset = -horizontalScrollBar()->value();
0318 
0319     if (d->canvas) {
0320         offset += d->canvas->canvasWidget()->x() + frameWidth();
0321     }
0322 
0323     return offset;
0324 }
0325 
0326 int KoCanvasControllerWidget::canvasOffsetY() const
0327 {
0328     int offset = -verticalScrollBar()->value();
0329 
0330     if (d->canvas) {
0331         offset += d->canvas->canvasWidget()->y() + frameWidth();
0332     }
0333 
0334     return offset;
0335 }
0336 
0337 void KoCanvasControllerWidget::updateCanvasOffsetX()
0338 {
0339     proxyObject->emitCanvasOffsetXChanged(canvasOffsetX());
0340     if (d->ignoreScrollSignals)
0341         return;
0342 
0343     setPreferredCenterFractionX((horizontalScrollBar()->value()
0344                                  + viewport()->width() / 2.0) / documentSize().width());
0345 }
0346 
0347 void KoCanvasControllerWidget::updateCanvasOffsetY()
0348 {
0349     proxyObject->emitCanvasOffsetYChanged(canvasOffsetY());
0350     if (d->ignoreScrollSignals)
0351         return;
0352 
0353     setPreferredCenterFractionY((verticalScrollBar()->value()
0354                                  + verticalScrollBar()->pageStep() / 2.0) / documentSize().height());
0355 }
0356 
0357 bool KoCanvasControllerWidget::eventFilter(QObject *watched, QEvent *event)
0358 {
0359     if (d->canvas && d->canvas->canvasWidget() && (watched == d->canvas->canvasWidget())) {
0360          if (event->type() == QEvent::MouseMove || event->type() == QEvent::TabletMove) {
0361             d->emitPointerPositionChangedSignals(event);
0362         }
0363     }
0364     return false;
0365 }
0366 
0367 void KoCanvasControllerWidget::ensureVisible(KoShape *shape)
0368 {
0369     Q_ASSERT(shape);
0370     ensureVisible(d->canvas->viewConverter()->documentToView(shape->boundingRect()));
0371 }
0372 
0373 void KoCanvasControllerWidget::ensureVisible(const QRectF &rect, bool smooth)
0374 {
0375     QRect currentVisible(-canvasOffsetX(), -canvasOffsetY(), visibleWidth(), visibleHeight());
0376 
0377     QRect viewRect = rect.toRect();
0378     viewRect.translate(d->canvas->documentOrigin());
0379     if (!viewRect.isValid() || currentVisible.contains(viewRect))
0380         return; // its visible. Nothing to do.
0381 
0382     // if we move, we move a little more so the amount of times we have to move is less.
0383     int jumpWidth = smooth ? 0 : currentVisible.width() / 5;
0384     int jumpHeight = smooth ? 0 : currentVisible.height() / 5;
0385     if (!smooth && viewRect.width() + jumpWidth > currentVisible.width())
0386         jumpWidth = 0;
0387     if (!smooth && viewRect.height() + jumpHeight > currentVisible.height())
0388         jumpHeight = 0;
0389 
0390     int horizontalMove = 0;
0391     if (currentVisible.width() <= viewRect.width())      // center view
0392         horizontalMove = viewRect.center().x() - currentVisible.center().x();
0393     else if (currentVisible.x() > viewRect.x())          // move left
0394         horizontalMove = viewRect.x() - currentVisible.x() - jumpWidth;
0395     else if (currentVisible.right() < viewRect.right())  // move right
0396         horizontalMove = viewRect.right() - qMax(0, currentVisible.right() - jumpWidth);
0397 
0398     int verticalMove = 0;
0399     if (currentVisible.height() <= viewRect.height())       // center view
0400         verticalMove = viewRect.center().y() - currentVisible.center().y();
0401     if (currentVisible.y() > viewRect.y())               // move up
0402         verticalMove = viewRect.y() - currentVisible.y() - jumpHeight;
0403     else if (currentVisible.bottom() < viewRect.bottom()) // move down
0404         verticalMove = viewRect.bottom() - qMax(0, currentVisible.bottom() - jumpHeight);
0405 
0406     pan(QPoint(horizontalMove, verticalMove));
0407 }
0408 
0409 void KoCanvasControllerWidget::recenterPreferred()
0410 {
0411     const bool oldIgnoreScrollSignals = d->ignoreScrollSignals;
0412     d->ignoreScrollSignals = true;
0413 
0414     QPointF center = preferredCenter();
0415 
0416     // convert into a viewport based point
0417     center.rx() += d->canvas->canvasWidget()->x() + frameWidth();
0418     center.ry() += d->canvas->canvasWidget()->y() + frameWidth();
0419 
0420     // scroll to a new center point
0421     QPointF topLeft = center - 0.5 * QPointF(viewport()->width(), viewport()->height());
0422     setScrollBarValue(topLeft.toPoint());
0423 
0424     d->ignoreScrollSignals = oldIgnoreScrollSignals;
0425 }
0426 
0427 void KoCanvasControllerWidget::zoomIn(const QPoint &center)
0428 {
0429     zoomBy(center, sqrt(2.0));
0430 }
0431 
0432 void KoCanvasControllerWidget::zoomOut(const QPoint &center)
0433 {
0434     zoomBy(center, sqrt(0.5));
0435 }
0436 
0437 void KoCanvasControllerWidget::zoomBy(const QPoint &center, qreal zoom)
0438 {
0439     setPreferredCenterFractionX(1.0 * center.x() / documentSize().width());
0440     setPreferredCenterFractionY(1.0 * center.y() / documentSize().height());
0441 
0442     const bool oldIgnoreScrollSignals = d->ignoreScrollSignals;
0443     d->ignoreScrollSignals = true;
0444     proxyObject->emitZoomRelative(zoom, preferredCenter());
0445     d->ignoreScrollSignals = oldIgnoreScrollSignals;
0446 }
0447 
0448 void KoCanvasControllerWidget::zoomTo(const QRect &viewRect)
0449 {
0450     qreal scale;
0451 
0452     if (1.0 * viewport()->width() / viewRect.width() > 1.0 * viewport()->height() / viewRect.height())
0453         scale = 1.0 * viewport()->height() / viewRect.height();
0454     else
0455         scale = 1.0 * viewport()->width() / viewRect.width();
0456 
0457     zoomBy(viewRect.center(), scale);
0458 }
0459 
0460 void KoCanvasControllerWidget::setToolOptionWidgets(const QList<QPointer<QWidget> >&widgetMap)
0461 {
0462     emit toolOptionWidgetsChanged(widgetMap);
0463 }
0464 
0465 void KoCanvasControllerWidget::updateDocumentSize(const QSize &sz, bool recalculateCenter)
0466 {
0467     // Don't update if the document-size didn't changed to prevent infinite loops and unneeded updates.
0468     if (KoCanvasController::documentSize() == sz)
0469         return;
0470 
0471     if (!recalculateCenter) {
0472         // assume the distance from the top stays equal and recalculate the center.
0473         setPreferredCenterFractionX(documentSize().width() * preferredCenterFractionX() / sz.width());
0474         setPreferredCenterFractionY(documentSize().height() * preferredCenterFractionY() / sz.height());
0475     }
0476 
0477     const bool oldIgnoreScrollSignals = d->ignoreScrollSignals;
0478     d->ignoreScrollSignals = true;
0479     KoCanvasController::setDocumentSize(sz);
0480     d->viewportWidget->setDocumentSize(sz);
0481     d->resetScrollBars();
0482 
0483     // Always emit the new offset.
0484     updateCanvasOffsetX();
0485     updateCanvasOffsetY();
0486 
0487     d->ignoreScrollSignals = oldIgnoreScrollSignals;
0488 }
0489 
0490 void KoCanvasControllerWidget::setZoomWithWheel(bool zoom)
0491 {
0492     d->zoomWithWheel = zoom;
0493 }
0494 
0495 void KoCanvasControllerWidget::setVastScrolling(qreal factor)
0496 {
0497     d->vastScrollingFactor = factor;
0498 }
0499 
0500 void KoCanvasControllerWidget::pan(const QPoint &distance)
0501 {
0502     QPoint sourcePoint = scrollBarValue();
0503     setScrollBarValue(sourcePoint + distance);
0504 }
0505 
0506 void KoCanvasControllerWidget::setPreferredCenter(const QPointF &viewPoint)
0507 {
0508     setPreferredCenterFractionX(viewPoint.x() / documentSize().width());
0509     setPreferredCenterFractionY(viewPoint.y() / documentSize().height());
0510     recenterPreferred();
0511 }
0512 
0513 QPointF KoCanvasControllerWidget::preferredCenter() const
0514 {
0515     QPointF center;
0516     center.setX(preferredCenterFractionX() * documentSize().width());
0517     center.setY(preferredCenterFractionY() * documentSize().height());
0518     return center;
0519 }
0520 
0521 void KoCanvasControllerWidget::paintEvent(QPaintEvent *event)
0522 {
0523     QPainter gc(viewport());
0524     d->viewportWidget->handlePaintEvent(gc, event);
0525 }
0526 
0527 void KoCanvasControllerWidget::dragEnterEvent(QDragEnterEvent *event)
0528 {
0529     d->viewportWidget->handleDragEnterEvent(event);
0530 }
0531 
0532 void KoCanvasControllerWidget::dropEvent(QDropEvent *event)
0533 {
0534     d->viewportWidget->handleDropEvent(event);
0535 }
0536 
0537 void KoCanvasControllerWidget::dragMoveEvent(QDragMoveEvent *event)
0538 {
0539     d->viewportWidget->handleDragMoveEvent(event);
0540 }
0541 
0542 void KoCanvasControllerWidget::dragLeaveEvent(QDragLeaveEvent *event)
0543 {
0544     d->viewportWidget->handleDragLeaveEvent(event);
0545 }
0546 
0547 void KoCanvasControllerWidget::keyPressEvent(QKeyEvent *event)
0548 {
0549     KoToolManager::instance()->priv()->switchToolByShortcut(event);
0550 }
0551 
0552 void KoCanvasControllerWidget::wheelEvent(QWheelEvent *event)
0553 {
0554     if (d->zoomWithWheel != ((event->modifiers() & Qt::ControlModifier) == Qt::ControlModifier)) {
0555         const qreal zoomCoeff = event->delta() > 0 ? sqrt(2.0) : sqrt(0.5);
0556         zoomRelativeToPoint(event->pos(), zoomCoeff);
0557 
0558         event->accept();
0559     } else
0560         QAbstractScrollArea::wheelEvent(event);
0561 }
0562 
0563 void KoCanvasControllerWidget::zoomRelativeToPoint(const QPoint &widgetPoint, qreal zoomCoeff)
0564 {
0565     const QPoint offset = scrollBarValue();
0566     const QPoint mousePos(widgetPoint + offset);
0567 
0568     const bool oldIgnoreScrollSignals = d->ignoreScrollSignals;
0569     d->ignoreScrollSignals = true;
0570     proxyObject->emitZoomRelative(zoomCoeff, mousePos);
0571     d->ignoreScrollSignals = oldIgnoreScrollSignals;
0572 }
0573 
0574 bool KoCanvasControllerWidget::focusNextPrevChild(bool)
0575 {
0576     // we always return false meaning the canvas takes keyboard focus, but never gives it away.
0577     return false;
0578 }
0579 
0580 void KoCanvasControllerWidget::setMargin(int margin)
0581 {
0582     KoCanvasController::setMargin(margin);
0583     Q_ASSERT(d->viewportWidget);
0584     d->viewportWidget->setMargin(margin);
0585 }
0586 
0587 QPoint KoCanvasControllerWidget::scrollBarValue() const
0588 {
0589     QScrollBar * hBar = horizontalScrollBar();
0590     QScrollBar * vBar = verticalScrollBar();
0591 
0592     return QPoint(hBar->value(), vBar->value());
0593 }
0594 
0595 void KoCanvasControllerWidget::setScrollBarValue(const QPoint &value)
0596 {
0597     QScrollBar * hBar = horizontalScrollBar();
0598     QScrollBar * vBar = verticalScrollBar();
0599 
0600     hBar->setValue(value.x());
0601     vBar->setValue(value.y());
0602 }
0603 
0604 KoCanvasControllerWidget::Private *KoCanvasControllerWidget::priv()
0605 {
0606     return d;
0607 }
0608 
0609 //have to include this because of Q_PRIVATE_SLOT
0610 #include "moc_KoCanvasControllerWidget.cpp"