ImageViewer: Add button for saving current view settings as default

Fixes: QTCREATORBUG-27816
Change-Id: I85806634ea9f10761d281ab8c8cf892dd1b65145
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Eike Ziller
2022-09-14 16:31:30 +02:00
parent e7ddd8a5b7
commit e57b797342
3 changed files with 75 additions and 14 deletions

View File

@@ -14,6 +14,7 @@
#include <utils/fileutils.h> #include <utils/fileutils.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/qtcsettings.h>
#include <QClipboard> #include <QClipboard>
#include <QDir> #include <QDir>
@@ -34,6 +35,11 @@
#include <QSvgRenderer> #include <QSvgRenderer>
#endif #endif
const char kSettingsGroup[] = "ImageViewer";
const char kSettingsBackground[] = "ShowBackground";
const char kSettingsOutline[] = "ShowOutline";
const char kSettingsFitToScreen[] = "FitToScreen";
namespace ImageViewer { namespace ImageViewer {
namespace Constants { namespace Constants {
const qreal DEFAULT_SCALE_FACTOR = 1.2; const qreal DEFAULT_SCALE_FACTOR = 1.2;
@@ -105,7 +111,7 @@ void ImageView::createScene()
m_backgroundItem = new QGraphicsRectItem(m_imageItem->boundingRect()); m_backgroundItem = new QGraphicsRectItem(m_imageItem->boundingRect());
m_backgroundItem->setBrush(Qt::white); m_backgroundItem->setBrush(Qt::white);
m_backgroundItem->setPen(Qt::NoPen); m_backgroundItem->setPen(Qt::NoPen);
m_backgroundItem->setVisible(m_showBackground); m_backgroundItem->setVisible(m_settings.showBackground);
m_backgroundItem->setZValue(-1); m_backgroundItem->setZValue(-1);
// outline // outline
@@ -114,7 +120,7 @@ void ImageView::createScene()
outline.setCosmetic(true); outline.setCosmetic(true);
m_outlineItem->setPen(outline); m_outlineItem->setPen(outline);
m_outlineItem->setBrush(Qt::NoBrush); m_outlineItem->setBrush(Qt::NoBrush);
m_outlineItem->setVisible(m_showOutline); m_outlineItem->setVisible(m_settings.showOutline);
m_outlineItem->setZValue(1); m_outlineItem->setZValue(1);
QGraphicsScene *s = scene(); QGraphicsScene *s = scene();
@@ -242,14 +248,14 @@ void ImageView::copyDataUrl()
void ImageView::setViewBackground(bool enable) void ImageView::setViewBackground(bool enable)
{ {
m_showBackground = enable; m_settings.showBackground = enable;
if (m_backgroundItem) if (m_backgroundItem)
m_backgroundItem->setVisible(enable); m_backgroundItem->setVisible(enable);
} }
void ImageView::setViewOutline(bool enable) void ImageView::setViewOutline(bool enable)
{ {
m_showOutline = enable; m_settings.showOutline = enable;
if (m_outlineItem) if (m_outlineItem)
m_outlineItem->setVisible(enable); m_outlineItem->setVisible(enable);
} }
@@ -276,7 +282,7 @@ void ImageView::wheelEvent(QWheelEvent *event)
void ImageView::resizeEvent(QResizeEvent *event) void ImageView::resizeEvent(QResizeEvent *event)
{ {
QGraphicsView::resizeEvent(event); QGraphicsView::resizeEvent(event);
if (m_fitToScreen) if (m_settings.fitToScreen)
doFitToScreen(); doFitToScreen();
} }
@@ -305,12 +311,39 @@ void ImageView::resetToOriginalSize()
void ImageView::setFitToScreen(bool fit) void ImageView::setFitToScreen(bool fit)
{ {
if (fit == m_fitToScreen) if (fit == m_settings.fitToScreen)
return; return;
m_fitToScreen = fit; m_settings.fitToScreen = fit;
if (m_fitToScreen) if (m_settings.fitToScreen)
doFitToScreen(); doFitToScreen();
emit fitToScreenChanged(m_fitToScreen); emit fitToScreenChanged(m_settings.fitToScreen);
}
void ImageView::readSettings(Utils::QtcSettings *settings)
{
const Settings def;
settings->beginGroup(kSettingsGroup);
m_settings.showBackground = settings->value(kSettingsBackground, def.showBackground).toBool();
m_settings.showOutline = settings->value(kSettingsOutline, def.showOutline).toBool();
m_settings.fitToScreen = settings->value(kSettingsFitToScreen, def.fitToScreen).toBool();
settings->endGroup();
}
void ImageView::writeSettings(Utils::QtcSettings *settings) const
{
const Settings def;
settings->beginGroup(kSettingsGroup);
settings->setValueWithDefault(kSettingsBackground,
m_settings.showBackground,
def.showBackground);
settings->setValueWithDefault(kSettingsOutline, m_settings.showOutline, def.showOutline);
settings->setValueWithDefault(kSettingsFitToScreen, m_settings.fitToScreen, def.fitToScreen);
settings->endGroup();
}
ImageView::Settings ImageView::settings() const
{
return m_settings;
} }
void ImageView::doFitToScreen() void ImageView::doFitToScreen()

View File

@@ -8,6 +8,10 @@
QT_FORWARD_DECLARE_CLASS(QImage) QT_FORWARD_DECLARE_CLASS(QImage)
namespace Utils {
class QtcSettings;
}
namespace ImageViewer::Internal { namespace ImageViewer::Internal {
class ImageViewerFile; class ImageViewerFile;
@@ -22,6 +26,13 @@ class ImageView : public QGraphicsView
Q_OBJECT Q_OBJECT
public: public:
struct Settings
{
bool showBackground = false;
bool showOutline = true;
bool fitToScreen = false;
};
ImageView(ImageViewerFile *file); ImageView(ImageViewerFile *file);
~ImageView() override; ~ImageView() override;
@@ -38,6 +49,10 @@ public:
void resetToOriginalSize(); void resetToOriginalSize();
void setFitToScreen(bool fit); void setFitToScreen(bool fit);
void readSettings(Utils::QtcSettings *settings);
void writeSettings(Utils::QtcSettings *settings) const;
Settings settings() const;
signals: signals:
void scaleFactorChanged(qreal factor); void scaleFactorChanged(qreal factor);
void imageSizeChanged(const QSize &size); void imageSizeChanged(const QSize &size);
@@ -61,9 +76,7 @@ private:
QGraphicsItem *m_imageItem = nullptr; QGraphicsItem *m_imageItem = nullptr;
QGraphicsRectItem *m_backgroundItem = nullptr; QGraphicsRectItem *m_backgroundItem = nullptr;
QGraphicsRectItem *m_outlineItem = nullptr; QGraphicsRectItem *m_outlineItem = nullptr;
bool m_showBackground = false; Settings m_settings;
bool m_showOutline = true;
bool m_fitToScreen = false;
}; };
} // ImageViewer::Internal } // ImageViewer::Internal

View File

@@ -92,6 +92,8 @@ ImageViewer::ImageViewer(const QSharedPointer<ImageViewerFile> &document)
void ImageViewer::ctor() void ImageViewer::ctor()
{ {
d->imageView = new ImageView(d->file.data()); d->imageView = new ImageView(d->file.data());
d->imageView->readSettings(ICore::settings());
const ImageView::Settings settings = d->imageView->settings();
setContext(Core::Context(Constants::IMAGEVIEWER_ID)); setContext(Core::Context(Constants::IMAGEVIEWER_ID));
setWidget(d->imageView); setWidget(d->imageView);
@@ -112,12 +114,13 @@ void ImageViewer::ctor()
d->toolButtonPlayPause = new CommandButton; d->toolButtonPlayPause = new CommandButton;
d->toolButtonBackground->setCheckable(true); d->toolButtonBackground->setCheckable(true);
d->toolButtonBackground->setChecked(false); d->toolButtonBackground->setChecked(settings.showBackground);
d->toolButtonOutline->setCheckable(true); d->toolButtonOutline->setCheckable(true);
d->toolButtonOutline->setChecked(true); d->toolButtonOutline->setChecked(settings.showOutline);
d->toolButtonFitToScreen->setCheckable(true); d->toolButtonFitToScreen->setCheckable(true);
d->toolButtonFitToScreen->setChecked(settings.fitToScreen);
d->toolButtonZoomIn->setAutoRepeat(true); d->toolButtonZoomIn->setAutoRepeat(true);
@@ -153,6 +156,12 @@ void ImageViewer::ctor()
// (photograph has outline - piece of paper) // (photograph has outline - piece of paper)
updateButtonIconByTheme(d->toolButtonOutline, QLatin1String("emblem-photos")); updateButtonIconByTheme(d->toolButtonOutline, QLatin1String("emblem-photos"));
auto setAsDefaultButton = new QToolButton;
auto setAsDefault = new QAction(Tr::tr("Set as Default"), setAsDefaultButton);
setAsDefault->setToolTip(Tr::tr("Use the current settings for background, outline, and fitting "
"to screen as the default for new image viewers."));
setAsDefaultButton->setDefaultAction(setAsDefault);
d->toolButtonExportImage->setCommandId(Constants::ACTION_EXPORT_IMAGE); d->toolButtonExportImage->setCommandId(Constants::ACTION_EXPORT_IMAGE);
d->toolButtonMultiExportImages->setCommandId(Constants::ACTION_EXPORT_MULTI_IMAGES); d->toolButtonMultiExportImages->setCommandId(Constants::ACTION_EXPORT_MULTI_IMAGES);
d->toolButtonCopyDataUrl->setCommandId(Constants::ACTION_COPY_DATA_URL); d->toolButtonCopyDataUrl->setCommandId(Constants::ACTION_COPY_DATA_URL);
@@ -173,9 +182,12 @@ void ImageViewer::ctor()
horizontalLayout->addWidget(d->toolButtonExportImage); horizontalLayout->addWidget(d->toolButtonExportImage);
horizontalLayout->addWidget(d->toolButtonMultiExportImages); horizontalLayout->addWidget(d->toolButtonMultiExportImages);
horizontalLayout->addWidget(d->toolButtonCopyDataUrl); horizontalLayout->addWidget(d->toolButtonCopyDataUrl);
horizontalLayout->addWidget(new StyledSeparator);
horizontalLayout->addWidget(d->toolButtonBackground); horizontalLayout->addWidget(d->toolButtonBackground);
horizontalLayout->addWidget(d->toolButtonOutline); horizontalLayout->addWidget(d->toolButtonOutline);
horizontalLayout->addWidget(d->toolButtonFitToScreen); horizontalLayout->addWidget(d->toolButtonFitToScreen);
horizontalLayout->addWidget(setAsDefaultButton);
horizontalLayout->addWidget(new StyledSeparator);
horizontalLayout->addWidget(d->toolButtonOriginalSize); horizontalLayout->addWidget(d->toolButtonOriginalSize);
horizontalLayout->addWidget(d->toolButtonZoomIn); horizontalLayout->addWidget(d->toolButtonZoomIn);
horizontalLayout->addWidget(d->toolButtonZoomOut); horizontalLayout->addWidget(d->toolButtonZoomOut);
@@ -231,6 +243,9 @@ void ImageViewer::ctor()
this, &ImageViewer::updatePauseAction); this, &ImageViewer::updatePauseAction);
connect(d->imageView, &ImageView::scaleFactorChanged, connect(d->imageView, &ImageView::scaleFactorChanged,
this, &ImageViewer::scaleFactorUpdate); this, &ImageViewer::scaleFactorUpdate);
connect(setAsDefault, &QAction::triggered, d->imageView, [this] {
d->imageView->writeSettings(ICore::settings());
});
} }
ImageViewer::~ImageViewer() ImageViewer::~ImageViewer()