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,7 @@ class QComboBox; class KUrlRequester; class QCheckBox; +class QSlider; class SaveOptionsPage : public SettingsPage { @@ -47,12 +48,11 @@ private: - QDialogButtonBox *mDialogButtonBox; QLineEdit *mSaveNameFormat; KUrlRequester *mUrlRequester; QComboBox *mSaveImageFormat; QCheckBox *mCopyPathToClipboard; - + QSlider *mQualitySlider; }; #endif // SAVEOPTIONSPAGE_H 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 @@ -53,6 +53,40 @@ mainLayout->addItem(new QSpacerItem(0, 18, QSizePolicy::Fixed, QSizePolicy::Fixed)); + // Compression quality slider and current value display + QHBoxLayout *sliderHorizLayout = new QHBoxLayout(); + QVBoxLayout *sliderVertLayout = new QVBoxLayout(); + + // Current value + QLabel *qualityValue = new QLabel(); + qualityValue->setNum(SpectacleConfig::instance()->compressionQuality()); + qualityValue->setMinimumWidth(qualityValue->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, [=](int value) { + qualityValue->setNum(value); + markDirty(); + }); + + sliderHorizLayout->addWidget(mQualitySlider); + sliderHorizLayout->addWidget(qualityValue); + + sliderVertLayout->addLayout(sliderHorizLayout); + + QLabel *qualitySliderDescription = new QLabel(); + qualitySliderDescription->setText(i18n("Choose the image quality when saving with lossy image formats like JPEG")); + + sliderVertLayout->addWidget(qualitySliderDescription); + + mainLayout->addRow(i18n("Compression Quality:"), sliderVertLayout); + + mainLayout->addItem(new QSpacerItem(0, 18, QSizePolicy::Fixed, QSizePolicy::Fixed)); // filename chooser and instructional text QVBoxLayout *saveNameLayout = new QVBoxLayout; @@ -142,6 +176,7 @@ cfgManager->setAutoSaveFilenameFormat(mSaveNameFormat->text()); cfgManager->setSaveImageFormat(mSaveImageFormat->currentText().toLower()); cfgManager->setCopySaveLocationToClipboard(mCopyPathToClipboard->checkState() == Qt::Checked); + cfgManager->setCompressionQuality(mQualitySlider->value()); // done @@ -159,6 +194,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