diff --git a/lib/documentview/abstractimageview.cpp b/lib/documentview/abstractimageview.cpp --- a/lib/documentview/abstractimageview.cpp +++ b/lib/documentview/abstractimageview.cpp @@ -268,6 +268,7 @@ { d->mZoomToFit = on; if (on) { + d->mZoomToFill = false; setZoom(computeZoomToFit()); } // We do not set zoom to 1 if zoomToFit is off, this is up to the code @@ -280,6 +281,7 @@ { d->mZoomToFill = on; if (on) { + d->mZoomToFit = false; setZoom(computeZoomToFill()); } // We do not set zoom to 1 if zoomToFit is off, this is up to the code diff --git a/lib/documentview/documentview.h b/lib/documentview/documentview.h --- a/lib/documentview/documentview.h +++ b/lib/documentview/documentview.h @@ -146,8 +146,10 @@ void setZoom(qreal); void setZoomToFit(bool); + void toggleZoomToFit(); void setZoomToFill(bool); + void toggleZoomToFill(); void setPosition(const QPoint&); diff --git a/lib/documentview/documentview.cpp b/lib/documentview/documentview.cpp --- a/lib/documentview/documentview.cpp +++ b/lib/documentview/documentview.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -417,6 +418,19 @@ mDragThumbnailProvider->appendItems(itemList); } } + + QPointF cursorPosition() { + const QGraphicsScene* sc = q->scene(); + if (sc) { + const auto views = sc->views(); + for (const QGraphicsView* view : views) { + if (view->underMouse()) { + return q->mapFromScene(view->mapFromGlobal(QCursor::pos())); + } + } + } + return QPointF(-1, -1); + } }; DocumentView::DocumentView(QGraphicsScene* scene) @@ -603,14 +617,30 @@ d->mAdapter->setZoomToFit(on); } +void DocumentView::toggleZoomToFit() { + const bool zoomToFitOn = d->mAdapter->zoomToFit(); + d->mAdapter->setZoomToFit(!zoomToFitOn); + if (zoomToFitOn) { + d->setZoom(1., d->cursorPosition()); + } +} + void DocumentView::setZoomToFill(bool on) { if (on == d->mAdapter->zoomToFill()) { return; } d->mAdapter->setZoomToFill(on); } +void DocumentView::toggleZoomToFill() { + const bool zoomToFillOn = d->mAdapter->zoomToFill(); + d->mAdapter->setZoomToFill(!zoomToFillOn); + if (zoomToFillOn) { + d->setZoom(1., d->cursorPosition()); + } +} + bool DocumentView::zoomToFit() const { return d->mAdapter->zoomToFit(); diff --git a/lib/documentview/documentviewcontroller.cpp b/lib/documentview/documentviewcontroller.cpp --- a/lib/documentview/documentviewcontroller.cpp +++ b/lib/documentview/documentviewcontroller.cpp @@ -25,7 +25,6 @@ #include "abstractdocumentviewadapter.h" #include "documentview.h" #include -#include #include #include @@ -189,10 +188,8 @@ connect(d->mView, &DocumentView::zoomToFillChanged, this, &DocumentViewController::updateZoomToFillActionFromView); connect(d->mView, &DocumentView::currentToolChanged, this, &DocumentViewController::updateTool); - connect(d->mZoomToFitAction, SIGNAL(toggled(bool)), - d->mView, SLOT(setZoomToFit(bool))); - connect(d->mZoomToFillAction, SIGNAL(toggled(bool)), - d->mView, SLOT(setZoomToFill(bool))); + connect(d->mZoomToFitAction, &QAction::triggered, d->mView, &DocumentView::toggleZoomToFit); + connect(d->mZoomToFillAction, &QAction::triggered, d->mView, &DocumentView::toggleZoomToFill); connect(d->mActualSizeAction, SIGNAL(triggered()), d->mView, SLOT(zoomActualSize())); connect(d->mZoomInAction, SIGNAL(triggered()), @@ -246,13 +243,11 @@ void DocumentViewController::updateZoomToFitActionFromView() { - SignalBlocker blocker(d->mZoomToFitAction); d->mZoomToFitAction->setChecked(d->mView->zoomToFit()); } void DocumentViewController::updateZoomToFillActionFromView() { - SignalBlocker blocker(d->mZoomToFillAction); d->mZoomToFillAction->setChecked(d->mView->zoomToFill()); }