diff --git a/app/graphicsview.cpp b/app/graphicsview.cpp index d2a3346..a2012b9 100644 --- a/app/graphicsview.cpp +++ b/app/graphicsview.cpp @@ -35,7 +35,7 @@ GraphicsView::GraphicsView(QWidget *parent) void GraphicsView::showFileFromPath(const QString &filePath, bool doRequestGallery) { - emit navigatorViewRequired(false, 0); + emit navigatorViewRequired(false, transform()); if (filePath.endsWith(".svg")) { showSvg(filePath); @@ -122,7 +122,6 @@ qreal GraphicsView::scaleFactor() const void GraphicsView::resetTransform() { - m_rotateAngle = 0; QGraphicsView::resetTransform(); } @@ -131,7 +130,7 @@ void GraphicsView::zoomView(qreal scaleFactor) m_enableFitInView = false; scale(scaleFactor, scaleFactor); applyTransformationModeByScaleFactor(); - emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), m_rotateAngle); + emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform()); } void GraphicsView::flipView(bool horizontal) @@ -141,21 +140,20 @@ void GraphicsView::flipView(bool horizontal) } else { scale(1, -1); } - // I guess we don't need to check if we need to trigger navigator view here - // since fliping doesn't affact the image rectangle size. + // Ensure the navigation view is also flipped. + emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform()); } void GraphicsView::resetScale() { - resetWithScaleAndRotate(1, m_rotateAngle); - emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), m_rotateAngle); + setTransform(resetScale(transform())); + emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform()); } void GraphicsView::rotateView(qreal rotateAngel) { - m_rotateAngle += rotateAngel; - m_rotateAngle = static_cast(m_rotateAngle) % 360; - resetWithScaleAndRotate(1, m_rotateAngle); + resetScale(); + rotate(rotateAngel); } void GraphicsView::fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRadioMode) @@ -176,6 +174,18 @@ void GraphicsView::checkAndDoFitInView(bool markItOnAnyway) } } +inline double zeroOrOne(double number) +{ + return qFuzzyIsNull(number) ? 0 : (number > 0 ? 1 : -1); +} + +QTransform GraphicsView::resetScale(const QTransform & orig) +{ + return QTransform(zeroOrOne(orig.m11()), zeroOrOne(orig.m12()), + zeroOrOne(orig.m21()), zeroOrOne(orig.m22()), + orig.dx(), orig.dy()); +} + void GraphicsView::toggleCheckerboard(bool invertCheckerboardColor) { setCheckerboardEnabled(!m_checkerboardEnabled, invertCheckerboardColor); @@ -221,9 +231,7 @@ void GraphicsView::wheelEvent(QWheelEvent *event) void GraphicsView::resizeEvent(QResizeEvent *event) { if (m_enableFitInView) { - QTransform tf; - tf.rotate(m_rotateAngle); - bool originalSizeSmallerThanWindow = isThingSmallerThanWindowWith(tf); + bool originalSizeSmallerThanWindow = isThingSmallerThanWindowWith(resetScale(transform())); if (originalSizeSmallerThanWindow && scaleFactor() >= 1) { // no longer need to do fitInView() // but we leave the m_enableFitInView value unchanged in case @@ -234,7 +242,7 @@ void GraphicsView::resizeEvent(QResizeEvent *event) fitInView(sceneRect(), Qt::KeepAspectRatio); } } else { - emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), m_rotateAngle); + emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform()); } return QGraphicsView::resizeEvent(event); } diff --git a/app/graphicsview.h b/app/graphicsview.h index 708245e..bdeeb4a 100644 --- a/app/graphicsview.h +++ b/app/graphicsview.h @@ -33,8 +33,10 @@ public: void checkAndDoFitInView(bool markItOnAnyway = true); + static QTransform resetScale(const QTransform & orig); + signals: - void navigatorViewRequired(bool required, qreal angle); + void navigatorViewRequired(bool required, QTransform transform); void viewportRectChanged(); void requestGallery(const QString &filePath); @@ -62,7 +64,6 @@ private: bool m_enableFitInView = false; bool m_checkerboardEnabled = false; bool m_isLastCheckerboardColorInverted = false; - qreal m_rotateAngle = 0; }; #endif // GRAPHICSVIEW_H diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index ed413a8..3220d3a 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -69,9 +69,8 @@ MainWindow::MainWindow(QWidget *parent) m_gv->fitInView(m_gv->sceneRect(), Qt::KeepAspectRatio); connect(m_graphicsView, &GraphicsView::navigatorViewRequired, - this, [ = ](bool required, qreal angle){ - m_gv->resetTransform(); - m_gv->rotate(angle); + this, [ = ](bool required, QTransform tf){ + m_gv->setTransform(GraphicsView::resetScale(tf)); m_gv->fitInView(m_gv->sceneRect(), Qt::KeepAspectRatio); m_gv->setVisible(required); m_gv->updateMainViewportRegion(); @@ -120,7 +119,6 @@ MainWindow::MainWindow(QWidget *parent) this, &MainWindow::toggleCheckerboard); connect(m_bottomButtonGroup, &BottomButtonGroup::rotateRightBtnClicked, this, [ = ](){ - m_graphicsView->resetScale(); m_graphicsView->rotateView(90); m_graphicsView->checkAndDoFitInView(); m_gv->setVisible(false);