File indexing completed on 2025-03-09 03:59:02

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2010-08-06
0007  * Description : setup tab for image versioning
0008  *
0009  * SPDX-FileCopyrightText: 2010      by Martin Klapetek <martin dot klapetek at gmail dot com>
0010  * SPDX-FileCopyrightText: 2012-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0011  *
0012  * SPDX-License-Identifier: GPL-2.0-or-later
0013  *
0014  * ============================================================ */
0015 
0016 #include "setupversioning.h"
0017 
0018 // Qt includes
0019 
0020 #include <QCheckBox>
0021 #include <QComboBox>
0022 #include <QGridLayout>
0023 #include <QGroupBox>
0024 #include <QHelpEvent>
0025 #include <QLabel>
0026 #include <QPushButton>
0027 #include <QRadioButton>
0028 #include <QVBoxLayout>
0029 #include <QWhatsThis>
0030 #include <QApplication>
0031 #include <QIcon>
0032 
0033 // KDE includes
0034 
0035 #include <klocalizedstring.h>
0036 
0037 // Local includes
0038 
0039 #include "digikam_config.h"
0040 #include "applicationsettings.h"
0041 #include "versionmanager.h"
0042 #include "dpluginloader.h"
0043 
0044 namespace Digikam
0045 {
0046 
0047 class Q_DECL_HIDDEN SetupVersioning::Private
0048 {
0049 public:
0050 
0051     explicit Private()
0052         : tab                   (nullptr),
0053           nonDestructivePanel   (nullptr),
0054           workspaceGB           (nullptr),
0055           closingGB             (nullptr),
0056           snapshotGB            (nullptr),
0057           viewGB                (nullptr),
0058           enableNonDestructive  (nullptr),
0059           snapshotAfterRaw      (nullptr),
0060           snapshotSession       (nullptr),
0061           snapshotComplex       (nullptr),
0062           viewShowOriginal      (nullptr),
0063           viewShowSnapshots     (nullptr),
0064           formatBox             (nullptr),
0065           askToSave             (nullptr),
0066           autoSave              (nullptr),
0067           infoNonDestructive    (nullptr),
0068           infoFormat            (nullptr),
0069           infoSnapshot          (nullptr),
0070           infoView              (nullptr)
0071     {
0072     }
0073 
0074     QTabWidget*    tab;
0075 
0076     QWidget*       nonDestructivePanel;
0077 
0078     QGroupBox*     workspaceGB;
0079     QGroupBox*     closingGB;
0080     QGroupBox*     snapshotGB;
0081     QGroupBox*     viewGB;
0082 
0083     QCheckBox*     enableNonDestructive;
0084 
0085     QCheckBox*     snapshotAfterRaw;
0086     QCheckBox*     snapshotSession;
0087     QCheckBox*     snapshotComplex;
0088 
0089     QCheckBox*     viewShowOriginal;
0090     QCheckBox*     viewShowSnapshots;
0091 
0092     QComboBox*     formatBox;
0093 
0094     QRadioButton*  askToSave;
0095     QRadioButton*  autoSave;
0096 
0097     QPushButton*   infoNonDestructive;
0098     QPushButton*   infoFormat;
0099     QPushButton*   infoSnapshot;
0100     QPushButton*   infoView;
0101 };
0102 
0103 SetupVersioning::SetupVersioning(QWidget* const parent)
0104     : QScrollArea(parent),
0105       d          (new Private)
0106 {
0107     d->nonDestructivePanel                  = new QWidget;
0108     QVBoxLayout* const nonDestructiveLayout = new QVBoxLayout;
0109 
0110     // ---
0111 
0112     QGridLayout* const gridHeader = new QGridLayout;
0113 
0114     d->enableNonDestructive       = new QCheckBox;
0115     d->enableNonDestructive->setText(i18nc("@title", "Enable Non-Destructive Editing and Versioning"));
0116     d->enableNonDestructive->setToolTip(i18nc("@info:tooltip",
0117                                               "Enable support for non-destructive editing and image versioning"));
0118     d->enableNonDestructive->setWhatsThis(xi18nc("@info:whatsthis",
0119                                                  "<para><interface>Non-Destructive Editing and Versioning</interface> "
0120                                                  "allows different versions of an image to be created, "
0121                                                  "whilst always preserving the original image.</para> "
0122                                                  "<para> All steps of the editing history are recorded and can be accessed later.</para>"));
0123 
0124     QLabel* const iconLabel = new QLabel;
0125     iconLabel->setPixmap(QIcon::fromTheme(QLatin1String("view-catalog")).pixmap(32));
0126 
0127     d->infoNonDestructive   = new QPushButton;
0128     d->infoNonDestructive->setIcon(QIcon::fromTheme(QLatin1String("dialog-information")));
0129     d->infoNonDestructive->setToolTip(i18nc("@info:tooltip", "Get information on non-destructive editing and file versioning"));
0130 
0131     gridHeader->addWidget(iconLabel,               0, 0);
0132     gridHeader->addWidget(d->enableNonDestructive, 0, 1);
0133     gridHeader->addWidget(d->infoNonDestructive,   0, 3);
0134     gridHeader->setColumnStretch(2, 1);
0135 
0136     // --------------------------------------------------------
0137 
0138     d->workspaceGB              = new QGroupBox(i18nc("@title:group", "Workspace File Format"));
0139     QGridLayout* const wsLayout = new QGridLayout;
0140 
0141     QLabel* const workIcon      = new QLabel;
0142     workIcon->setPixmap(QIcon::fromTheme(QLatin1String("document-save-as")).pixmap(32));
0143     QLabel* const formatLabel   = new QLabel(i18nc("@label", "Save files as"));
0144 
0145     // keep in sync with VersionManager::workspaceFileFormats()
0146 
0147     d->formatBox           = new QComboBox;
0148     d->formatBox->addItem(i18nc("@label:listbox", "JPEG"),        QLatin1String("JPG"));
0149     d->formatBox->addItem(i18nc("@label:listbox", "TIFF"),        QLatin1String("TIFF"));
0150     d->formatBox->addItem(i18nc("@label:listbox", "PNG"),         QLatin1String("PNG"));
0151     d->formatBox->addItem(i18nc("@label:listbox", "PGF"),         QLatin1String("PGF"));
0152 
0153 #ifdef HAVE_JASPER
0154 
0155     d->formatBox->addItem(i18nc("@label:listbox", "JPEG-2000"),   QLatin1String("JP2"));
0156 
0157 #endif
0158 
0159 #ifdef HAVE_X265
0160 
0161     d->formatBox->addItem(i18nc("@label:listbox", "HEIF"),        QLatin1String("HEIF"));
0162 
0163 #endif
0164 
0165     bool hasJXLSupport  = DPluginLoader::instance()->canExport(QLatin1String("JXL"));
0166 
0167     if (hasJXLSupport)
0168     {
0169         d->formatBox->addItem(i18nc("@label:listbox", "JPEG-XL"), QLatin1String("JXL"));
0170     }
0171 
0172     bool hasWEBPSupport = DPluginLoader::instance()->canExport(QLatin1String("WEBP"));
0173 
0174     if (hasWEBPSupport)
0175     {
0176         d->formatBox->addItem(i18nc("@label:listbox", "WEBP"), QLatin1String("WEBP"));
0177     }
0178 
0179     bool hasAVIFSupport = DPluginLoader::instance()->canExport(QLatin1String("AVIF"));
0180 
0181     if (hasAVIFSupport)
0182     {
0183         d->formatBox->addItem(i18nc("@label:listbox", "AVIF"), QLatin1String("AVIF"));
0184     }
0185 
0186     d->formatBox->insertSeparator(1);
0187     d->formatBox->insertSeparator(4);
0188 
0189     QString formatHelp = xi18nc("@info:whatsthis",
0190                                 "<title>Default File Format for Saving Versionned Images</title>"
0191                                 "<para>Select the file format in which edited images are saved automatically. "
0192                                 "Format-specific options, like compression settings, "
0193                                 "can be configured on the <interface>Format Options</interface> tab.</para>");
0194 
0195     losslessFormatToolTip(formatHelp, hasJXLSupport, hasWEBPSupport, hasAVIFSupport);
0196     d->formatBox->setWhatsThis(formatHelp);
0197 
0198     d->infoFormat = new QPushButton;
0199     d->infoFormat->setIcon(QIcon::fromTheme(QLatin1String("dialog-information")));
0200     d->infoFormat->setToolTip(i18nc("@info:tooltip", "Get information on available image file formats"));
0201 
0202     wsLayout->addWidget(workIcon,           0, 0);
0203     wsLayout->addWidget(formatLabel,        0, 1);
0204     wsLayout->addWidget(d->formatBox,       0, 2);
0205     wsLayout->addWidget(d->infoFormat,      0, 4);
0206     wsLayout->setColumnStretch(1, 1);
0207     wsLayout->setColumnStretch(2, 2);
0208     wsLayout->setColumnStretch(3, 3);
0209 
0210     d->workspaceGB->setLayout(wsLayout);
0211 
0212     // ---
0213 
0214     d->closingGB                     = new QGroupBox;//(i18nc("@title:group", "Automatic Saving"));
0215     QGridLayout* const closingLayout = new QGridLayout;
0216 
0217     QLabel* const closingExplanation = new QLabel(i18nc("@label", "When closing the editor"));
0218     QLabel* const closingIcon        = new QLabel;
0219     closingIcon->setPixmap(QIcon::fromTheme(QLatin1String("dialog-ok-apply")).pixmap(32));
0220     d->askToSave                     = new QRadioButton(i18nc("@option:radio", "Always ask to save changes"));
0221     d->autoSave                      = new QRadioButton(i18nc("@option:radio", "Save changes automatically"));
0222 
0223     closingLayout->addWidget(closingIcon,        0, 0);
0224     closingLayout->addWidget(closingExplanation, 0, 1);
0225     closingLayout->addWidget(d->askToSave,       1, 0, 1, 3);
0226     closingLayout->addWidget(d->autoSave,        2, 0, 1, 3);
0227     closingLayout->setColumnStretch(3, 1);
0228 
0229     d->closingGB->setLayout(closingLayout);
0230 
0231     // ---
0232 
0233     // --------------------------------------------------------
0234 
0235 /*
0236     QGridLayout* const snapshotHeader = new QGridLayout;
0237 
0238     QLabel* const snapshotExplanation = new QLabel;
0239     snapshotExplanation->setText(i18nc("@label",
0240                                        "For an edited image, there is at least one file representing the current version."
0241                                        "digiKam can take and keep additional, intermediate snapshots during editing."));
0242     snapshotExplanation->setWordWrap(true);
0243 
0244 
0245     snapshotHeader->addWidget(snapshotIconLabel,       0, 0);
0246     snapshotHeader->addWidget(snapshotExplanation,     0, 1);
0247 */
0248 
0249     d->snapshotGB                     = new QGroupBox;//(i18nc("@title:group", "Intermediate Version Snapshots"));
0250     QGridLayout* const snapshotLayout = new QGridLayout;
0251 
0252     QString snapshotWhatsThis = xi18nc("@info:whatsthis",
0253                                        "<para>First and foremost, the <emphasis>original image will never be overwritten.</emphasis> "
0254                                        "Instead, when an image is edited, a new file is created: "
0255                                        "The <interface>current version</interface>.</para> "
0256                                        "<para>You can also create multiple <interface>versions</interface> "
0257                                        "deriving from the same <interface>original image</interface>.</para> "
0258                                        "<para>In addition to these files representing a current version, "
0259                                        "digiKam can take and keep additional, <interface>intermediate snapshots</interface> "
0260                                        "during the editing process. "
0261                                        "This can be useful if you want to preserve the intermediate steps for later "
0262                                        "access, for example if some editing steps cannot be automatically reproduced.</para>");
0263     d->snapshotGB->setWhatsThis(snapshotWhatsThis);
0264 
0265     QLabel* const snapshotIconLabel = new QLabel;
0266     snapshotIconLabel->setPixmap(QIcon::fromTheme(QLatin1String("insert-image")).pixmap(32));
0267 
0268     QLabel* const snapshotLabel     = new QLabel(i18nc("@label", "Keep a snapshot of an edited image"));
0269 
0270     d->infoSnapshot           = new QPushButton;
0271     d->infoSnapshot->setIcon(QIcon::fromTheme(QLatin1String("dialog-information")));
0272     d->infoSnapshot->setToolTip(i18nc("@info:tooltip", "Get an explanation for these options"));
0273 
0274     d->snapshotAfterRaw       = new QCheckBox(i18nc("@option:check", "After converting from a RAW image"));
0275     d->snapshotSession        = new QCheckBox(i18nc("@option:check", "After each editing session"));
0276     d->snapshotComplex        = new QCheckBox(i18nc("@option:check", "After each step that is not completely reproducible"));
0277 
0278     snapshotLayout->addWidget(snapshotIconLabel,   0, 0);
0279     snapshotLayout->addWidget(snapshotLabel,       0, 1);
0280     snapshotLayout->addWidget(d->infoSnapshot,     0, 3);
0281     snapshotLayout->addWidget(d->snapshotAfterRaw, 1, 0, 1, 4);
0282     snapshotLayout->addWidget(d->snapshotSession,  2, 0, 1, 4);
0283     snapshotLayout->addWidget(d->snapshotComplex,  3, 0, 1, 4);
0284     snapshotLayout->setColumnStretch(2, 1);
0285     d->snapshotGB->setLayout(snapshotLayout);
0286 
0287 /*
0288     / ---
0289 
0290     snapshotLayout->addLayout(snapshotHeader);
0291     snapshotLayout->addWidget(d->snapshotGB);
0292     snapshotLayout->addStretch();
0293 
0294     d->snapshotPanel->setLayout(snapshotLayout);
0295 */
0296 
0297     // --------------------------------------------------------
0298 
0299     d->viewGB = new QGroupBox;
0300     QGridLayout* const viewGBLayout = new QGridLayout;
0301 
0302     QString viewWhatsThis = xi18nc("@info:whatsthis",
0303                                    "<para>If an image has been edited, only the <interface>current versions</interface> "
0304                                    "will be shown in the main thumbnail view. "
0305                                    "From the <interface>right sidebar</interface>, you always have access to all hidden files.</para> "
0306                                    "<para>With the options here, you can choose to show certain files permanently.</para> "
0307                                    "<para>If you activate non-destructive editing and image versioning for the first time, "
0308                                    "it will only be work for newly saved images.</para>");
0309     d->viewGB->setWhatsThis(viewWhatsThis);
0310 
0311     QLabel* const viewLabel     =  new QLabel(i18nc("@label", "In main view"));
0312 
0313     QLabel* const viewIconLabel = new QLabel;
0314     viewIconLabel->setPixmap(QIcon::fromTheme(QLatin1String("view-list-icons")).pixmap(32));
0315 
0316     d->infoView           = new QPushButton;
0317     d->infoView->setIcon(QIcon::fromTheme(QLatin1String("dialog-information")));
0318     d->infoView->setToolTip(i18nc("@info:tooltip", "Get an explanation for these options"));
0319 
0320     d->viewShowOriginal   = new QCheckBox(i18nc("@option:check", "Always show original images"));
0321     d->viewShowSnapshots  = new QCheckBox(i18nc("@option:check", "Always show intermediate snapshots"));
0322 
0323     viewGBLayout->addWidget(viewIconLabel,        0, 0);
0324     viewGBLayout->addWidget(viewLabel,            0, 1);
0325     viewGBLayout->addWidget(d->infoView,          0, 3);
0326     viewGBLayout->addWidget(d->viewShowOriginal,  1, 0, 1, 4);
0327     viewGBLayout->addWidget(d->viewShowSnapshots, 2, 0, 1, 4);
0328     viewGBLayout->setColumnStretch(2, 1);
0329     d->viewGB->setLayout(viewGBLayout);
0330 
0331     // --------------------------------------------------------
0332 
0333     connect(d->enableNonDestructive, SIGNAL(toggled(bool)),
0334             this, SLOT(enableToggled(bool)));
0335 
0336     connect(d->infoNonDestructive, SIGNAL(clicked()),
0337             this, SLOT(showNonDestructiveInformation()));
0338 
0339     connect(d->infoFormat, SIGNAL(clicked()),
0340             this, SLOT(showFormatInformation()));
0341 
0342     connect(d->infoSnapshot, SIGNAL(clicked()),
0343             this, SLOT(showSnapshotInformation()));
0344 
0345     connect(d->infoView, SIGNAL(clicked()),
0346             this, SLOT(showViewInformation()));
0347 
0348     // --------------------------------------------------------
0349 
0350     nonDestructiveLayout->addLayout(gridHeader);
0351     nonDestructiveLayout->addWidget(d->workspaceGB);
0352     nonDestructiveLayout->addWidget(d->closingGB);
0353     nonDestructiveLayout->addWidget(d->snapshotGB);
0354     nonDestructiveLayout->addWidget(d->viewGB);
0355     nonDestructiveLayout->addStretch();
0356 
0357     d->nonDestructivePanel->setLayout(nonDestructiveLayout);
0358     setWidget(d->nonDestructivePanel);
0359     setWidgetResizable(true);
0360 
0361     // --------------------------------------------------------
0362 
0363     readSettings();
0364 
0365     enableToggled(d->enableNonDestructive->isChecked());
0366 }
0367 
0368 SetupVersioning::~SetupVersioning()
0369 {
0370     delete d;
0371 }
0372 
0373 void SetupVersioning::applySettings()
0374 {
0375     VersionManagerSettings settings;
0376     settings.enabled = d->enableNonDestructive->isChecked();
0377 
0378     if (d->snapshotSession->isChecked())
0379     {
0380         settings.saveIntermediateVersions |= VersionManagerSettings::AfterEachSession;
0381     }
0382 
0383     if (d->snapshotAfterRaw->isChecked())
0384     {
0385         settings.saveIntermediateVersions |= VersionManagerSettings::AfterRawConversion;
0386     }
0387 
0388     if (d->snapshotComplex->isChecked())
0389     {
0390         settings.saveIntermediateVersions |= VersionManagerSettings::WhenNotReproducible;
0391     }
0392 
0393     if (d->viewShowOriginal->isChecked())
0394     {
0395         settings.showInViewFlags |= VersionManagerSettings::ShowOriginal;
0396     }
0397     else
0398     {
0399         settings.showInViewFlags &= ~VersionManagerSettings::ShowOriginal;
0400     }
0401 
0402     if (d->viewShowSnapshots->isChecked())
0403     {
0404         settings.showInViewFlags |= VersionManagerSettings::ShowIntermediates;
0405     }
0406 
0407     if (d->autoSave->isChecked())
0408     {
0409         settings.editorClosingMode = VersionManagerSettings::AutoSave;
0410     }
0411     else // d->askToSave->isChecked()
0412     {
0413         settings.editorClosingMode = VersionManagerSettings::AlwaysAsk;
0414     }
0415 
0416     settings.format = d->formatBox->itemData(d->formatBox->currentIndex()).toString();
0417 
0418     ApplicationSettings::instance()->setVersionManagerSettings(settings);
0419     ApplicationSettings::instance()->saveSettings();
0420 }
0421 
0422 void SetupVersioning::readSettings()
0423 {
0424     VersionManagerSettings settings = ApplicationSettings::instance()->getVersionManagerSettings();
0425 
0426     d->enableNonDestructive->setChecked(settings.enabled);
0427     d->snapshotSession->setChecked(settings.saveIntermediateVersions & VersionManagerSettings::AfterEachSession);
0428     d->snapshotAfterRaw->setChecked(settings.saveIntermediateVersions & VersionManagerSettings::AfterRawConversion);
0429     d->snapshotComplex->setChecked(settings.saveIntermediateVersions & VersionManagerSettings::WhenNotReproducible);
0430     d->viewShowOriginal->setChecked(settings.showInViewFlags & VersionManagerSettings::ShowOriginal);
0431     d->viewShowSnapshots->setChecked(settings.showInViewFlags & VersionManagerSettings::ShowIntermediates);
0432     d->askToSave->setChecked(settings.editorClosingMode == VersionManagerSettings::AlwaysAsk);
0433     d->autoSave->setChecked(settings.editorClosingMode == VersionManagerSettings::AutoSave);
0434 
0435     d->formatBox->setCurrentIndex(d->formatBox->findData(settings.format));
0436 }
0437 
0438 void SetupVersioning::showNonDestructiveInformation()
0439 {
0440     qApp->postEvent(d->enableNonDestructive, new QHelpEvent(QEvent::WhatsThis, QPoint(0, 0),
0441                                                             d->enableNonDestructive->mapToGlobal(QPoint(0, 0))));
0442 }
0443 
0444 void SetupVersioning::showFormatInformation()
0445 {
0446     qApp->postEvent(d->formatBox, new QHelpEvent(QEvent::WhatsThis, QPoint(0, 0), d->formatBox->mapToGlobal(QPoint(0, 0))));
0447 }
0448 
0449 void SetupVersioning::showSnapshotInformation()
0450 {
0451     QPoint p(0, 0);
0452     qApp->postEvent(d->snapshotGB, new QHelpEvent(QEvent::WhatsThis, p, d->snapshotGB->mapToGlobal(p)));
0453 }
0454 
0455 void SetupVersioning::showViewInformation()
0456 {
0457     QPoint p(0, 0);
0458     qApp->postEvent(d->viewGB, new QHelpEvent(QEvent::WhatsThis, p, d->viewGB->mapToGlobal(p)));
0459 }
0460 
0461 void SetupVersioning::enableToggled(bool on)
0462 {
0463     d->workspaceGB->setEnabled(on);
0464     d->closingGB->setEnabled(on);
0465     d->snapshotGB->setEnabled(on);
0466     d->viewGB->setEnabled(on);
0467 }
0468 
0469 void SetupVersioning::losslessFormatToolTip(QString& formatHelp,
0470                                             bool hasJXLSupport,
0471                                             bool hasWEBPSupport,
0472                                             bool hasAVIFSupport)
0473 {
0474     formatHelp.append(QLatin1String("<para><list>"));
0475 
0476     formatHelp.append(xi18nc("@info:whatsthis",
0477 
0478                              // Lossy: JPEG
0479 
0480                              "<item>"
0481                              "<emphasis strong='true'>JPEG</emphasis>: "
0482                              "It's the most commonly used file format, but it employs lossy compression, "
0483                              "which means that with each saving operation some image information will be irreversibly lost. "
0484                              "JPEG offers a good compression rate, resulting in smaller files. "
0485                              "</item>"
0486 
0487                              // Traditional lossless: PNG, TIFF
0488 
0489                              "<item>"
0490                              "<emphasis strong='true'>PNG</emphasis>: "
0491                              "A widely used format employing lossless compression. "
0492                              "The files, though, will be larger because PNG does not achieve very good compression rates."
0493                              "</item>"
0494                              "<item>"
0495                              "<emphasis strong='true'>TIFF</emphasis>: "
0496                              "A commonly used format, usually uncompressed or with modest lossless compression. "
0497                              "Resulting files will be large, but without quality loss due to compression. "
0498                              "</item>"
0499 
0500                              // Modern lossless: PGF and optional JPEG-2000, JPEG-XL, AVIF
0501 
0502                              "<item>"
0503                              "<emphasis strong='true'>PGF</emphasis>: "
0504                              "This is a technically superior file format offering good compression rates "
0505                              "with either lossy or lossless compression. "
0506                              "But it is not yet widely used and supported, so your friends may not directly be able to open these files, "
0507                              "and you may not be able to directly publish them on the web. "
0508                              "</item>"));
0509 
0510 #ifdef HAVE_JASPER
0511 
0512     formatHelp.append(xi18nc("@info:whatsthis",
0513                              "<item>"
0514                              "<emphasis strong='true'>JPEG-2000</emphasis>: "
0515                              "It's similar to PGF. Loading or saving is slower, the compression rate is better, "
0516                              "and the format more widely supported, though still not comparable "
0517                              "to the tradition formats JPEG, PNG or TIFF. "
0518                              "</item>"));
0519 
0520 #endif
0521 
0522 #ifdef HAVE_X265
0523 
0524     formatHelp.append(xi18nc("@info:whatsthis",
0525                              "<item>"
0526                              "<emphasis strong='true'>HEIF</emphasis>: "
0527                              "High Efficiency Image File Format is a container format for storing individual images. "
0528                              "A HEIF image using HEVC codec (H.265) requires less storage space than the equivalent quality JPEG. "
0529                              "</item>"));
0530 
0531 #endif
0532 
0533     if (hasJXLSupport)
0534     {
0535         formatHelp.append(xi18nc("@info:whatsthis",
0536                                  "<item>"
0537                                  "<emphasis strong='true'>JPEG-XL</emphasis>: "
0538                                  "It's a royalty-free raster-graphics file format that supports lossless compression. "
0539                                  "It is designed to outperform existing raster formats and thus to become their universal replacement. "
0540                                  "</item>"));
0541     }
0542 
0543     if (hasWEBPSupport)
0544     {
0545         formatHelp.append(xi18nc("@info:whatsthis",
0546                                  "<item>"
0547                                  "<emphasis strong='true'>WEBP</emphasis>: "
0548                                  "It's an image file format that Google has developed as a replacement for JPEG, PNG, and GIF file "
0549                                  "formats. Files are smaller for the same quality, or of higher quality for the same size. "
0550                                  "It supports both lossy and lossless compression"
0551                                  "</item>"));
0552     }
0553 
0554     if (hasAVIFSupport)
0555     {
0556         formatHelp.append(xi18nc("@info:whatsthis",
0557                                  "<item>"
0558                                  "<emphasis strong='true'>AVIF</emphasis>: "
0559                                  "AV1 Image File Format is a specification for storing images in the "
0560                                  "ISOBMFF container (as HEIF) compressed with AOMedia Video 1 (AV1) codec, an open and royalty-free "
0561                                  "encoding format. "
0562                                  "</item>"));
0563     }
0564 
0565     formatHelp.append(QLatin1String("</list></para>"));
0566 }
0567 
0568 } // namespace Digikam
0569 
0570 #include "moc_setupversioning.cpp"