forked from qt-creator/qt-creator
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:
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user