aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/imageviewer/imageview.cpp
diff options
context:
space:
mode:
authorKatarina Behrens <[email protected]>2022-01-27 14:58:00 +0100
committerKatarina Behrens <[email protected]>2022-02-01 17:11:30 +0000
commitdbfd226e851cd093fed1b127fb1e68208286f11e (patch)
tree0128c8684fa574f6120807f18c06432d8b5ffc82 /src/plugins/imageviewer/imageview.cpp
parent95627ce10f336d327d46e5f81e70b52ae82f7e6d (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.cpp46
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()