chore: tweak fit-in-view menu action behavior

This commit is contained in:
Gary Wang 2021-06-07 14:06:57 +08:00
parent 635199b85b
commit 4c07a89ca3
4 changed files with 27 additions and 19 deletions

View File

@ -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,16 +196,22 @@ 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;
}
bool GraphicsView::isSceneBiggerThanView() const
{
if (!isThingSmallerThanWindowWith(transform())) {
return true;
} else {
return false;
}
}
// Automately do fit in view when viewport(window) smaller than image original size.

View File

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

View File

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

View File

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