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)
{
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<int>(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);
}

View File

@ -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

View File

@ -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);