From 4c07a89ca3a8a9bec39c3ff3bc984849ef218bf5 Mon Sep 17 00:00:00 2001 From: Gary Wang Date: Mon, 7 Jun 2021 14:06:57 +0800 Subject: [PATCH] chore: tweak fit-in-view menu action behavior --- app/graphicsview.cpp | 26 ++++++++++++++++---------- app/graphicsview.h | 6 +++++- app/mainwindow.cpp | 10 ++++------ app/mainwindow.h | 4 ++-- 4 files changed, 27 insertions(+), 19 deletions(-) diff --git a/app/graphicsview.cpp b/app/graphicsview.cpp index 440f54c..01f7c0b 100644 --- a/app/graphicsview.cpp +++ b/app/graphicsview.cpp @@ -75,35 +75,35 @@ void GraphicsView::showImage(const QPixmap &pixmap) { resetTransform(); scene()->showImage(pixmap); - checkAndDoFitInView(); + displayScene(); } void GraphicsView::showImage(const QImage &image) { resetTransform(); scene()->showImage(QPixmap::fromImage(image)); - checkAndDoFitInView(); + displayScene(); } void GraphicsView::showText(const QString &text) { resetTransform(); scene()->showText(text); - checkAndDoFitInView(); + displayScene(); } void GraphicsView::showSvg(const QString &filepath) { resetTransform(); scene()->showSvg(filepath); - checkAndDoFitInView(); + displayScene(); } void GraphicsView::showAnimated(const QString &filepath) { resetTransform(); scene()->showAnimated(filepath); - checkAndDoFitInView(); + displayScene(); } GraphicsScene *GraphicsView::scene() const @@ -196,15 +196,21 @@ void GraphicsView::fitByOrientation(Qt::Orientation ori, bool scaleDownOnly) emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform()); } -void GraphicsView::checkAndDoFitInView(bool markItOnAnyway) +void GraphicsView::displayScene() { - if (!isThingSmallerThanWindowWith(transform())) { - m_enableFitInView = true; + if (isSceneBiggerThanView()) { fitInView(sceneRect(), Qt::KeepAspectRatio); } - if (markItOnAnyway) { - m_enableFitInView = true; + m_enableFitInView = true; +} + +bool GraphicsView::isSceneBiggerThanView() const +{ + if (!isThingSmallerThanWindowWith(transform())) { + return true; + } else { + return false; } } diff --git a/app/graphicsview.h b/app/graphicsview.h index d27212c..c430247 100644 --- a/app/graphicsview.h +++ b/app/graphicsview.h @@ -32,7 +32,8 @@ public: void fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRadioMode = Qt::IgnoreAspectRatio); void fitByOrientation(Qt::Orientation ori = Qt::Horizontal, bool scaleDownOnly = false); - void checkAndDoFitInView(bool markItOnAnyway = true); + void displayScene(); + bool isSceneBiggerThanView() const; void setEnableAutoFitInView(bool enable = true); static QTransform resetScale(const QTransform & orig); @@ -61,6 +62,9 @@ private: void setCheckerboardEnabled(bool enabled, bool invertColor = false); void applyTransformationModeByScaleFactor(); + // Consider switch to 3 state for "no fit", "always fit" and "fit when view is smaller"? + // ... or even more? e.g. "fit/snap width" things... + // Currently it's "no fit" when it's false and "fit when view is smaller" when it's true. bool m_enableFitInView = false; bool m_checkerboardEnabled = false; bool m_isLastCheckerboardColorInverted = false; diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 7c5ba34..c6dbd6e 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -120,7 +120,7 @@ MainWindow::MainWindow(QWidget *parent) connect(m_bottomButtonGroup, &BottomButtonGroup::rotateRightBtnClicked, this, [ = ](){ m_graphicsView->rotateView(); - m_graphicsView->checkAndDoFitInView(); + m_graphicsView->displayScene(); m_gv->setVisible(false); }); @@ -493,12 +493,12 @@ void MainWindow::toggleStayOnTop() show(); } -bool MainWindow::stayOnTop() +bool MainWindow::stayOnTop() const { return windowFlags().testFlag(Qt::WindowStaysOnTopHint); } -bool MainWindow::canPaste() +bool MainWindow::canPaste() const { const QMimeData * clipboardData = QApplication::clipboard()->mimeData(); if (clipboardData->hasImage()) { @@ -565,10 +565,8 @@ void MainWindow::on_actionHorizontalFlip_triggered() void MainWindow::on_actionFitInView_triggered() { - // TODO: maybe do it if window is smaller than original image size? - m_graphicsView->setEnableAutoFitInView(false); - m_graphicsView->fitInView(m_gv->sceneRect(), Qt::KeepAspectRatio); + m_graphicsView->setEnableAutoFitInView(m_graphicsView->scaleFactor() <= 1); } void MainWindow::on_actionFitByWidth_triggered() diff --git a/app/mainwindow.h b/app/mainwindow.h index 50959c8..59509f5 100644 --- a/app/mainwindow.h +++ b/app/mainwindow.h @@ -53,8 +53,8 @@ protected slots: void toggleCheckerboard(); void toggleProtectedMode(); void toggleStayOnTop(); - bool stayOnTop(); - bool canPaste(); + bool stayOnTop() const; + bool canPaste() const; void quitAppAction(bool force = false); void toggleFullscreen(); void toggleMaximize();