chore: keep flipping state while rotation and etc.

This commit is contained in:
Gary Wang 2021-03-25 23:05:50 +08:00
parent cd94f1a84c
commit 483bb07b09
3 changed files with 27 additions and 20 deletions

View File

@ -35,7 +35,7 @@ GraphicsView::GraphicsView(QWidget *parent)
void GraphicsView::showFileFromPath(const QString &filePath, bool doRequestGallery) void GraphicsView::showFileFromPath(const QString &filePath, bool doRequestGallery)
{ {
emit navigatorViewRequired(false, 0); emit navigatorViewRequired(false, transform());
if (filePath.endsWith(".svg")) { if (filePath.endsWith(".svg")) {
showSvg(filePath); showSvg(filePath);
@ -122,7 +122,6 @@ qreal GraphicsView::scaleFactor() const
void GraphicsView::resetTransform() void GraphicsView::resetTransform()
{ {
m_rotateAngle = 0;
QGraphicsView::resetTransform(); QGraphicsView::resetTransform();
} }
@ -131,7 +130,7 @@ void GraphicsView::zoomView(qreal scaleFactor)
m_enableFitInView = false; m_enableFitInView = false;
scale(scaleFactor, scaleFactor); scale(scaleFactor, scaleFactor);
applyTransformationModeByScaleFactor(); applyTransformationModeByScaleFactor();
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), m_rotateAngle); emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
} }
void GraphicsView::flipView(bool horizontal) void GraphicsView::flipView(bool horizontal)
@ -141,21 +140,20 @@ void GraphicsView::flipView(bool horizontal)
} else { } else {
scale(1, -1); scale(1, -1);
} }
// I guess we don't need to check if we need to trigger navigator view here // Ensure the navigation view is also flipped.
// since fliping doesn't affact the image rectangle size. emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
} }
void GraphicsView::resetScale() void GraphicsView::resetScale()
{ {
resetWithScaleAndRotate(1, m_rotateAngle); setTransform(resetScale(transform()));
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), m_rotateAngle); emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
} }
void GraphicsView::rotateView(qreal rotateAngel) void GraphicsView::rotateView(qreal rotateAngel)
{ {
m_rotateAngle += rotateAngel; resetScale();
m_rotateAngle = static_cast<int>(m_rotateAngle) % 360; rotate(rotateAngel);
resetWithScaleAndRotate(1, m_rotateAngle);
} }
void GraphicsView::fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRadioMode) 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) void GraphicsView::toggleCheckerboard(bool invertCheckerboardColor)
{ {
setCheckerboardEnabled(!m_checkerboardEnabled, invertCheckerboardColor); setCheckerboardEnabled(!m_checkerboardEnabled, invertCheckerboardColor);
@ -221,9 +231,7 @@ void GraphicsView::wheelEvent(QWheelEvent *event)
void GraphicsView::resizeEvent(QResizeEvent *event) void GraphicsView::resizeEvent(QResizeEvent *event)
{ {
if (m_enableFitInView) { if (m_enableFitInView) {
QTransform tf; bool originalSizeSmallerThanWindow = isThingSmallerThanWindowWith(resetScale(transform()));
tf.rotate(m_rotateAngle);
bool originalSizeSmallerThanWindow = isThingSmallerThanWindowWith(tf);
if (originalSizeSmallerThanWindow && scaleFactor() >= 1) { if (originalSizeSmallerThanWindow && scaleFactor() >= 1) {
// no longer need to do fitInView() // no longer need to do fitInView()
// but we leave the m_enableFitInView value unchanged in case // but we leave the m_enableFitInView value unchanged in case
@ -234,7 +242,7 @@ void GraphicsView::resizeEvent(QResizeEvent *event)
fitInView(sceneRect(), Qt::KeepAspectRatio); fitInView(sceneRect(), Qt::KeepAspectRatio);
} }
} else { } else {
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), m_rotateAngle); emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
} }
return QGraphicsView::resizeEvent(event); return QGraphicsView::resizeEvent(event);
} }

View File

@ -33,8 +33,10 @@ public:
void checkAndDoFitInView(bool markItOnAnyway = true); void checkAndDoFitInView(bool markItOnAnyway = true);
static QTransform resetScale(const QTransform & orig);
signals: signals:
void navigatorViewRequired(bool required, qreal angle); void navigatorViewRequired(bool required, QTransform transform);
void viewportRectChanged(); void viewportRectChanged();
void requestGallery(const QString &filePath); void requestGallery(const QString &filePath);
@ -62,7 +64,6 @@ private:
bool m_enableFitInView = false; bool m_enableFitInView = false;
bool m_checkerboardEnabled = false; bool m_checkerboardEnabled = false;
bool m_isLastCheckerboardColorInverted = false; bool m_isLastCheckerboardColorInverted = false;
qreal m_rotateAngle = 0;
}; };
#endif // GRAPHICSVIEW_H #endif // GRAPHICSVIEW_H

View File

@ -69,9 +69,8 @@ MainWindow::MainWindow(QWidget *parent)
m_gv->fitInView(m_gv->sceneRect(), Qt::KeepAspectRatio); m_gv->fitInView(m_gv->sceneRect(), Qt::KeepAspectRatio);
connect(m_graphicsView, &GraphicsView::navigatorViewRequired, connect(m_graphicsView, &GraphicsView::navigatorViewRequired,
this, [ = ](bool required, qreal angle){ this, [ = ](bool required, QTransform tf){
m_gv->resetTransform(); m_gv->setTransform(GraphicsView::resetScale(tf));
m_gv->rotate(angle);
m_gv->fitInView(m_gv->sceneRect(), Qt::KeepAspectRatio); m_gv->fitInView(m_gv->sceneRect(), Qt::KeepAspectRatio);
m_gv->setVisible(required); m_gv->setVisible(required);
m_gv->updateMainViewportRegion(); m_gv->updateMainViewportRegion();
@ -120,7 +119,6 @@ MainWindow::MainWindow(QWidget *parent)
this, &MainWindow::toggleCheckerboard); this, &MainWindow::toggleCheckerboard);
connect(m_bottomButtonGroup, &BottomButtonGroup::rotateRightBtnClicked, connect(m_bottomButtonGroup, &BottomButtonGroup::rotateRightBtnClicked,
this, [ = ](){ this, [ = ](){
m_graphicsView->resetScale();
m_graphicsView->rotateView(90); m_graphicsView->rotateView(90);
m_graphicsView->checkAndDoFitInView(); m_graphicsView->checkAndDoFitInView();
m_gv->setVisible(false); m_gv->setVisible(false);