File indexing completed on 2025-01-19 03:51:02

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2022-04-01
0007  * Description : JPEG-XL image export settings widget.
0008  *
0009  * SPDX-FileCopyrightText: 2022 by Gilles Caulier <caulier dot gilles at gmail dot com>
0010  *
0011  * SPDX-License-Identifier: GPL-2.0-or-later
0012  *
0013  * ============================================================ */
0014 
0015 #include "dimgjxlexportsettings.h"
0016 
0017 // Qt includes
0018 
0019 #include <QString>
0020 #include <QLabel>
0021 #include <QCheckBox>
0022 #include <QLayout>
0023 #include <QGridLayout>
0024 #include <QApplication>
0025 #include <QStyle>
0026 
0027 // KDE includes
0028 
0029 #include <klocalizedstring.h>
0030 
0031 // Local includes
0032 
0033 #include "dnuminput.h"
0034 
0035 namespace Digikam
0036 {
0037 
0038 class Q_DECL_HIDDEN DImgJXLExportSettings::Private
0039 {
0040 
0041 public:
0042 
0043     explicit Private()
0044       : JXLGrid            (nullptr),
0045         labelJXLcompression(nullptr),
0046         JXLLossLess        (nullptr),
0047         JXLcompression     (nullptr)
0048     {
0049     }
0050 
0051     QGridLayout*  JXLGrid;
0052 
0053     QLabel*       labelJXLcompression;
0054 
0055     QCheckBox*    JXLLossLess;
0056 
0057     DIntNumInput* JXLcompression;
0058 };
0059 
0060 DImgJXLExportSettings::DImgJXLExportSettings(QWidget* const parent)
0061     : DImgLoaderSettings(parent),
0062       d                 (new Private)
0063 {
0064     const int spacing = qMin(QApplication::style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing),
0065                              QApplication::style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing));
0066 
0067     d->JXLGrid     = new QGridLayout(this);
0068     d->JXLLossLess = new QCheckBox(i18n("Lossless JPEG XL files"), this);
0069 
0070     d->JXLLossLess->setWhatsThis(i18n("<p>Toggle lossless compression for JPEG XL images.</p>"
0071                                       "<p>If this option is enabled, a lossless method will be used "
0072                                       "to compress JPEG XL pictures.</p>"));
0073 
0074     d->JXLcompression = new DIntNumInput(this);
0075     d->JXLcompression->setDefaultValue(75);
0076     d->JXLcompression->setRange(1, 99, 1);
0077     d->labelJXLcompression = new QLabel(i18n("JPEG XL quality:"), this);
0078 
0079     d->JXLcompression->setWhatsThis(i18n("<p>The quality value for JPEG XL images:</p>"
0080                                          "<p><b>1</b>: low quality (high compression and small "
0081                                          "file size)<br/>"
0082                                          "<b>50</b>: medium quality<br/>"
0083                                          "<b>75</b>: good quality (default)<br/>"
0084                                          "<b>99</b>: high quality (no compression and "
0085                                          "large file size)</p>"
0086                                          "<p><b>Note: JPEG XL is not a lossless image "
0087                                          "compression format when you use this setting.</b></p>"));
0088 
0089     d->JXLGrid->addWidget(d->JXLLossLess,         0, 0, 1, 2);
0090     d->JXLGrid->addWidget(d->labelJXLcompression, 1, 0, 1, 2);
0091     d->JXLGrid->addWidget(d->JXLcompression,      2, 0, 1, 2);
0092     d->JXLGrid->setColumnStretch(1, 10);
0093     d->JXLGrid->setRowStretch(3, 10);
0094     d->JXLGrid->setContentsMargins(spacing, spacing, spacing, spacing);
0095     d->JXLGrid->setSpacing(spacing);
0096 
0097     connect(d->JXLLossLess, SIGNAL(toggled(bool)),
0098             this, SLOT(slotToggleJXLLossLess(bool)));
0099 
0100     connect(d->JXLLossLess, SIGNAL(toggled(bool)),
0101             this, SIGNAL(signalSettingsChanged()));
0102 
0103     connect(d->JXLcompression, SIGNAL(valueChanged(int)),
0104             this, SIGNAL(signalSettingsChanged()));
0105 }
0106 
0107 DImgJXLExportSettings::~DImgJXLExportSettings()
0108 {
0109     delete d;
0110 }
0111 
0112 void DImgJXLExportSettings::setSettings(const DImgLoaderPrms& set)
0113 {
0114     for (DImgLoaderPrms::const_iterator it = set.constBegin() ; it != set.constEnd() ; ++it)
0115     {
0116         if      (it.key() == QLatin1String("quality"))
0117         {
0118             d->JXLcompression->setValue(it.value().toInt());
0119         }
0120         else if (it.key() == QLatin1String("lossless"))
0121         {
0122             d->JXLLossLess->setChecked(it.value().toBool());
0123         }
0124     }
0125 
0126     slotToggleJXLLossLess(d->JXLLossLess->isChecked());
0127 }
0128 
0129 DImgLoaderPrms DImgJXLExportSettings::settings() const
0130 {
0131     DImgLoaderPrms set;
0132 
0133     // NOTE: if quality = 100 --> lossless compression.
0134 
0135     set.insert(QLatin1String("quality"),  d->JXLLossLess->isChecked() ? 100 : d->JXLcompression->value());
0136     set.insert(QLatin1String("lossless"), d->JXLLossLess->isChecked());
0137 
0138     return set;
0139 }
0140 
0141 void DImgJXLExportSettings::slotToggleJXLLossLess(bool b)
0142 {
0143     d->JXLcompression->setEnabled(!b);
0144     d->labelJXLcompression->setEnabled(!b);
0145 }
0146 
0147 } // namespace Digikam
0148 
0149 #include "moc_dimgjxlexportsettings.cpp"