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 ¢er) 0428 { 0429 zoomBy(center, sqrt(2.0)); 0430 } 0431 0432 void KoCanvasControllerWidget::zoomOut(const QPoint ¢er) 0433 { 0434 zoomBy(center, sqrt(0.5)); 0435 } 0436 0437 void KoCanvasControllerWidget::zoomBy(const QPoint ¢er, 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"