ImageViewer: Make "Fit to Screen" sticky

Instead of "Fit to Screen" being a single-shot action, make it a
property that sticks as long as the image is not resized by the other
buttons or the mouse wheel. Meaning that it will resize to the screen
when the viewer size changes as long as the property is on.

Task-number: QTCREATORBUG-27816
Change-Id: I3b790dd7f94e4b964a734658dac4a637c8105b84
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Eike Ziller
2022-09-14 13:55:43 +02:00
parent b573250a8a
commit 2bfc8173e5
3 changed files with 40 additions and 7 deletions

View File

@@ -265,6 +265,7 @@ void ImageView::doScale(qreal factor)
void ImageView::wheelEvent(QWheelEvent *event)
{
setFitToScreen(false);
qreal factor = qPow(Constants::DEFAULT_SCALE_FACTOR, event->angleDelta().y() / 240.0);
// cap to 0.001 - 1000
qreal actualFactor = qBound(0.001, factor, 1000.0);
@@ -272,8 +273,16 @@ void ImageView::wheelEvent(QWheelEvent *event)
event->accept();
}
void ImageView::resizeEvent(QResizeEvent *event)
{
QGraphicsView::resizeEvent(event);
if (m_fitToScreen)
doFitToScreen();
}
void ImageView::zoomIn()
{
setFitToScreen(false);
qreal nextZoomLevel = nextLevel(transform().m11());
resetTransform();
doScale(nextZoomLevel);
@@ -281,6 +290,7 @@ void ImageView::zoomIn()
void ImageView::zoomOut()
{
setFitToScreen(false);
qreal previousZoomLevel = previousLevel(transform().m11());
resetTransform();
doScale(previousZoomLevel);
@@ -288,11 +298,22 @@ void ImageView::zoomOut()
void ImageView::resetToOriginalSize()
{
setFitToScreen(false);
resetTransform();
emitScaleFactor();
}
void ImageView::fitToScreen()
void ImageView::setFitToScreen(bool fit)
{
if (fit == m_fitToScreen)
return;
m_fitToScreen = fit;
if (m_fitToScreen)
doFitToScreen();
emit fitToScreenChanged(m_fitToScreen);
}
void ImageView::doFitToScreen()
{
fitInView(m_imageItem, Qt::KeepAspectRatio);
emitScaleFactor();

View File

@@ -36,13 +36,15 @@ public:
void zoomIn();
void zoomOut();
void resetToOriginalSize();
void fitToScreen();
void setFitToScreen(bool fit);
signals:
void scaleFactorChanged(qreal factor);
void imageSizeChanged(const QSize &size);
void fitToScreenChanged(bool fit);
private:
void doFitToScreen();
void emitScaleFactor();
void doScale(qreal factor);
QSize svgSize() const;
@@ -53,6 +55,7 @@ private:
void hideEvent(QHideEvent *event) override;
void showEvent(QShowEvent *event) override;
void wheelEvent(QWheelEvent *event) override;
void resizeEvent(QResizeEvent *event) override;
ImageViewerFile *m_file;
QGraphicsItem *m_imageItem = nullptr;
@@ -60,6 +63,7 @@ private:
QGraphicsRectItem *m_outlineItem = nullptr;
bool m_showBackground = false;
bool m_showOutline = true;
bool m_fitToScreen = false;
};
} // ImageViewer::Internal

View File

@@ -117,7 +117,7 @@ void ImageViewer::ctor()
d->toolButtonOutline->setCheckable(true);
d->toolButtonOutline->setChecked(true);
d->toolButtonFitToScreen->setCheckable(false);
d->toolButtonFitToScreen->setCheckable(true);
d->toolButtonZoomIn->setAutoRepeat(true);
@@ -199,10 +199,18 @@ void ImageViewer::ctor()
d->imageView, &ImageView::zoomIn);
connect(d->toolButtonZoomOut, &QAbstractButton::clicked,
d->imageView, &ImageView::zoomOut);
connect(d->toolButtonFitToScreen, &QAbstractButton::clicked,
d->imageView, &ImageView::fitToScreen);
connect(d->toolButtonOriginalSize, &QAbstractButton::clicked,
d->imageView, &ImageView::resetToOriginalSize);
connect(d->toolButtonFitToScreen,
&QAbstractButton::toggled,
d->imageView,
&ImageView::setFitToScreen);
connect(d->imageView,
&ImageView::fitToScreenChanged,
d->toolButtonFitToScreen,
&QAbstractButton::setChecked);
connect(d->toolButtonOriginalSize,
&QAbstractButton::clicked,
d->imageView,
&ImageView::resetToOriginalSize);
connect(d->toolButtonBackground, &QAbstractButton::toggled,
d->imageView, &ImageView::setViewBackground);
connect(d->toolButtonOutline, &QAbstractButton::toggled,