void KoZoomController::setDocumentSize(const QSizeF &documentSize, bool recalculateCenter) { d->documentSize = documentSize; d->canvasController->updateDocumentSize(documentToViewport(d->documentSize), recalculateCenter); // Finally ask the canvasController to recenter d->canvasController->recenterPreferred(); }
void KoPanTool::mouseMoveEvent(KoPointerEvent *event) { Q_ASSERT(m_controller); if (event->buttons() == 0) return; event->accept(); QPointF actualPosition = documentToViewport(event->point); QPointF distance(m_lastPosition - actualPosition); m_controller->pan(distance.toPoint()); m_lastPosition = actualPosition; }
void KoZoomController::setZoom(KoZoomMode::Mode mode, qreal zoom, qreal resolutionX, qreal resolutionY, const QPointF &stillPoint) { if (d->zoomHandler->zoomMode() == mode && qFuzzyCompare(d->zoomHandler->zoom(), zoom) && qFuzzyCompare(d->zoomHandler->resolutionX(), resolutionX) && qFuzzyCompare(d->zoomHandler->resolutionY(), resolutionY)) { return; // no change } qreal oldEffectiveZoom = d->action->effectiveZoom(); QSize oldPageViewportSize = documentToViewport(d->pageSize); QSize oldTextViewportSize = documentToViewport(QSizeF(d->textMaxX-d->textMinX, 1)); qreal yfixAlignTop = d->canvasController->viewportSize().height(); if(!qFuzzyCompare(d->zoomHandler->resolutionX(), resolutionX) || !qFuzzyCompare(d->zoomHandler->resolutionY(), resolutionY)) { d->zoomHandler->setResolution(resolutionX, resolutionY); } if(mode == KoZoomMode::ZOOM_CONSTANT) { if(zoom == 0.0) return; d->action->setZoom(zoom); } else if(mode == KoZoomMode::ZOOM_WIDTH) { zoom = (d->canvasController->viewportSize().width() - 2 * d->fitMargin) / (oldPageViewportSize.width() / d->zoomHandler->zoom()); d->action->setSelectedZoomMode(mode); d->action->setEffectiveZoom(zoom); } else if(mode == KoZoomMode::ZOOM_PAGE) { zoom = (d->canvasController->viewportSize().width() - 2 * d->fitMargin) / (oldPageViewportSize.width() / d->zoomHandler->zoom()); zoom = qMin(zoom, (d->canvasController->viewportSize().height() - 2 * d->fitMargin) / (oldPageViewportSize.height() / d->zoomHandler->zoom())); d->action->setSelectedZoomMode(mode); d->action->setEffectiveZoom(zoom); } else if (mode == KoZoomMode::ZOOM_TEXT) { zoom = (d->canvasController->viewportSize().width() - 2 * d->fitMargin) / (oldTextViewportSize.width() / d->zoomHandler->zoom()); d->action->setSelectedZoomMode(mode); d->action->setEffectiveZoom(zoom); } d->zoomHandler->setZoomMode(mode); d->zoomHandler->setZoom(d->action->effectiveZoom()); #ifdef DEBUG if(! d->documentSize.isValid()) kWarning(30004) << "Setting zoom while there is no document size set, this will fail"; else if (d->pageSize.width() > d->documentSize.width() || d->pageSize.height() > d->documentSize.height()) kWarning(30004) << "ZoomController; Your page size is larger than your document size (" << d->pageSize << " > " << d->documentSize << ")\n"; #endif QSize documentViewportSize = documentToViewport(d->documentSize); // Tell the canvasController that the zoom has changed // Actually canvasController doesn't know about zoom, but the document in pixels // has changed as a result of the zoom change // To allow listeners of offset changes to react on the real new offset and not on the // intermediate offsets, we block the signals here, and emit by ourselves later. d->canvasController->proxyObject->blockSignals(true); d->canvasController->updateDocumentSize(documentViewportSize, true); d->canvasController->proxyObject->blockSignals(false); // Finally ask the canvasController to recenter if (d->canvasController->canvasMode() == KoCanvasController::Infinite) { QPointF documentCenter; if (mode == KoZoomMode::ZOOM_WIDTH || mode == KoZoomMode::ZOOM_PAGE) { documentCenter = QRectF(QPointF(), documentViewportSize).center(); } else { qreal zoomCoeff = d->action->effectiveZoom() / oldEffectiveZoom; QPointF oldCenter = d->canvasController->preferredCenter(); documentCenter = stillPoint * zoomCoeff - (stillPoint - 1.0 / zoomCoeff * oldCenter); } d->canvasController->setPreferredCenter(documentCenter); } else if (mode == KoZoomMode::ZOOM_TEXT) { QPointF documentCenter = d->canvasController->preferredCenter(); yfixAlignTop -= d->canvasController->viewportSize().height(); documentCenter.setX(d->zoomHandler->documentToViewX(d->textMinX + d->textMaxX) * 0.5); documentCenter.setY(documentCenter.y() - yfixAlignTop); d->canvasController->setPreferredCenter(documentCenter); } else { if (d->canvasController->canvasMode() == KoCanvasController::AlignTop) { QPointF documentCenter = d->canvasController->preferredCenter(); documentCenter.setX(0.0); d->canvasController->setPreferredCenter(documentCenter); } else { d->canvasController->recenterPreferred(); } } // now that we have the final offset, let's emit some signals //d->canvasController->proxyObject->emitCanvasOffsetXChanged(d->canvasController->canvasOffsetX()); //d->canvasController->proxyObject->emitCanvasOffsetYChanged(d->canvasController->canvasOffsetY()); emit zoomChanged(mode, d->action->effectiveZoom()); }
void KoPanTool::mousePressEvent(KoPointerEvent *event) { m_lastPosition = documentToViewport(event->point); event->accept(); useCursor(QCursor(Qt::ClosedHandCursor)); }