diff options
author | Katarina Behrens <[email protected]> | 2022-01-27 14:58:00 +0100 |
---|---|---|
committer | Katarina Behrens <[email protected]> | 2022-02-01 17:11:30 +0000 |
commit | dbfd226e851cd093fed1b127fb1e68208286f11e (patch) | |
tree | 0128c8684fa574f6120807f18c06432d8b5ffc82 /src/plugins/imageviewer/imageview.cpp | |
parent | 95627ce10f336d327d46e5f81e70b52ae82f7e6d (diff) |
Imageviewer: zoom in and out using fixed set of common-sense zoom values
Previously scale factor for zoom in/out was calculated as
$(currentScaleFactor)^1.2
This results in weird zoom levels such as 83.3% or 144%. Replace this
approach with using pre-defined set of 'normal' zoom level values
such as {25%, 50%, .. 100%, 150%, 200% .. }, similar to what most
graphic editors do
To find the nearest greater or lesser fixed zoom level for any given
floating point scale factor I borrowed some code from qmldesigner/
timelinewidget
I didn't know what to do with zooming using mouse wheel so I left the
old code in place
Change-Id: Id037ef99f89cce5e8dcd58bb9ad0e6f3c8536f36
Reviewed-by: Alessandro Portale <[email protected]>
Reviewed-by: Qt CI Bot <[email protected]>
Reviewed-by: <[email protected]>
Diffstat (limited to 'src/plugins/imageviewer/imageview.cpp')
-rw-r--r-- | src/plugins/imageviewer/imageview.cpp | 46 |
1 files changed, 33 insertions, 13 deletions
diff --git a/src/plugins/imageviewer/imageview.cpp b/src/plugins/imageviewer/imageview.cpp index c435666d15f..c5ef478e595 100644 --- a/src/plugins/imageviewer/imageview.cpp +++ b/src/plugins/imageviewer/imageview.cpp @@ -57,10 +57,31 @@ namespace ImageViewer { namespace Constants { const qreal DEFAULT_SCALE_FACTOR = 1.2; + const qreal zoomLevels[] = { 0.25, 0.5, 0.75, 1.0, 1.5, 2.0, 4.0, 8.0 }; } namespace Internal { +static qreal nextLevel(qreal currentLevel) +{ + auto iter = std::find_if(std::begin(Constants::zoomLevels), std::end(Constants::zoomLevels), [&](qreal val) { + return val > currentLevel; + }); + if (iter != std::end(Constants::zoomLevels)) + return *iter; + return currentLevel; +} + +static qreal previousLevel(qreal currentLevel) +{ + auto iter = std::find_if(std::rbegin(Constants::zoomLevels), std::rend(Constants::zoomLevels), [&](qreal val) { + return val < currentLevel; + }); + if (iter != std::rend(Constants::zoomLevels)) + return *iter; + return currentLevel; +} + ImageView::ImageView(ImageViewerFile *file) : m_file(file) { @@ -245,16 +266,7 @@ void ImageView::setViewOutline(bool enable) void ImageView::doScale(qreal factor) { - qreal currentScale = transform().m11(); - qreal newScale = currentScale * factor; - qreal actualFactor = factor; - // cap to 0.001 - 1000 - if (newScale > 1000) - actualFactor = 1000./currentScale; - else if (newScale < 0.001) - actualFactor = 0.001/currentScale; - - scale(actualFactor, actualFactor); + scale(factor, factor); emitScaleFactor(); if (auto pixmapItem = dynamic_cast<QGraphicsPixmapItem *>(m_imageItem)) pixmapItem->setTransformationMode( @@ -264,18 +276,26 @@ void ImageView::doScale(qreal factor) void ImageView::wheelEvent(QWheelEvent *event) { qreal factor = qPow(Constants::DEFAULT_SCALE_FACTOR, event->angleDelta().y() / 240.0); - doScale(factor); + qreal currentScale = transform().m11(); + qreal newScale = currentScale * factor; + // cap to 0.001 - 1000 + qreal actualFactor = qBound(0.001, factor, 1000.0); + doScale(actualFactor); event->accept(); } void ImageView::zoomIn() { - doScale(Constants::DEFAULT_SCALE_FACTOR); + qreal nextZoomLevel = nextLevel(transform().m11()); + resetTransform(); + doScale(nextZoomLevel); } void ImageView::zoomOut() { - doScale(1. / Constants::DEFAULT_SCALE_FACTOR); + qreal previousZoomLevel = previousLevel(transform().m11()); + resetTransform(); + doScale(previousZoomLevel); } void ImageView::resetToOriginalSize() |