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"