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

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2006-10-18
0007  * Description : EXIF date and time settings page.
0008  *
0009  * SPDX-FileCopyrightText: 2006-2024 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 "exifdatetime.h"
0016 
0017 // Qt includes
0018 
0019 #include <QCheckBox>
0020 #include <QPushButton>
0021 #include <QGridLayout>
0022 #include <QApplication>
0023 #include <QStyle>
0024 #include <QSpinBox>
0025 #include <QDateTimeEdit>
0026 
0027 // KDE includes
0028 
0029 #include <klocalizedstring.h>
0030 
0031 // Local includes
0032 
0033 #include "dlayoutbox.h"
0034 #include "dexpanderbox.h"
0035 
0036 namespace DigikamGenericMetadataEditPlugin
0037 {
0038 
0039 class Q_DECL_HIDDEN EXIFDateTime::Private
0040 {
0041 public:
0042 
0043     explicit Private()
0044     {
0045         dateCreatedSel             = nullptr;
0046         dateOriginalSel            = nullptr;
0047         dateDigitalizedSel         = nullptr;
0048         dateCreatedSubSecEdit      = nullptr;
0049         dateOriginalSubSecEdit     = nullptr;
0050         dateDigitalizedSubSecEdit  = nullptr;
0051 
0052         dateCreatedCheck           = nullptr;
0053         dateOriginalCheck          = nullptr;
0054         dateDigitalizedCheck       = nullptr;
0055         dateCreatedSubSecCheck     = nullptr;
0056         dateOriginalSubSecCheck    = nullptr;
0057         dateDigitalizedSubSecCheck = nullptr;
0058         syncXMPDateCheck           = nullptr;
0059         syncIPTCDateCheck          = nullptr;
0060 
0061         setTodayCreatedBtn         = nullptr;
0062         setTodayOriginalBtn        = nullptr;
0063         setTodayDigitalizedBtn     = nullptr;
0064     }
0065 
0066     QCheckBox*       dateCreatedCheck;
0067     QCheckBox*       dateOriginalCheck;
0068     QCheckBox*       dateDigitalizedCheck;
0069     QCheckBox*       dateCreatedSubSecCheck;
0070     QCheckBox*       dateOriginalSubSecCheck;
0071     QCheckBox*       dateDigitalizedSubSecCheck;
0072     QCheckBox*       syncXMPDateCheck;
0073     QCheckBox*       syncIPTCDateCheck;
0074 
0075     QPushButton*     setTodayCreatedBtn;
0076     QPushButton*     setTodayOriginalBtn;
0077     QPushButton*     setTodayDigitalizedBtn;
0078 
0079     QSpinBox*        dateCreatedSubSecEdit;
0080     QSpinBox*        dateOriginalSubSecEdit;
0081     QSpinBox*        dateDigitalizedSubSecEdit;
0082 
0083     QDateTimeEdit*   dateCreatedSel;
0084     QDateTimeEdit*   dateOriginalSel;
0085     QDateTimeEdit*   dateDigitalizedSel;
0086 };
0087 
0088 EXIFDateTime::EXIFDateTime(QWidget* const parent)
0089     : MetadataEditPage(parent),
0090       d               (new Private)
0091 {
0092     QGridLayout* const grid = new QGridLayout(widget());
0093 
0094     QString dateTimeFormat  = QLocale().dateTimeFormat(QLocale::ShortFormat);
0095 
0096     if (!dateTimeFormat.contains(QLatin1String("yyyy")))
0097     {
0098         dateTimeFormat.replace(QLatin1String("yy"),
0099                                QLatin1String("yyyy"));
0100     }
0101 
0102     if (!dateTimeFormat.contains(QLatin1String("ss")))
0103     {
0104         dateTimeFormat.replace(QLatin1String("mm"),
0105                                QLatin1String("mm:ss"));
0106     }
0107 
0108     // --------------------------------------------------------
0109 
0110     d->dateCreatedCheck       = new QCheckBox(i18n("Creation date and time"), this);
0111     d->dateCreatedSubSecCheck = new QCheckBox(i18n("Creation sub-second"), this);
0112 
0113     d->dateCreatedSel         = new QDateTimeEdit(this);
0114     d->dateCreatedSel->setDisplayFormat(dateTimeFormat);
0115 
0116     d->dateCreatedSubSecEdit  = new QSpinBox(this);
0117     d->dateCreatedSubSecEdit->setMinimum(0);
0118     d->dateCreatedSubSecEdit->setMaximum(999);
0119     d->dateCreatedSubSecEdit->setSingleStep(1);
0120     d->dateCreatedSubSecEdit->setValue(0);
0121 
0122     d->syncXMPDateCheck       = new QCheckBox(i18n("Sync XMP creation date"), this);
0123     d->syncIPTCDateCheck      = new QCheckBox(i18n("Sync IPTC creation date"), this);
0124 
0125     d->setTodayCreatedBtn     = new QPushButton();
0126     d->setTodayCreatedBtn->setIcon(QIcon::fromTheme(QLatin1String("view-calendar")));
0127     d->setTodayCreatedBtn->setWhatsThis(i18n("Set creation date to today"));
0128 
0129     if (!DMetadata::supportXmp())
0130         d->syncXMPDateCheck->setEnabled(false);
0131 
0132     d->dateCreatedSel->setWhatsThis(i18n("Set here the date and time of image creation. "
0133                                        "In this standard it is the date and time the file was changed."));
0134     d->dateCreatedSubSecEdit->setWhatsThis(i18n("Set here the fractions of seconds for the date "
0135                                                 "and time of image creation."));
0136 
0137     slotSetTodayCreated();
0138 
0139     // --------------------------------------------------------
0140 
0141     d->dateOriginalCheck       = new QCheckBox(i18n("Original date and time"), this);
0142     d->dateOriginalSubSecCheck = new QCheckBox(i18n("Original sub-second"), this);
0143 
0144     d->dateOriginalSel         = new QDateTimeEdit(this);
0145     d->dateOriginalSel->setDisplayFormat(dateTimeFormat);
0146 
0147     d->dateOriginalSubSecEdit  = new QSpinBox(this);
0148     d->dateOriginalSubSecEdit->setMinimum(0);
0149     d->dateOriginalSubSecEdit->setMaximum(999);
0150     d->dateOriginalSubSecEdit->setSingleStep(1);
0151     d->dateOriginalSubSecEdit->setValue(0);
0152 
0153     d->setTodayOriginalBtn     = new QPushButton();
0154     d->setTodayOriginalBtn->setIcon(QIcon::fromTheme(QLatin1String("view-calendar")));
0155     d->setTodayOriginalBtn->setWhatsThis(i18n("Set original date to today"));
0156 
0157     d->dateOriginalSel->setWhatsThis(i18n("Set here the date and time when the original image "
0158                                           "data was generated. For a digital still camera the date and "
0159                                           "time the picture was taken are recorded."));
0160     d->dateOriginalSubSecEdit->setWhatsThis(i18n("Set here the fractions of seconds for the date "
0161                                                  "and time when the original image data was generated."));
0162 
0163     slotSetTodayOriginal();
0164 
0165     // --------------------------------------------------------
0166 
0167     d->dateDigitalizedCheck       = new QCheckBox(i18n("Digitization date and time"), this);
0168     d->dateDigitalizedSubSecCheck = new QCheckBox(i18n("Digitization sub-second"), this);
0169 
0170     d->dateDigitalizedSel         = new QDateTimeEdit(this);
0171     d->dateDigitalizedSel->setDisplayFormat(dateTimeFormat);
0172 
0173     d->dateDigitalizedSubSecEdit  = new QSpinBox(this);
0174     d->dateDigitalizedSubSecEdit->setMinimum(0);
0175     d->dateDigitalizedSubSecEdit->setMaximum(999);
0176     d->dateDigitalizedSubSecEdit->setSingleStep(1);
0177     d->dateDigitalizedSubSecEdit->setValue(0);
0178 
0179     d->setTodayDigitalizedBtn     = new QPushButton();
0180     d->setTodayDigitalizedBtn->setIcon(QIcon::fromTheme(QLatin1String("view-calendar")));
0181     d->setTodayDigitalizedBtn->setWhatsThis(i18n("Set digitization date to today"));
0182 
0183     d->dateDigitalizedSel->setWhatsThis(i18n("Set here the date and time when the image was "
0184                                              "stored as digital data. If, for example, an image was "
0185                                              "captured by a digital still camera and at the same "
0186                                              "time the file was recorded, then Original and Digitization "
0187                                              "date and time will have the same contents."));
0188     d->dateDigitalizedSubSecEdit->setWhatsThis(i18n("Set here the fractions of seconds for the date "
0189                                                     "and time when the image was stored as digital data."));
0190 
0191     slotSetTodayDigitalized();
0192 
0193     // --------------------------------------------------------
0194 
0195     grid->addWidget(d->dateCreatedCheck,                    0, 0, 1, 1);
0196     grid->addWidget(d->dateCreatedSubSecCheck,              0, 1, 1, 3);
0197     grid->addWidget(d->dateCreatedSel,                      1, 0, 1, 1);
0198     grid->addWidget(d->dateCreatedSubSecEdit,               1, 1, 1, 1);
0199     grid->addWidget(d->setTodayCreatedBtn,                  1, 3, 1, 1);
0200     grid->addWidget(d->syncXMPDateCheck,                    2, 0, 1, 4);
0201     grid->addWidget(d->syncIPTCDateCheck,                   3, 0, 1, 4);
0202     grid->addWidget(new DLineWidget(Qt::Horizontal, this),  4, 0, 1, 4);
0203     grid->addWidget(d->dateOriginalCheck,                   5, 0, 1, 1);
0204     grid->addWidget(d->dateOriginalSubSecCheck,             5, 1, 1, 3);
0205     grid->addWidget(d->dateOriginalSel,                     6, 0, 1, 1);
0206     grid->addWidget(d->dateOriginalSubSecEdit,              6, 1, 1, 1);
0207     grid->addWidget(d->setTodayOriginalBtn,                 6, 3, 1, 1);
0208     grid->addWidget(new DLineWidget(Qt::Horizontal, this),  7, 0, 1, 4);
0209     grid->addWidget(d->dateDigitalizedCheck,                8, 0, 1, 1);
0210     grid->addWidget(d->dateDigitalizedSubSecCheck,          8, 1, 1, 3);
0211     grid->addWidget(d->dateDigitalizedSel,                  9, 0, 1, 1);
0212     grid->addWidget(d->dateDigitalizedSubSecEdit,           9, 1, 1, 1);
0213     grid->addWidget(d->setTodayDigitalizedBtn,              9, 3, 1, 1);
0214     grid->setColumnStretch(2, 10);
0215     grid->setRowStretch(10, 10);
0216 
0217     int spacing = qMin(QApplication::style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing),
0218                        QApplication::style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing));
0219 
0220     grid->setContentsMargins(spacing, spacing, spacing, spacing);
0221     grid->setSpacing(spacing);
0222 
0223     // --------------------------------------------------------
0224 
0225     connect(d->dateCreatedCheck, SIGNAL(toggled(bool)),
0226             d->dateCreatedSel, SLOT(setEnabled(bool)));
0227 
0228     connect(d->dateOriginalCheck, SIGNAL(toggled(bool)),
0229             d->dateOriginalSel, SLOT(setEnabled(bool)));
0230 
0231     connect(d->dateDigitalizedCheck, SIGNAL(toggled(bool)),
0232             d->dateDigitalizedSel, SLOT(setEnabled(bool)));
0233 
0234     connect(d->dateCreatedSubSecCheck, SIGNAL(toggled(bool)),
0235             d->dateCreatedSubSecEdit, SLOT(setEnabled(bool)));
0236 
0237     connect(d->dateOriginalSubSecCheck, SIGNAL(toggled(bool)),
0238             d->dateOriginalSubSecEdit, SLOT(setEnabled(bool)));
0239 
0240     connect(d->dateDigitalizedSubSecCheck, SIGNAL(toggled(bool)),
0241             d->dateDigitalizedSubSecEdit, SLOT(setEnabled(bool)));
0242 
0243     connect(d->dateCreatedCheck, SIGNAL(toggled(bool)),
0244             d->syncXMPDateCheck, SLOT(setEnabled(bool)));
0245 
0246     connect(d->dateCreatedCheck, SIGNAL(toggled(bool)),
0247             d->syncIPTCDateCheck, SLOT(setEnabled(bool)));
0248 
0249     // --------------------------------------------------------
0250 
0251     connect(d->dateCreatedCheck, SIGNAL(toggled(bool)),
0252             this, SIGNAL(signalModified()));
0253 
0254     connect(d->dateOriginalCheck, SIGNAL(toggled(bool)),
0255             this, SIGNAL(signalModified()));
0256 
0257     connect(d->dateDigitalizedCheck, SIGNAL(toggled(bool)),
0258             this, SIGNAL(signalModified()));
0259 
0260     connect(d->dateCreatedSubSecCheck, SIGNAL(toggled(bool)),
0261             this, SIGNAL(signalModified()));
0262 
0263     connect(d->dateOriginalSubSecCheck, SIGNAL(toggled(bool)),
0264             this, SIGNAL(signalModified()));
0265 
0266     connect(d->dateDigitalizedSubSecCheck, SIGNAL(toggled(bool)),
0267             this, SIGNAL(signalModified()));
0268 
0269     // --------------------------------------------------------
0270 
0271     connect(d->dateCreatedSubSecEdit, SIGNAL(valueChanged(int)),
0272             this, SIGNAL(signalModified()));
0273 
0274     connect(d->dateOriginalSubSecEdit, SIGNAL(valueChanged(int)),
0275             this, SIGNAL(signalModified()));
0276 
0277     connect(d->dateDigitalizedSubSecEdit, SIGNAL(valueChanged(int)),
0278             this, SIGNAL(signalModified()));
0279 
0280     connect(d->dateCreatedSel, SIGNAL(dateTimeChanged(QDateTime)),
0281             this, SIGNAL(signalModified()));
0282 
0283     connect(d->dateOriginalSel, SIGNAL(dateTimeChanged(QDateTime)),
0284             this, SIGNAL(signalModified()));
0285 
0286     connect(d->dateDigitalizedSel, SIGNAL(dateTimeChanged(QDateTime)),
0287             this, SIGNAL(signalModified()));
0288 
0289     // --------------------------------------------------------
0290 
0291     connect(d->setTodayCreatedBtn, SIGNAL(clicked()),
0292             this, SLOT(slotSetTodayCreated()));
0293 
0294     connect(d->setTodayOriginalBtn, SIGNAL(clicked()),
0295             this, SLOT(slotSetTodayOriginal()));
0296 
0297     connect(d->setTodayDigitalizedBtn, SIGNAL(clicked()),
0298             this, SLOT(slotSetTodayDigitalized()));
0299 }
0300 
0301 EXIFDateTime::~EXIFDateTime()
0302 {
0303     delete d;
0304 }
0305 
0306 void EXIFDateTime::slotSetTodayCreated()
0307 {
0308     d->dateCreatedSel->setDateTime(QDateTime::currentDateTime());
0309     d->dateCreatedSubSecEdit->setValue(0);
0310 }
0311 
0312 void EXIFDateTime::slotSetTodayOriginal()
0313 {
0314     d->dateOriginalSel->setDateTime(QDateTime::currentDateTime());
0315     d->dateOriginalSubSecEdit->setValue(0);
0316 }
0317 
0318 void EXIFDateTime::slotSetTodayDigitalized()
0319 {
0320     d->dateDigitalizedSel->setDateTime(QDateTime::currentDateTime());
0321     d->dateDigitalizedSubSecEdit->setValue(0);
0322 }
0323 
0324 bool EXIFDateTime::syncXMPDateIsChecked() const
0325 {
0326     return d->syncXMPDateCheck->isChecked();
0327 }
0328 
0329 bool EXIFDateTime::syncIPTCDateIsChecked() const
0330 {
0331     return d->syncIPTCDateCheck->isChecked();
0332 }
0333 
0334 void EXIFDateTime::setCheckedSyncXMPDate(bool c)
0335 {
0336     d->syncXMPDateCheck->setChecked(c);
0337 }
0338 
0339 void EXIFDateTime::setCheckedSyncIPTCDate(bool c)
0340 {
0341     d->syncIPTCDateCheck->setChecked(c);
0342 }
0343 
0344 QDateTime EXIFDateTime::getEXIFCreationDate() const
0345 {
0346     return d->dateCreatedSel->dateTime();
0347 }
0348 
0349 void EXIFDateTime::readMetadata(const DMetadata& meta)
0350 {
0351     blockSignals(true);
0352 
0353     QDateTime datetime;
0354     QString datetimeStr, data;
0355 
0356     d->dateCreatedSel->setDateTime(QDateTime::currentDateTime());
0357     d->dateCreatedCheck->setChecked(false);
0358     datetimeStr = meta.getExifTagString("Exif.Image.DateTime", false);
0359 
0360     if (!datetimeStr.isEmpty())
0361     {
0362         datetime = QDateTime::fromString(datetimeStr, Qt::ISODate);
0363 
0364         if (datetime.isValid())
0365         {
0366             d->dateCreatedSel->setDateTime(datetime);
0367             d->dateCreatedCheck->setChecked(true);
0368         }
0369     }
0370 
0371     d->dateCreatedSel->setEnabled(d->dateCreatedCheck->isChecked());
0372     d->syncXMPDateCheck->setEnabled(d->dateCreatedCheck->isChecked());
0373     d->syncIPTCDateCheck->setEnabled(d->dateCreatedCheck->isChecked());
0374 
0375     d->dateCreatedSubSecEdit->setValue(0);
0376     d->dateCreatedSubSecCheck->setChecked(false);
0377     data = meta.getExifTagString("Exif.Photo.SubSecTime", false);
0378 
0379     if (!data.isNull())
0380     {
0381         bool ok    = false;
0382         int subsec = data.toInt(&ok);
0383 
0384         if (ok)
0385         {
0386             d->dateCreatedSubSecEdit->setValue(subsec);
0387             d->dateCreatedSubSecCheck->setChecked(true);
0388         }
0389     }
0390 
0391     d->dateCreatedSubSecEdit->setEnabled(d->dateCreatedSubSecCheck->isChecked());
0392 
0393     d->dateOriginalSel->setDateTime(QDateTime::currentDateTime());
0394     d->dateOriginalCheck->setChecked(false);
0395     datetimeStr = meta.getExifTagString("Exif.Photo.DateTimeOriginal", false);
0396 
0397     if (!datetimeStr.isEmpty())
0398     {
0399         datetime = QDateTime::fromString(datetimeStr, Qt::ISODate);
0400 
0401         if (datetime.isValid())
0402         {
0403             d->dateOriginalSel->setDateTime(datetime);
0404             d->dateOriginalCheck->setChecked(true);
0405         }
0406     }
0407 
0408     d->dateOriginalSel->setEnabled(d->dateOriginalCheck->isChecked());
0409 
0410     d->dateOriginalSubSecEdit->setValue(0);
0411     d->dateOriginalSubSecCheck->setChecked(false);
0412     data = meta.getExifTagString("Exif.Photo.SubSecTimeOriginal", false);
0413 
0414     if (!data.isNull())
0415     {
0416         bool ok    = false;
0417         int subsec = data.toInt(&ok);
0418 
0419         if (ok)
0420         {
0421             d->dateOriginalSubSecEdit->setValue(subsec);
0422             d->dateOriginalSubSecCheck->setChecked(true);
0423         }
0424     }
0425 
0426     d->dateOriginalSubSecEdit->setEnabled(d->dateOriginalSubSecCheck->isChecked());
0427 
0428     d->dateDigitalizedSel->setDateTime(QDateTime::currentDateTime());
0429     d->dateDigitalizedCheck->setChecked(false);
0430     datetimeStr = meta.getExifTagString("Exif.Photo.DateTimeDigitized", false);
0431 
0432     if (!datetimeStr.isEmpty())
0433     {
0434         datetime = QDateTime::fromString(datetimeStr, Qt::ISODate);
0435 
0436         if (datetime.isValid())
0437         {
0438             d->dateDigitalizedSel->setDateTime(datetime);
0439             d->dateDigitalizedCheck->setChecked(true);
0440         }
0441     }
0442 
0443     d->dateDigitalizedSel->setEnabled(d->dateDigitalizedCheck->isChecked());
0444 
0445     d->dateDigitalizedSubSecEdit->setValue(0);
0446     d->dateDigitalizedSubSecCheck->setChecked(false);
0447     data = meta.getExifTagString("Exif.Photo.SubSecTimeDigitized", false);
0448 
0449     if (!data.isNull())
0450     {
0451         bool ok    = false;
0452         int subsec = data.toInt(&ok);
0453 
0454         if (ok)
0455         {
0456             d->dateDigitalizedSubSecEdit->setValue(subsec);
0457             d->dateDigitalizedSubSecCheck->setChecked(true);
0458         }
0459     }
0460 
0461     d->dateDigitalizedSubSecEdit->setEnabled(d->dateDigitalizedSubSecCheck->isChecked());
0462 
0463     blockSignals(false);
0464 }
0465 
0466 void EXIFDateTime::applyMetadata(const DMetadata& meta)
0467 {
0468     QString exifDateTimeFormat = QLatin1String("yyyy:MM:dd hh:mm:ss");
0469     QString xmpDateTimeFormat  = QLatin1String("yyyy-MM-ddThh:mm:ss");
0470 
0471     if (d->dateCreatedCheck->isChecked())
0472     {
0473         meta.setExifTagString("Exif.Image.DateTime",
0474             d->dateCreatedSel->dateTime().toString(exifDateTimeFormat));
0475 
0476         if (meta.supportXmp() && d->syncXMPDateCheck->isChecked())
0477         {
0478             meta.setXmpTagString("Xmp.exif.DateTimeOriginal",
0479                 d->dateCreatedSel->dateTime().toString(xmpDateTimeFormat));
0480             meta.setXmpTagString("Xmp.photoshop.DateCreated",
0481                 d->dateCreatedSel->dateTime().toString(xmpDateTimeFormat));
0482             meta.setXmpTagString("Xmp.tiff.DateTime",
0483                 d->dateCreatedSel->dateTime().toString(xmpDateTimeFormat));
0484             meta.setXmpTagString("Xmp.xmp.CreateDate",
0485                 d->dateCreatedSel->dateTime().toString(xmpDateTimeFormat));
0486             meta.setXmpTagString("Xmp.xmp.MetadataDate",
0487                 d->dateCreatedSel->dateTime().toString(xmpDateTimeFormat));
0488             meta.setXmpTagString("Xmp.xmp.ModifyDate",
0489                 d->dateCreatedSel->dateTime().toString(xmpDateTimeFormat));
0490         }
0491 
0492         if (syncIPTCDateIsChecked())
0493         {
0494             meta.setIptcTagString("Iptc.Application2.DateCreated",
0495                        d->dateCreatedSel->dateTime().date().toString(Qt::ISODate));
0496             meta.setIptcTagString("Iptc.Application2.TimeCreated",
0497                        d->dateCreatedSel->dateTime().time().toString(Qt::ISODate));
0498         }
0499     }
0500     else
0501         meta.removeExifTag("Exif.Image.DateTime");
0502 
0503     if (d->dateCreatedSubSecCheck->isChecked())
0504         meta.setExifTagString("Exif.Photo.SubSecTime",
0505                    QString::number(d->dateCreatedSubSecEdit->value()));
0506     else
0507         meta.removeExifTag("Exif.Photo.SubSecTime");
0508 
0509     if (d->dateOriginalCheck->isChecked())
0510         meta.setExifTagString("Exif.Photo.DateTimeOriginal",
0511                    d->dateOriginalSel->dateTime().toString(exifDateTimeFormat));
0512     else
0513         meta.removeExifTag("Exif.Photo.DateTimeOriginal");
0514 
0515     if (d->dateOriginalSubSecCheck->isChecked())
0516         meta.setExifTagString("Exif.Photo.SubSecTimeOriginal",
0517                    QString::number(d->dateOriginalSubSecEdit->value()));
0518     else
0519         meta.removeExifTag("Exif.Photo.SubSecTimeOriginal");
0520 
0521     if (d->dateDigitalizedCheck->isChecked())
0522         meta.setExifTagString("Exif.Photo.DateTimeDigitized",
0523                    d->dateDigitalizedSel->dateTime().toString(exifDateTimeFormat));
0524     else
0525         meta.removeExifTag("Exif.Photo.DateTimeDigitized");
0526 
0527     if (d->dateDigitalizedSubSecCheck->isChecked())
0528         meta.setExifTagString("Exif.Photo.SubSecTimeDigitized",
0529                    QString::number(d->dateDigitalizedSubSecEdit->value()));
0530     else
0531         meta.removeExifTag("Exif.Photo.SubSecTimeDigitized");
0532 }
0533 
0534 } // namespace DigikamGenericMetadataEditPlugin
0535 
0536 #include "moc_exifdatetime.cpp"