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"