diff --git a/src/ExportManager.cpp b/src/ExportManager.cpp --- a/src/ExportManager.cpp +++ b/src/ExportManager.cpp @@ -280,6 +280,7 @@ bool ExportManager::writeImage(QIODevice *device, const QByteArray &format) { QImageWriter imageWriter(device, format); + imageWriter.setQuality(SpectacleConfig::instance()->compressionQuality()); if (!(imageWriter.canWrite())) { emit errorMessage(i18n("QImageWriter cannot write image: %1", imageWriter.errorString())); return false; diff --git a/src/Gui/SettingsDialog/SaveOptionsPage.h b/src/Gui/SettingsDialog/SaveOptionsPage.h --- a/src/Gui/SettingsDialog/SaveOptionsPage.h +++ b/src/Gui/SettingsDialog/SaveOptionsPage.h @@ -27,6 +27,8 @@ class QComboBox; class KUrlRequester; class QCheckBox; +class QSlider; +class QLabel; class SaveOptionsPage : public SettingsPage { @@ -44,14 +46,16 @@ private Q_SLOTS: void markDirty(); + void updateQualityValue(); private: - QDialogButtonBox *mDialogButtonBox; QLineEdit *mSaveNameFormat; KUrlRequester *mUrlRequester; QComboBox *mSaveImageFormat; QCheckBox *mCopyPathToClipboard; + QSlider *mQualitySlider; + QLabel *mQualityValue; }; diff --git a/src/Gui/SettingsDialog/SaveOptionsPage.cpp b/src/Gui/SettingsDialog/SaveOptionsPage.cpp --- a/src/Gui/SettingsDialog/SaveOptionsPage.cpp +++ b/src/Gui/SettingsDialog/SaveOptionsPage.cpp @@ -36,6 +36,7 @@ SaveOptionsPage::SaveOptionsPage(QWidget *parent) : SettingsPage(parent) { + QFormLayout *mainLayout = new QFormLayout; setLayout(mainLayout); @@ -53,6 +54,28 @@ mainLayout->addItem(new QSpacerItem(0, 18, QSizePolicy::Fixed, QSizePolicy::Fixed)); + // Compression quality slider and current value display + QHBoxLayout *qualitySliderLayout = new QHBoxLayout(); + + // Current value + mQualityValue = new QLabel(); + mQualityValue->setNum(SpectacleConfig::instance()->compressionQuality()); + mQualityValue->setMinimumWidth(mQualityValue->fontInfo().pointSize()*3); + + // Slider + mQualitySlider = new QSlider(Qt::Horizontal); + mQualitySlider->setRange(0, 100); + mQualitySlider->setTickInterval(5); + mQualitySlider->setSliderPosition(SpectacleConfig::instance()->compressionQuality()); + mQualitySlider->setTickPosition(QSlider::TicksBelow); + mQualitySlider->setTracking(true); + connect(mQualitySlider, &QSlider::valueChanged, this, &SaveOptionsPage::updateQualityValue); + + qualitySliderLayout->addWidget(mQualitySlider); + qualitySliderLayout->addWidget(mQualityValue); + mainLayout->addRow(i18n("Compression Quality:"), qualitySliderLayout); + + mainLayout->addItem(new QSpacerItem(0, 18, QSizePolicy::Fixed, QSizePolicy::Fixed)); // filename chooser and instructional text QVBoxLayout *saveNameLayout = new QVBoxLayout; @@ -88,6 +111,7 @@ saveFieldLayout->addWidget(mSaveImageFormat); saveNameLayout->addLayout(saveFieldLayout); + // now the save filename format layout const QString helpText = i18nc("%1 is the default filename of a screenshot", "

You can use the following placeholders in the filename, which will be replaced " @@ -121,6 +145,7 @@ saveNameLayout->addWidget(fmtHelpText); mainLayout->addRow(i18n("Filename:"), saveNameLayout); + // read in the data resetChanges(); } @@ -130,6 +155,12 @@ mChangesMade = true; } +void SaveOptionsPage::updateQualityValue() +{ + mQualityValue->setNum(mQualitySlider->value()); + this->markDirty(); +} + void SaveOptionsPage::saveChanges() { // bring up the configuration reader @@ -142,6 +173,7 @@ cfgManager->setAutoSaveFilenameFormat(mSaveNameFormat->text()); cfgManager->setSaveImageFormat(mSaveImageFormat->currentText().toLower()); cfgManager->setCopySaveLocationToClipboard(mCopyPathToClipboard->checkState() == Qt::Checked); + cfgManager->setCompressionQuality(mQualitySlider->value()); // done @@ -159,6 +191,7 @@ mSaveNameFormat->setText(cfgManager->autoSaveFilenameFormat()); mUrlRequester->setUrl(QUrl::fromUserInput(cfgManager->defaultSaveLocation())); mCopyPathToClipboard->setChecked(cfgManager->copySaveLocationToClipboard()); + mQualitySlider->setSliderPosition(cfgManager->compressionQuality()); // read in the save image format and calculate its index diff --git a/src/Gui/SettingsDialog/SettingsDialog.cpp b/src/Gui/SettingsDialog/SettingsDialog.cpp --- a/src/Gui/SettingsDialog/SettingsDialog.cpp +++ b/src/Gui/SettingsDialog/SettingsDialog.cpp @@ -33,7 +33,7 @@ // set up window options and geometry setWindowTitle(i18nc("@title:window", "Configure")); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); - resize(530, 470); + resize(600, 550); // init all pages QMetaObject::invokeMethod(this, "initPages", Qt::QueuedConnection); diff --git a/src/SpectacleConfig.h b/src/SpectacleConfig.h --- a/src/SpectacleConfig.h +++ b/src/SpectacleConfig.h @@ -111,6 +111,9 @@ bool useLightRegionMaskColour() const; void setUseLightRegionMaskColour(bool enabled); + int compressionQuality() const; + void setCompressionQuality(int value); + SaveMode lastUsedSaveMode() const; void setLastUsedSaveMode(SaveMode mode); diff --git a/src/SpectacleConfig.cpp b/src/SpectacleConfig.cpp --- a/src/SpectacleConfig.cpp +++ b/src/SpectacleConfig.cpp @@ -256,6 +256,19 @@ mGuiConfig.sync(); } +// compression quality setting + +int SpectacleConfig::compressionQuality() const +{ + return mGuiConfig.readEntry(QStringLiteral("compressionQuality"), 90); +} + +void SpectacleConfig::setCompressionQuality(int value) +{ + mGuiConfig.writeEntry(QStringLiteral("compressionQuality"), value); + mGuiConfig.sync(); +} + // last used save mode SaveMode SpectacleConfig::lastUsedSaveMode() const