Version: 0.7 beta1 (using KDE KDE 3.3.0) OS: Linux viewer/editor for IPTC meta data for single and multiple images ( i use an excellent IPTC lib project called exiv2 you might want to use http://home.arcor.de/ahuggel/exiv2/ )
Agreed. I move my images around a lot so I don't want to have tags etc stored within a database. Otherwise they'll be lost when I switch computers. I'd love to have the tags stored in the image and mirrored in the SQL database. The Tags have precedence and the SQL is there just for speed.
*** This bug has been confirmed by popular vote. ***
this lib can also help : http://libiptcdata.sourceforge.net/
In my opinion this more a requirement than a wish. Saving the tags in the image themself is the only reliable/good solution. With time the photo management systems / OS /databases will change and most probably the tags will be lost. The photos will stay so the tags MUST be inside. In addition the current implementation where the database has a link to an image path is far too easy to break since it is possible( == normal ) to access the image directly through the filesystem.
I totally agree, we have to think of the future. Digital photography has only just begun, and we'll see many more people storing photos on their computer. And we want to to stay OPENSOURCE, which also means multi-access methods to data. Gerhard [bugs.kde.org quoted mail]
I vote 20 for this bug. First, standards are Good (tm) :-) Then, for future usage. Next, some time you exchange photos with friends. Then it allows to share comments as well. Finally, one part of my familly run Windows (bahh :-)) and I share the photos between Windows and Linux. Picasa (from Google, Windows) stores comments as IPTC comments so I would like to be able to read them with Digikam (Linux). So, it is a *really* good idea ! Marc.
Well I'd love to have IPTC support, but: it does not provide an possibility to store the names of the persons who are on the pictures. I dont' know if the iptc people want to change this- but I really hope so
I voted 20. IPTC is the right way to go for comments at least for now (XMP will come later if it's public, open, and free of use enough :-). To answer Marc Cramdal I agree that interoperability with Picasa would be nice, but be aware that Picasa has problems with its own comments: when modifying several times, they are not found in the IPTC fields any more (!!?). Although this might just be a bug that will be fixed in future releases. An other good reason would be interoperability with some hand-written scripts that would comment more or less automatically a bunch of pictures. I like the fact that for music tags (Flac or Ogg or Mp3) you can work on them at a script level and still they are recognized by nice GUIs. At last, note that I would like IPTC (or XMP) to be the primary storage but the tool's database could also be a cache of this data, just for performance reasons (if needed! I have no idea..). Anyway, keep up the good work! Digikam is a fantastic application! I really think it could become one of the cornerstones of Linux as a "digital hub" as Steve Jobs says, in par with Firefox, Gimp, Gaim, etc. Cheers, Christophe. = I keep trying to tell my boss that no, Satan is a tool = = of Linux, not the other way around. --Anonymous =
Hello, I really agree, this would be AWESOME. I have to say that I am using digikam and I'm very happy about it, but what if the database crashes ? what if I want to change program ? Thanks !!!
SVN commit 515268 by cgilles: digikam from trunk : Metadata support using Exiv2 : - New image properties sidebar tab named "Metadata" instead old "Exif". This area include : * Standard Exif tags viewer. * MarkerNote Exif tags viewer. * IPTC records viewer. - New capability to copy metadata in clipboard like text. - New capability to print metadata. - Tags name use the "user Friendly" conversion from Exiv2 instead the internal name provided by old Exif viewer based on libkexif. - Capability to read metadata from CRW files (Canon RAW files) - New class DMetadata to load/save metadata without loading image data. Actually JPEG, CRW, and PNG files are supported. About PNG (Exif and IPTC raw profiles generated by ImageMagick are supported. To support new file formats (like NEF, MRW, TIFF, DNG, etc), new image file parsers must be added to Exiv2 library. IMPORTANT: - Exiv2 do not support yet gettext for i18n rules. All informations in metadata viewers aren't yet i18n (tags name, tags values, and tags descriptions) - Any tag names use internal Exiv2 name, not the user friendly text transformations. This point must be fixed in Exiv2 libs. To 0.9.0, these tools are just metadata readers. Writting capabilities (metadata editors) will added later 0.9.0. The files in B.K.O directly or indirectly relevant of this commits are listed below : *Pending: 103255 106103 115764 111560 *Partially fixed: 91812 96459 109253 110598 118501 * To check before closing: 122264 * Fixed (can be closed): 103489 121371 105670 109319 CCMAIL: digikam-devel@kde.org, Andreas Huggel <ahuggel@gmx.net> CCBUGS: 103255, 106103, 115764, 111560, 91812, 96459, 109253, 110598, 118501, 122264, 103489, 121371, 105670, 109319 M +2 -1 libs/Makefile.am M +5 -4 libs/dimg/Makefile.am M +1 -1 libs/dimg/dimg.cpp M +1 -1 libs/dimg/dimg.h M +19 -1 libs/dimg/dimgloader.cpp M +4 -2 libs/dimg/dimgloader.h M +4 -61 libs/dimg/loaders/jpegloader.cpp M +5 -29 libs/dimg/loaders/pngloader.cpp M +2 -1 libs/dimg/loaders/rawloader.cpp A libs/dmetadata (directory) A libs/dmetadata/Makefile.am A libs/dmetadata/dmetadata.cpp [License: GPL] A libs/dmetadata/dmetadata.h [License: GPL] A libs/dmetadata/loaders (directory) A libs/dmetadata/loaders/Makefile.am A libs/dmetadata/loaders/dmetaloader.cpp [License: GPL] A libs/dmetadata/loaders/dmetaloader.h [License: GPL] A libs/dmetadata/loaders/jpegmetaloader.cpp [License: GPL] A libs/dmetadata/loaders/jpegmetaloader.h [License: GPL] A libs/dmetadata/loaders/pngmetaloader.cpp [License: GPL] A libs/dmetadata/loaders/pngmetaloader.h [License: GPL] A libs/dmetadata/loaders/rawmetaloader.cpp [License: GPL] A libs/dmetadata/loaders/rawmetaloader.h [License: GPL] A libs/dmetadata/loaders/tiffmetaloader.cpp [License: GPL] A libs/dmetadata/loaders/tiffmetaloader.h [License: GPL] M +3 -2 libs/imageproperties/Makefile.am M +82 -323 libs/imageproperties/imagepropertiesexiftab.cpp M +12 -25 libs/imageproperties/imagepropertiesexiftab.h M +19 -18 libs/imageproperties/imagepropertiessidebar.cpp M +10 -9 libs/imageproperties/imagepropertiessidebar.h M +27 -26 libs/imageproperties/imagepropertiessidebarcamgui.cpp M +2 -1 libs/imageproperties/imagepropertiessidebarcamgui.h M +16 -15 libs/imageproperties/imagepropertiessidebardb.cpp M +3 -1 libs/widgets/Makefile.am A libs/widgets/metadata (directory) A libs/widgets/metadata/Makefile.am A libs/widgets/metadata/exifwidget.cpp [License: GPL] A libs/widgets/metadata/exifwidget.h [License: GPL] A libs/widgets/metadata/iptcwidget.cpp [License: GPL] A libs/widgets/metadata/iptcwidget.h [License: GPL] A libs/widgets/metadata/makernotewidget.cpp [License: GPL] A libs/widgets/metadata/makernotewidget.h [License: GPL] A libs/widgets/metadata/mdkeylistviewitem.cpp [License: GPL] A libs/widgets/metadata/mdkeylistviewitem.h [License: GPL] A libs/widgets/metadata/metadatalistview.cpp [License: GPL] A libs/widgets/metadata/metadatalistview.h [License: GPL] A libs/widgets/metadata/metadatalistviewitem.cpp [License: GPL] A libs/widgets/metadata/metadatalistviewitem.h [License: GPL] A libs/widgets/metadata/metadatawidget.cpp [License: GPL] A libs/widgets/metadata/metadatawidget.h [License: GPL] M +24 -1 utilities/cameragui/cameraui.cpp
thank you thank you thank you so much :-)
absolutely brilliant! When can this be expected to be released? I'm not familiar with the development cycle and what the current status is now, but just to put it in context with something I'm at least a bit more familiar with: is there any chance to see this feature in DigiKam in the next Kubuntu release (Dapper)?
I think that digiKam and DigikamImagePlugins will be released in 0.9.0-beta1 during May 2006, depending of implementation progress. Actually, 85% is completed... You can look on the previews on web project page : http://www.digikam.org/?q=image Gilles Caulier
Dapper is already in version freeze.
I was thinking about the way to mix digikam tags and IPTC tags. There could be setting in each tag to define if it is save to IPTC or not. But we could go further and set in wich IPTC field we put it : Example : For geographical information, we could save them in the country or sub-location or City. I've made a short mockup of a tag setting dialog (I will attach it). We could then enter IPTC infos simply by dropping tags on group of pictures.
Created attachment 15441 [details] Tag setting dialog mockup
digikam tags have already merged into IPTC. Look this file in B.K.O : http://bugs.kde.org/show_bug.cgi?id=113997 This file is now closed. About to parse IPTC metadata at digikam startup, there is another file in B.K.O : http://bugs.kde.org/show_bug.cgi?id=91811 thanks to put your constructive comments at the right place. Gilles Caulier
SVN commit 594899 by cgilles: kipiplugins from trunk : new plugin to edit EXIF photograph tags and IPTC tags of pictures This tool can be used on single or batch mode. Note: this plugin is under developement. It's not yet suitable. CCMAIL: digikam-devel@kde.org, kde-imaging@kde.org CCBUGS: 91812, 133276, 103255 A metadataedit (directory) A metadataedit/Makefile.am A metadataedit/iptccaption.cpp [License: GPL] A metadataedit/iptccaption.h [License: GPL] A metadataedit/iptccredits.cpp [License: GPL] A metadataedit/iptccredits.h [License: GPL] A metadataedit/iptceditdialog.cpp [License: GPL] A metadataedit/iptceditdialog.h [License: GPL] A metadataedit/kipiplugin_metadataedit.desktop A metadataedit/metadataeditdialog.cpp [License: GPL] A metadataedit/metadataeditdialog.h [License: GPL] A metadataedit/metadataitem.cpp [License: GPL] A metadataedit/metadataitem.h [License: GPL] A metadataedit/plugin_metadataedit.cpp [License: GPL] A metadataedit/plugin_metadataedit.h [License: GPL]
SVN commit 595026 by cgilles: kipiplugins from trunk : MetadataEdit plugin: "Et Voila"... The IPTC metadata can be changed/set from pictures. The IPTC data set to edit is not yet complete, but a more complete edit dialog coming soon... CCMAIL: digikam-devel@kde.org, kde-imaging@kde.org CCBUGS: 91812, 133276, 103255 M +17 -4 iptccaption.cpp M +18 -2 iptccredits.cpp M +1 -1 iptceditdialog.cpp M +5 -5 metadataeditdialog.cpp M +16 -7 metadataitem.cpp --- trunk/extragear/libs/kipi-plugins/metadataedit/iptccaption.cpp #595025:595026 @@ -36,6 +36,7 @@ // Local includes. +#include "exiv2iface.h" #include "iptccaption.h" #include "iptccaption.moc" @@ -127,8 +128,7 @@ vlay->addStretch(); // -------------------------------------------------------- - - + readMetadata(iptcData); } @@ -137,12 +137,25 @@ delete d; } -void IPTCCaption::applyMetadata(QByteArray& iptcData) +void IPTCCaption::readMetadata(QByteArray& iptcData) { + KIPIPlugins::Exiv2Iface exiv2Iface; + exiv2Iface.setIptc(iptcData); + d->captionEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.Caption", false)); + d->writerEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.Writer", false)); + d->headlineEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.Headline", false)); + d->specialInstructionEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.SpecialInstructions", false)); } -void IPTCCaption::readMetadata(QByteArray& iptcData) +void IPTCCaption::applyMetadata(QByteArray& iptcData) { + KIPIPlugins::Exiv2Iface exiv2Iface; + exiv2Iface.setIptc(iptcData); + exiv2Iface.setIptcTagString("Iptc.Application2.Caption", d->captionEdit->text()); + exiv2Iface.setIptcTagString("Iptc.Application2.Writer", d->writerEdit->text()); + exiv2Iface.setIptcTagString("Iptc.Application2.Headline", d->headlineEdit->text()); + exiv2Iface.setIptcTagString("Iptc.Application2.SpecialInstructions", d->specialInstructionEdit->text()); + iptcData = exiv2Iface.getIptc(); } } // namespace KIPIMetadataEditPlugin --- trunk/extragear/libs/kipi-plugins/metadataedit/iptccredits.cpp #595025:595026 @@ -35,6 +35,7 @@ // Local includes. +#include "exiv2iface.h" #include "iptccredits.h" #include "iptccredits.moc" @@ -148,12 +149,27 @@ delete d; } -void IPTCCredits::applyMetadata(QByteArray& iptcData) +void IPTCCredits::readMetadata(QByteArray& iptcData) { + KIPIPlugins::Exiv2Iface exiv2Iface; + exiv2Iface.setIptc(iptcData); + d->copyrightEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.Copyright", false)); + d->bylineEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.Byline", false)); + d->bylineTitleEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.BylineTitle", false)); + d->creditEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.Credit", false)); + d->sourceEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.Source", false)); } -void IPTCCredits::readMetadata(QByteArray& iptcData) +void IPTCCredits::applyMetadata(QByteArray& iptcData) { + KIPIPlugins::Exiv2Iface exiv2Iface; + exiv2Iface.setIptc(iptcData); + exiv2Iface.setIptcTagString("Iptc.Application2.Copyright", d->copyrightEdit->text()); + exiv2Iface.setIptcTagString("Iptc.Application2.Byline", d->bylineEdit->text()); + exiv2Iface.setIptcTagString("Iptc.Application2.BylineTitle", d->bylineTitleEdit->text()); + exiv2Iface.setIptcTagString("Iptc.Application2.Credit", d->creditEdit->text()); + exiv2Iface.setIptcTagString("Iptc.Application2.Source", d->sourceEdit->text()); + iptcData = exiv2Iface.getIptc(); } } // namespace KIPIMetadataEditPlugin --- trunk/extragear/libs/kipi-plugins/metadataedit/iptceditdialog.cpp #595025:595026 @@ -128,7 +128,7 @@ QByteArray IPTCEditDialog::getIPTCInfo() { - return QByteArray(); + return d->iptcData; } void IPTCEditDialog::slotOk() --- trunk/extragear/libs/kipi-plugins/metadataedit/metadataeditdialog.cpp #595025:595026 @@ -382,24 +382,24 @@ void MetadataEditDialog::slotApply() { -/* KURL::List images; + KURL::List images; QListViewItemIterator it( d->listView ); while ( it.current() ) { - GPSListViewItem *item = (GPSListViewItem*) it.current(); + MetadataItem *item = (MetadataItem*)it.current(); d->listView->setSelected(item, true); d->listView->ensureItemVisible(item); - item->writeGPSInfoToFile(); + item->writeMetadataToFile(); images.append(item->getUrl()); - // TODO : new libkipi method to store GPS info in host database. + // TODO : add libkipi method call to please the host to re-read metadata from pictures. ++it; kapp->processEvents(); } - d->interface->refreshImages(images);*/ + d->interface->refreshImages(images); } } // NameSpace KIPIMetadataEditPlugin --- trunk/extragear/libs/kipi-plugins/metadataedit/metadataitem.cpp #595025:595026 @@ -173,25 +173,34 @@ { if (isEnabled() && isDirty()) { -/* setPixmap(1, SmallIcon("run")); + setPixmap(1, SmallIcon("run")); KIPIPlugins::Exiv2Iface exiv2Iface; bool ret = exiv2Iface.load(d->url.path()); - if (d->erase) - ret &= exiv2Iface.removeGPSInfo(); + if (d->eraseExif) + { + // ret &= exiv2Iface.removeExif(); + } else { - ret &= exiv2Iface.setGPSInfo(d->gpsData.altitude(), - d->gpsData.latitude(), - d->gpsData.longitude()); + ret &= exiv2Iface.setExif(d->exifData); } + if (d->eraseIptc) + { + // ret &= exiv2Iface.removeIptc(); + } + else + { + ret &= exiv2Iface.setIptc(d->iptcData); + } + ret &= exiv2Iface.save(d->url.path()); if (ret) setPixmap(1, SmallIcon("ok")); else - setPixmap(1, SmallIcon("cancel"));*/ + setPixmap(1, SmallIcon("cancel")); d->dirty = false; }
SVN commit 595071 by cgilles: kipiplugins from trunk : MetadataEdit plugin: Added IPTC Status informations in IPTC Edit dialog CCMAIL: kde-imaging@kde.org CCBUGS: 91812, 133276, 103255 M +1 -1 Makefile.am M +1 -1 iptccredits.cpp M +10 -1 iptceditdialog.cpp A iptcstatus.cpp [License: GPL] A iptcstatus.h [License: GPL] --- trunk/extragear/libs/kipi-plugins/metadataedit/Makefile.am #595070:595071 @@ -11,7 +11,7 @@ # Srcs for the plugin kipiplugin_metadataedit_la_SOURCES = plugin_metadataedit.cpp metadataeditdialog.cpp \ metadataitem.cpp iptceditdialog.cpp iptccaption.cpp \ - iptccredits.cpp + iptccredits.cpp iptcstatus.cpp # Libs needed by the plugin kipiplugin_metadataedit_la_LIBADD = $(top_builddir)/kipi-plugins/common/exiv2iface/libexiv2iface.la \ --- trunk/extragear/libs/kipi-plugins/metadataedit/iptccredits.cpp #595070:595071 @@ -126,7 +126,7 @@ d->sourceEdit = new KLineEdit(parent); d->sourceEdit->setValidator(asciiValidator); d->sourceEdit->setMaxLength(32); - label4->setBuddy(d->sourceEdit); + label5->setBuddy(d->sourceEdit); vlay->addWidget(label5); vlay->addWidget(d->sourceEdit); QWhatsThis::add(d->sourceEdit, i18n("<p>Set here the original owner of content. " --- trunk/extragear/libs/kipi-plugins/metadataedit/iptceditdialog.cpp #595070:595071 @@ -40,6 +40,7 @@ #include "iptccaption.h" #include "iptccredits.h" +#include "iptcstatus.h" #include "iptceditdialog.h" #include "iptceditdialog.moc" @@ -55,19 +56,22 @@ { page_caption = 0; page_credits = 0; + page_status = 0; captionPage = 0; creditsPage = 0; + statusPage = 0; } QByteArray iptcData; QFrame *page_caption; QFrame *page_credits; + QFrame *page_status; IPTCCaption *captionPage; IPTCCredits *creditsPage; - + IPTCStatus *statusPage; }; IPTCEditDialog::IPTCEditDialog(QWidget* parent, QByteArray iptcData, const QString& fileName) @@ -87,6 +91,10 @@ BarIcon("identity", KIcon::SizeMedium)); d->creditsPage = new IPTCCredits(d->page_credits, d->iptcData); + d->page_status = addPage(i18n("Status"), i18n("IPTC Status Informations"), + BarIcon("messagebox_info", KIcon::SizeMedium)); + d->statusPage = new IPTCStatus(d->page_status, d->iptcData); + readSettings(); show(); } @@ -135,6 +143,7 @@ { d->captionPage->applyMetadata(d->iptcData); d->creditsPage->applyMetadata(d->iptcData); + d->statusPage->applyMetadata(d->iptcData); saveSettings(); accept();
SVN commit 595152 by cgilles: kipiplugins from trunk : MetadataEdit plugin: Added IPTC Origin informations in IPTC Edit dialog CCMAIL: kde-imaging@kde.org CCBUGS: 91812, 133276, 103255 M +1 -1 Makefile.am M +11 -2 iptceditdialog.cpp M +0 -13 iptceditdialog.h A iptcorigin.cpp [License: GPL] A iptcorigin.h [License: GPL] --- trunk/extragear/libs/kipi-plugins/metadataedit/Makefile.am #595151:595152 @@ -11,7 +11,7 @@ # Srcs for the plugin kipiplugin_metadataedit_la_SOURCES = plugin_metadataedit.cpp metadataeditdialog.cpp \ metadataitem.cpp iptceditdialog.cpp iptccaption.cpp \ - iptccredits.cpp iptcstatus.cpp + iptccredits.cpp iptcstatus.cpp iptcorigin.cpp # Libs needed by the plugin kipiplugin_metadataedit_la_LIBADD = $(top_builddir)/kipi-plugins/common/exiv2iface/libexiv2iface.la \ --- trunk/extragear/libs/kipi-plugins/metadataedit/iptceditdialog.cpp #595151:595152 @@ -41,6 +41,7 @@ #include "iptccaption.h" #include "iptccredits.h" #include "iptcstatus.h" +#include "iptcorigin.h" #include "iptceditdialog.h" #include "iptceditdialog.moc" @@ -57,10 +58,12 @@ page_caption = 0; page_credits = 0; page_status = 0; + page_origin = 0; captionPage = 0; creditsPage = 0; statusPage = 0; + originPage = 0; } QByteArray iptcData; @@ -68,10 +71,12 @@ QFrame *page_caption; QFrame *page_credits; QFrame *page_status; + QFrame *page_origin; IPTCCaption *captionPage; IPTCCredits *creditsPage; IPTCStatus *statusPage; + IPTCOrigin *originPage; }; IPTCEditDialog::IPTCEditDialog(QWidget* parent, QByteArray iptcData, const QString& fileName) @@ -95,6 +100,10 @@ BarIcon("messagebox_info", KIcon::SizeMedium)); d->statusPage = new IPTCStatus(d->page_status, d->iptcData); + d->page_origin = addPage(i18n("Origin"), i18n("IPTC Origin Informations"), + BarIcon("www", KIcon::SizeMedium)); + d->originPage = new IPTCOrigin(d->page_origin, d->iptcData); + readSettings(); show(); } @@ -121,7 +130,7 @@ { KConfig config("kipirc"); config.setGroup("Metadata Edit Settings"); - showPage(config.readNumEntry("IPTC Edit Page", Caption)); + showPage(config.readNumEntry("IPTC Edit Page", 0)); resize(configDialogSize(config, QString("IPTC Edit Dialog"))); } @@ -144,7 +153,7 @@ d->captionPage->applyMetadata(d->iptcData); d->creditsPage->applyMetadata(d->iptcData); d->statusPage->applyMetadata(d->iptcData); - + d->originPage->applyMetadata(d->iptcData); saveSettings(); accept(); } --- trunk/extragear/libs/kipi-plugins/metadataedit/iptceditdialog.h #595151:595152 @@ -40,19 +40,6 @@ public: - enum Page - { - LastPageUsed = -1, - Caption = 0, - Keywords, - Categories, - Credits, - Status, - Origin - }; - -public: - IPTCEditDialog(QWidget* parent, QByteArray iptcData, const QString& fileName); ~IPTCEditDialog();
SVN commit 595192 by cgilles: kipiplugins from trunk : MetadataEdit plugin: Added IPTC Date & Time informations in IPTC Edit dialog CCMAIL: kde-imaging@kde.org CCBUGS: 91812, 133276, 103255 M +2 -1 Makefile.am A iptcdatetime.cpp [License: GPL] A iptcdatetime.h [License: GPL] M +38 -28 iptceditdialog.cpp --- trunk/extragear/libs/kipi-plugins/metadataedit/Makefile.am #595191:595192 @@ -11,7 +11,8 @@ # Srcs for the plugin kipiplugin_metadataedit_la_SOURCES = plugin_metadataedit.cpp metadataeditdialog.cpp \ metadataitem.cpp iptceditdialog.cpp iptccaption.cpp \ - iptccredits.cpp iptcstatus.cpp iptcorigin.cpp + iptccredits.cpp iptcstatus.cpp iptcorigin.cpp \ + iptcdatetime.cpp # Libs needed by the plugin kipiplugin_metadataedit_la_LIBADD = $(top_builddir)/kipi-plugins/common/exiv2iface/libexiv2iface.la \ --- trunk/extragear/libs/kipi-plugins/metadataedit/iptceditdialog.cpp #595191:595192 @@ -42,6 +42,7 @@ #include "iptccredits.h" #include "iptcstatus.h" #include "iptcorigin.h" +#include "iptcdatetime.h" #include "iptceditdialog.h" #include "iptceditdialog.moc" @@ -55,28 +56,32 @@ IPTCEditDialogDialogPrivate() { - page_caption = 0; - page_credits = 0; - page_status = 0; - page_origin = 0; + page_caption = 0; + page_credits = 0; + page_status = 0; + page_origin = 0; + page_datetime = 0; - captionPage = 0; - creditsPage = 0; - statusPage = 0; - originPage = 0; + captionPage = 0; + creditsPage = 0; + statusPage = 0; + originPage = 0; + datetimePage = 0; } QByteArray iptcData; - QFrame *page_caption; - QFrame *page_credits; - QFrame *page_status; - QFrame *page_origin; + QFrame *page_caption; + QFrame *page_credits; + QFrame *page_status; + QFrame *page_origin; + QFrame *page_datetime; - IPTCCaption *captionPage; - IPTCCredits *creditsPage; - IPTCStatus *statusPage; - IPTCOrigin *originPage; + IPTCCaption *captionPage; + IPTCCredits *creditsPage; + IPTCStatus *statusPage; + IPTCOrigin *originPage; + IPTCDateTime *datetimePage; }; IPTCEditDialog::IPTCEditDialog(QWidget* parent, QByteArray iptcData, const QString& fileName) @@ -88,22 +93,26 @@ setHelp("metadataedit", "kipi-plugins"); - d->page_caption = addPage(i18n("Caption"), i18n("IPTC Caption Informations"), - BarIcon("editclear", KIcon::SizeMedium)); - d->captionPage = new IPTCCaption(d->page_caption, d->iptcData); + d->page_caption = addPage(i18n("Caption"), i18n("IPTC Caption Informations"), + BarIcon("editclear", KIcon::SizeMedium)); + d->captionPage = new IPTCCaption(d->page_caption, d->iptcData); - d->page_credits = addPage(i18n("Credits"), i18n("IPTC Credits Informations"), - BarIcon("identity", KIcon::SizeMedium)); - d->creditsPage = new IPTCCredits(d->page_credits, d->iptcData); + d->page_credits = addPage(i18n("Credits"), i18n("IPTC Credits Informations"), + BarIcon("identity", KIcon::SizeMedium)); + d->creditsPage = new IPTCCredits(d->page_credits, d->iptcData); - d->page_status = addPage(i18n("Status"), i18n("IPTC Status Informations"), - BarIcon("messagebox_info", KIcon::SizeMedium)); - d->statusPage = new IPTCStatus(d->page_status, d->iptcData); + d->page_status = addPage(i18n("Status"), i18n("IPTC Status Informations"), + BarIcon("messagebox_info", KIcon::SizeMedium)); + d->statusPage = new IPTCStatus(d->page_status, d->iptcData); - d->page_origin = addPage(i18n("Origin"), i18n("IPTC Origin Informations"), - BarIcon("www", KIcon::SizeMedium)); - d->originPage = new IPTCOrigin(d->page_origin, d->iptcData); + d->page_origin = addPage(i18n("Origin"), i18n("IPTC Origin Informations"), + BarIcon("www", KIcon::SizeMedium)); + d->originPage = new IPTCOrigin(d->page_origin, d->iptcData); + d->page_datetime = addPage(i18n("Date & Time"), i18n("IPTC Date and Time Informations"), + BarIcon("today", KIcon::SizeMedium)); + d->datetimePage = new IPTCDateTime(d->page_datetime, d->iptcData); + readSettings(); show(); } @@ -154,6 +163,7 @@ d->creditsPage->applyMetadata(d->iptcData); d->statusPage->applyMetadata(d->iptcData); d->originPage->applyMetadata(d->iptcData); + d->datetimePage->applyMetadata(d->iptcData); saveSettings(); accept(); }
SVN commit 595205 by cgilles: kipiplugins from trunk : MetadataEdit plugin: Missing IPTC Contact and Subject tags. CCMAIL: kde-imaging@kde.org CCBUGS: 91812, 133276, 103255 M +25 -9 iptccaption.cpp M +16 -1 iptccredits.cpp --- trunk/extragear/libs/kipi-plugins/metadataedit/iptccaption.cpp #595204:595205 @@ -50,11 +50,13 @@ IPTCCaptionPriv() { captionEdit = 0; + subjectEdit = 0; writerEdit = 0; headlineEdit = 0; specialInstructionEdit = 0; } + KLineEdit *subjectEdit; KLineEdit *writerEdit; KLineEdit *headlineEdit; @@ -86,36 +88,48 @@ // -------------------------------------------------------- - QLabel *label2 = new QLabel(i18n("Caption Writer:"), parent); + QLabel *label2 = new QLabel(i18n("Subject:"), parent); + d->subjectEdit = new KLineEdit(parent); + d->subjectEdit->setValidator(asciiValidator); + d->subjectEdit->setMaxLength(236); + label2->setBuddy(d->subjectEdit); + vlay->addWidget(label2); + vlay->addWidget(d->subjectEdit); + QWhatsThis::add(d->subjectEdit, i18n("<p>Set here the structured definition of the subject. " + "This field is limited to 236 ASCII characters.")); + + // -------------------------------------------------------- + + QLabel *label3 = new QLabel(i18n("Caption Writer:"), parent); d->writerEdit = new KLineEdit(parent); d->writerEdit->setValidator(asciiValidator); d->writerEdit->setMaxLength(32); - label2->setBuddy(d->writerEdit); - vlay->addWidget(label2); + label3->setBuddy(d->writerEdit); + vlay->addWidget(label3); vlay->addWidget(d->writerEdit); QWhatsThis::add(d->writerEdit, i18n("<p>Set here the person responsible for caption. This field is limited " "to 32 ASCII characters.")); // -------------------------------------------------------- - QLabel *label3 = new QLabel(i18n("Headline:"), parent); + QLabel *label4 = new QLabel(i18n("Headline:"), parent); d->headlineEdit = new KLineEdit(parent); d->headlineEdit->setValidator(asciiValidator); d->headlineEdit->setMaxLength(256); - label3->setBuddy(d->headlineEdit); - vlay->addWidget(label3); + label4->setBuddy(d->headlineEdit); + vlay->addWidget(label4); vlay->addWidget(d->headlineEdit); QWhatsThis::add(d->headlineEdit, i18n("<p>Set here the content synopsis. This field is limited " "to 256 ASCII characters.")); // -------------------------------------------------------- - QLabel *label4 = new QLabel(i18n("Special Instructions:"), parent); + QLabel *label5 = new QLabel(i18n("Special Instructions:"), parent); d->specialInstructionEdit = new KTextEdit(parent); /* d->specialInstructionEdit->setValidator(asciiValidator); d->specialInstructionEdit->setMaxLength(256);*/ - label4->setBuddy(d->specialInstructionEdit); - vlay->addWidget(label4); + label5->setBuddy(d->specialInstructionEdit); + vlay->addWidget(label5); vlay->addWidget(d->specialInstructionEdit); QWhatsThis::add(d->specialInstructionEdit, i18n("<p>Set here the editorial usage instructions. " "This field is limited to 256 ASCII characters.")); @@ -142,6 +156,7 @@ KIPIPlugins::Exiv2Iface exiv2Iface; exiv2Iface.setIptc(iptcData); d->captionEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.Caption", false)); + d->subjectEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.Subject", false)); d->writerEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.Writer", false)); d->headlineEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.Headline", false)); d->specialInstructionEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.SpecialInstructions", false)); @@ -152,6 +167,7 @@ KIPIPlugins::Exiv2Iface exiv2Iface; exiv2Iface.setIptc(iptcData); exiv2Iface.setIptcTagString("Iptc.Application2.Caption", d->captionEdit->text()); + exiv2Iface.setIptcTagString("Iptc.Application2.Subject", d->subjectEdit->text()); exiv2Iface.setIptcTagString("Iptc.Application2.Writer", d->writerEdit->text()); exiv2Iface.setIptcTagString("Iptc.Application2.Headline", d->headlineEdit->text()); exiv2Iface.setIptcTagString("Iptc.Application2.SpecialInstructions", d->specialInstructionEdit->text()); --- trunk/extragear/libs/kipi-plugins/metadataedit/iptccredits.cpp #595204:595205 @@ -53,6 +53,7 @@ bylineTitleEdit = 0; creditEdit = 0; sourceEdit = 0; + contactEdit = 0; } KLineEdit *copyrightEdit; @@ -60,6 +61,7 @@ KLineEdit *bylineTitleEdit; KLineEdit *creditEdit; KLineEdit *sourceEdit; + KLineEdit *contactEdit; }; IPTCCredits::IPTCCredits(QWidget* parent, QByteArray& iptcData) @@ -134,6 +136,18 @@ // -------------------------------------------------------- + QLabel *label6 = new QLabel(i18n("Contact:"), parent); + d->contactEdit = new KLineEdit(parent); + d->contactEdit->setValidator(asciiValidator); + d->contactEdit->setMaxLength(128); + label6->setBuddy(d->sourceEdit); + vlay->addWidget(label6); + vlay->addWidget(d->contactEdit); + QWhatsThis::add(d->contactEdit, i18n("<p>Set here the person or organisation to contact. " + "This field is limited to 128 ASCII characters.")); + + // -------------------------------------------------------- + QLabel *iptcNote = new QLabel(i18n("<b>Note: IPTC text tags only support printable " "ASCII characters set.</b>"), parent); vlay->addWidget(iptcNote); @@ -158,6 +172,7 @@ d->bylineTitleEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.BylineTitle", false)); d->creditEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.Credit", false)); d->sourceEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.Source", false)); + d->contactEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.Contact", false)); } void IPTCCredits::applyMetadata(QByteArray& iptcData) @@ -168,7 +183,7 @@ exiv2Iface.setIptcTagString("Iptc.Application2.Byline", d->bylineEdit->text()); exiv2Iface.setIptcTagString("Iptc.Application2.BylineTitle", d->bylineTitleEdit->text()); exiv2Iface.setIptcTagString("Iptc.Application2.Credit", d->creditEdit->text()); - exiv2Iface.setIptcTagString("Iptc.Application2.Source", d->sourceEdit->text()); + exiv2Iface.setIptcTagString("Iptc.Application2.Source", d->sourceEdit->text()); exiv2Iface.setIptcTagString("Iptc.Application2.Contact", d->contactEdit->text()); iptcData = exiv2Iface.getIptc(); }
SVN commit 595212 by cgilles: kipiplugins from trunk : MetadataEdit plugin: Missing IPTC LocationName and LocationCode tags. CCMAIL: kde-imaging@kde.org CCBUGS: 91812, 133276, 103255 M +36 -5 iptcorigin.cpp --- trunk/extragear/libs/kipi-plugins/metadataedit/iptcorigin.cpp #595211:595212 @@ -52,6 +52,8 @@ provinceEdit = 0; countryEdit = 0; countryCodeEdit = 0; + locationEdit = 0; + locationCodeEdit = 0; originalTransEdit = 0; } @@ -61,6 +63,8 @@ KLineEdit *provinceEdit; KLineEdit *countryEdit; KLineEdit *countryCodeEdit; + KLineEdit *locationEdit; + KLineEdit *locationCodeEdit; KLineEdit *originalTransEdit; }; @@ -89,6 +93,30 @@ // -------------------------------------------------------- + QLabel *label2 = new QLabel(i18n("Location:"), parent); + d->locationEdit = new KLineEdit(parent); + d->locationEdit->setValidator(asciiValidator); + d->locationEdit->setMaxLength(64); + label2->setBuddy(d->locationEdit); + grid->addMultiCellWidget(label2, 2, 2, 0, 0); + grid->addMultiCellWidget(d->locationEdit, 2, 2, 1, 2); + QWhatsThis::add(d->locationEdit, i18n("<p>Set here the full country name referenced by the content. " + "This field is limited to 64 ASCII characters.")); + + // -------------------------------------------------------- + + QLabel *label3 = new QLabel(i18n("Location code:"), parent); + d->locationCodeEdit = new KLineEdit(parent); + d->locationCodeEdit->setValidator(asciiValidator); + d->locationCodeEdit->setMaxLength(3); + label3->setBuddy(d->locationCodeEdit); + grid->addMultiCellWidget(label3, 3, 3, 0, 0); + grid->addMultiCellWidget(d->locationCodeEdit, 3, 3, 1, 1); + QWhatsThis::add(d->locationCodeEdit, i18n("<p>Set here the ISO country code referenced by the content. " + "This field is limited to 3 ASCII characters.")); + + // -------------------------------------------------------- + QLabel *label4 = new QLabel(i18n("City:"), parent); d->cityEdit = new KLineEdit(parent); d->cityEdit->setValidator(asciiValidator); @@ -117,7 +145,7 @@ d->provinceEdit = new KLineEdit(parent); d->provinceEdit->setValidator(asciiValidator); d->provinceEdit->setMaxLength(32); - label5->setBuddy(d->provinceEdit); + label6->setBuddy(d->provinceEdit); grid->addMultiCellWidget(label6, 8, 8, 0, 0); grid->addMultiCellWidget(d->provinceEdit, 8, 8, 1, 2); QWhatsThis::add(d->provinceEdit, i18n("<p>Set here the Province or State of content origin. " @@ -129,10 +157,10 @@ d->countryEdit = new KLineEdit(parent); d->countryEdit->setValidator(asciiValidator); d->countryEdit->setMaxLength(64); - label5->setBuddy(d->countryEdit); + label7->setBuddy(d->countryEdit); grid->addMultiCellWidget(label7, 9, 9, 0, 0); grid->addMultiCellWidget(d->countryEdit, 9, 9, 1, 2); - QWhatsThis::add(d->provinceEdit, i18n("<p>Set here the full country name of content origin. " + QWhatsThis::add(d->countryEdit, i18n("<p>Set here the full country name of content origin. " "This field is limited to 64 ASCII characters.")); // -------------------------------------------------------- @@ -143,7 +171,7 @@ d->countryCodeEdit->setMaxLength(3); label5->setBuddy(d->countryCodeEdit); grid->addMultiCellWidget(label8, 10, 10, 0, 0); - grid->addMultiCellWidget(d->countryCodeEdit, 10, 10, 1, 2); + grid->addMultiCellWidget(d->countryCodeEdit, 10, 10, 1, 1); QWhatsThis::add(d->countryCodeEdit, i18n("<p>Set here the ISO country code of content origin. " "This field is limited to 3 ASCII characters.")); @@ -183,6 +211,8 @@ exiv2Iface.setIptc(iptcData); d->objectNameEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.ObjectName", false)); + d->locationEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.LocationName", false)); + d->locationCodeEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.LocationCode", false)); d->cityEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.City", false)); d->sublocationEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.SubLocation", false)); d->provinceEdit->setText(exiv2Iface.getIptcTagString("Iptc.Application2.ProvinceState", false)); @@ -197,7 +227,8 @@ exiv2Iface.setIptc(iptcData); exiv2Iface.setIptcTagString("Iptc.Application2.ObjectName", d->objectNameEdit->text()); - exiv2Iface.setIptcTagString("Iptc.Application2.City", d->cityEdit->text()); + exiv2Iface.setIptcTagString("Iptc.Application2.LocationName", d->locationEdit->text()); + exiv2Iface.setIptcTagString("Iptc.Application2.LocationCode", d->locationCodeEdit->text()); exiv2Iface.setIptcTagString("Iptc.Application2.City", d->cityEdit->text()); exiv2Iface.setIptcTagString("Iptc.Application2.SubLocation", d->sublocationEdit->text()); exiv2Iface.setIptcTagString("Iptc.Application2.ProvinceState", d->provinceEdit->text()); exiv2Iface.setIptcTagString("Iptc.Application2.CountryName", d->countryEdit->text());
SVN commit 595780 by cgilles: kipi-plugins from trunk : MetadataEdit plugin : IPTC Keywords editor page is now implemented. CCMAIL: digikam-devel@kde.org, kde-imaging@kde.org CCBUGS: 91812, 133276, 103255 M +1 -1 Makefile.am M +10 -0 iptceditdialog.cpp A iptckeywords.cpp [License: GPL] A iptckeywords.h [License: GPL] --- trunk/extragear/libs/kipi-plugins/metadataedit/Makefile.am #595779:595780 @@ -12,7 +12,7 @@ kipiplugin_metadataedit_la_SOURCES = plugin_metadataedit.cpp metadataeditdialog.cpp \ metadataitem.cpp iptceditdialog.cpp iptccaption.cpp \ iptccredits.cpp iptcstatus.cpp iptcorigin.cpp \ - iptcdatetime.cpp + iptcdatetime.cpp iptckeywords.cpp # Libs needed by the plugin kipiplugin_metadataedit_la_LIBADD = $(top_builddir)/kipi-plugins/common/exiv2iface/libexiv2iface.la \ --- trunk/extragear/libs/kipi-plugins/metadataedit/iptceditdialog.cpp #595779:595780 @@ -43,6 +43,7 @@ #include "iptcstatus.h" #include "iptcorigin.h" #include "iptcdatetime.h" +#include "iptckeywords.h" #include "iptceditdialog.h" #include "iptceditdialog.moc" @@ -57,12 +58,14 @@ IPTCEditDialogDialogPrivate() { page_caption = 0; + page_keywords = 0; page_credits = 0; page_status = 0; page_origin = 0; page_datetime = 0; captionPage = 0; + keywordsPage = 0; creditsPage = 0; statusPage = 0; originPage = 0; @@ -72,12 +75,14 @@ QByteArray iptcData; QFrame *page_caption; + QFrame *page_keywords; QFrame *page_credits; QFrame *page_status; QFrame *page_origin; QFrame *page_datetime; IPTCCaption *captionPage; + IPTCKeywords *keywordsPage; IPTCCredits *creditsPage; IPTCStatus *statusPage; IPTCOrigin *originPage; @@ -97,6 +102,10 @@ BarIcon("editclear", KIcon::SizeMedium)); d->captionPage = new IPTCCaption(d->page_caption, d->iptcData); + d->page_keywords = addPage(i18n("Keywords"), i18n("IPTC Keywords Informations"), + BarIcon("bookmark", KIcon::SizeMedium)); + d->keywordsPage = new IPTCKeywords(d->page_keywords, d->iptcData); + d->page_credits = addPage(i18n("Credits"), i18n("IPTC Credits Informations"), BarIcon("identity", KIcon::SizeMedium)); d->creditsPage = new IPTCCredits(d->page_credits, d->iptcData); @@ -160,6 +169,7 @@ void IPTCEditDialog::slotOk() { d->captionPage->applyMetadata(d->iptcData); + d->keywordsPage->applyMetadata(d->iptcData); d->creditsPage->applyMetadata(d->iptcData); d->statusPage->applyMetadata(d->iptcData); d->originPage->applyMetadata(d->iptcData);
SVN commit 595932 by cgilles: kipi-plugins from trunk : MetadataEdit plugin : IPTC Categories editor page is now implemented. CCMAIL: digikam-devel@kde.org, kde-imaging@kde.org CCBUGS: 91812, 133276, 103255 A iptccategories.cpp [License: GPL] A iptccategories.h [License: GPL]
SVN commit 595953 by cgilles: kipi-plugins from trunk : MetadataEdit plugin : add ObjectType IPTC tag to status editor page. CCBUGS: 91812, 133276, 103255 M +67 -12 iptcstatus.cpp --- trunk/extragear/libs/kipi-plugins/metadataedit/iptcstatus.cpp #595952:595953 @@ -50,12 +50,14 @@ { priorityCB = 0; objectCycleCB = 0; + objectTypeCB = 0; statusEdit = 0; JobIDEdit = 0; programEdit = 0; programVersionEdit = 0; priorityCheck = 0; objectCycleCheck = 0; + objectTypeCheck = 0; statusCheck = 0; JobIDCheck = 0; programCheck = 0; @@ -63,6 +65,7 @@ } QCheckBox *priorityCheck; + QCheckBox *objectTypeCheck; QCheckBox *objectCycleCheck; QCheckBox *statusCheck; QCheckBox *JobIDCheck; @@ -71,8 +74,10 @@ QComboBox *priorityCB; QComboBox *objectCycleCB; + QComboBox *objectTypeCB; KLineEdit *statusEdit; + KLineEdit *objectTypeDescEdit; KLineEdit *JobIDEdit; KLineEdit *programEdit; KLineEdit *programVersionEdit; @@ -83,7 +88,7 @@ { d = new IPTCStatusPriv; - QGridLayout* grid = new QGridLayout(parent, 11, 2, KDialog::spacingHint()); + QGridLayout* grid = new QGridLayout(parent, 12, 2, KDialog::spacingHint()); // IPTC only accept printable Ascii char. QRegExp asciiRx("[\x20-\x7F]+$"); @@ -121,21 +126,38 @@ d->objectCycleCheck = new QCheckBox(i18n("Object Cycle:"), parent); d->objectCycleCB = new QComboBox(false, parent); - d->objectCycleCB->insertItem(i18n("a: Morning"), 0); - d->objectCycleCB->insertItem(i18n("b: Afternoon"), 1); - d->objectCycleCB->insertItem(i18n("c: Evening"), 2); + d->objectCycleCB->insertItem(i18n("Morning"), 0); + d->objectCycleCB->insertItem(i18n("Afternoon"), 1); + d->objectCycleCB->insertItem(i18n("Evening"), 2); grid->addMultiCellWidget(d->objectCycleCheck, 3, 3, 0, 0); grid->addMultiCellWidget(d->objectCycleCB, 3, 3, 1, 1); QWhatsThis::add(d->objectCycleCB, i18n("<p>Select here the editorial cycle of content.")); // -------------------------------------------------------- + d->objectTypeCheck = new QCheckBox(i18n("Object Type:"), parent); + d->objectTypeCB = new QComboBox(false, parent); + d->objectTypeDescEdit = new KLineEdit(parent); + d->objectTypeDescEdit->setValidator(asciiValidator); + d->objectTypeDescEdit->setMaxLength(32); + d->objectTypeCB->insertItem(i18n("News"), 0); + d->objectTypeCB->insertItem(i18n("Data"), 1); + d->objectTypeCB->insertItem(i18n("Advisory"), 2); + grid->addMultiCellWidget(d->objectTypeCheck, 4, 4, 0, 0); + grid->addMultiCellWidget(d->objectTypeCB, 4, 4, 1, 1); + grid->addMultiCellWidget(d->objectTypeDescEdit, 4, 4, 2, 2); + QWhatsThis::add(d->objectTypeCB, i18n("<p>Select here the editorial type of content.")); + QWhatsThis::add(d->objectTypeDescEdit, i18n("<p>Set here the editorial description of content. " + "This field is limited to 64 ASCII characters.")); + + // -------------------------------------------------------- + d->JobIDCheck = new QCheckBox(i18n("Job ID:"), parent); d->JobIDEdit = new KLineEdit(parent); d->JobIDEdit->setValidator(asciiValidator); d->JobIDEdit->setMaxLength(32); - grid->addMultiCellWidget(d->JobIDCheck, 4, 4, 0, 2); - grid->addMultiCellWidget(d->JobIDEdit, 5, 5, 0, 2); + grid->addMultiCellWidget(d->JobIDCheck, 5, 5, 0, 2); + grid->addMultiCellWidget(d->JobIDEdit, 6, 6, 0, 2); QWhatsThis::add(d->JobIDEdit, i18n("<p>Set here the string that identifies content that recurs. " "This field is limited to 32 ASCII characters.")); @@ -145,8 +167,8 @@ d->programEdit = new KLineEdit(parent); d->programEdit->setValidator(asciiValidator); d->programEdit->setMaxLength(32); - grid->addMultiCellWidget(d->programCheck, 6, 6, 0, 2); - grid->addMultiCellWidget(d->programEdit, 7, 7, 0, 2); + grid->addMultiCellWidget(d->programCheck, 7, 7, 0, 2); + grid->addMultiCellWidget(d->programEdit, 8, 8, 0, 2); QWhatsThis::add(d->programEdit, i18n("<p>Set here the content creation program name. " "This field is limited to 32 ASCII characters.")); @@ -156,8 +178,8 @@ d->programVersionEdit = new KLineEdit(parent); d->programVersionEdit->setValidator(asciiValidator); d->programVersionEdit->setMaxLength(10); - grid->addMultiCellWidget(d->programVersionCheck, 8, 8, 0, 2); - grid->addMultiCellWidget(d->programVersionEdit, 9, 9, 0, 0); + grid->addMultiCellWidget(d->programVersionCheck, 9, 9, 0, 2); + grid->addMultiCellWidget(d->programVersionEdit, 10, 10, 0, 0); QWhatsThis::add(d->programVersionEdit, i18n("<p>Set here the content creation program version. " "This field is limited to 10 ASCII characters.")); @@ -165,9 +187,9 @@ QLabel *iptcNote = new QLabel(i18n("<b>Note: IPTC text tags only support printable " "ASCII characters set.</b>"), parent); - grid->addMultiCellWidget(iptcNote, 10, 10, 0, 2); + grid->addMultiCellWidget(iptcNote, 11, 11, 0, 2); grid->setColStretch(2, 10); - grid->setRowStretch(11, 10); + grid->setRowStretch(12, 10); // -------------------------------------------------------- @@ -177,6 +199,12 @@ connect(d->objectCycleCheck, SIGNAL(toggled(bool)), d->objectCycleCB, SLOT(setEnabled(bool))); + connect(d->objectTypeCheck, SIGNAL(toggled(bool)), + d->objectTypeCB, SLOT(setEnabled(bool))); + + connect(d->objectTypeCheck, SIGNAL(toggled(bool)), + d->objectTypeDescEdit, SLOT(setEnabled(bool))); + connect(d->statusCheck, SIGNAL(toggled(bool)), d->statusEdit, SLOT(setEnabled(bool))); @@ -213,6 +241,24 @@ } d->statusEdit->setEnabled(d->statusCheck->isChecked()); + data = exiv2Iface.getIptcTagString("Iptc.Application2.ObjectType", false); + if (!data.isNull()) + { + QString typeSec = data.section(":", 0, 0); + if (!typeSec.isEmpty()) + { + int type = typeSec.toInt(); + if (type < 3 && type >= 0) + { + d->objectTypeCB->setCurrentItem(type); + d->objectTypeDescEdit->setText(data.section(":", -1)); + d->objectTypeCheck->setChecked(true); + } + } + } + d->objectTypeCB->setEnabled(d->objectTypeCheck->isChecked()); + d->objectTypeDescEdit->setEnabled(d->objectTypeCheck->isChecked()); + data = exiv2Iface.getIptcTagString("Iptc.Application2.FixtureId", false); if (!data.isNull()) { @@ -270,6 +316,15 @@ else exiv2Iface.removeIptcTag("Iptc.Application2.EditStatus"); + if (d->objectTypeCheck->isChecked()) + { + QString objectType = QString("0%1:%2").arg(d->objectTypeCB->currentItem()) + .arg(d->objectTypeDescEdit->text()); + exiv2Iface.setIptcTagString("Iptc.Application2.ObjectType", objectType); + } + else + exiv2Iface.removeIptcTag("Iptc.Application2.ObjectType"); + if (d->JobIDCheck->isChecked()) exiv2Iface.setIptcTagString("Iptc.Application2.FixtureId", d->JobIDEdit->text()); else
SVN commit 595961 by cgilles: kipi-plugins from trunk : MetadataEdit plugin : add ObjectAttribute IPTC tag to status editor page. CCBUGS: 91812, 133276, 103255 M +90 -16 iptcstatus.cpp --- trunk/extragear/libs/kipi-plugins/metadataedit/iptcstatus.cpp #595960:595961 @@ -67,6 +67,7 @@ QCheckBox *priorityCheck; QCheckBox *objectTypeCheck; QCheckBox *objectCycleCheck; + QCheckBox *objectAttributeCheck; QCheckBox *statusCheck; QCheckBox *JobIDCheck; QCheckBox *programCheck; @@ -75,9 +76,11 @@ QComboBox *priorityCB; QComboBox *objectCycleCB; QComboBox *objectTypeCB; + QComboBox *objectAttributeCB; KLineEdit *statusEdit; KLineEdit *objectTypeDescEdit; + KLineEdit *objectAttributeDescEdit; KLineEdit *JobIDEdit; KLineEdit *programEdit; KLineEdit *programVersionEdit; @@ -88,7 +91,7 @@ { d = new IPTCStatusPriv; - QGridLayout* grid = new QGridLayout(parent, 12, 2, KDialog::spacingHint()); + QGridLayout* grid = new QGridLayout(parent, 14, 2, KDialog::spacingHint()); // IPTC only accept printable Ascii char. QRegExp asciiRx("[\x20-\x7F]+$"); @@ -139,25 +142,61 @@ d->objectTypeCB = new QComboBox(false, parent); d->objectTypeDescEdit = new KLineEdit(parent); d->objectTypeDescEdit->setValidator(asciiValidator); - d->objectTypeDescEdit->setMaxLength(32); + d->objectTypeDescEdit->setMaxLength(64); d->objectTypeCB->insertItem(i18n("News"), 0); d->objectTypeCB->insertItem(i18n("Data"), 1); d->objectTypeCB->insertItem(i18n("Advisory"), 2); grid->addMultiCellWidget(d->objectTypeCheck, 4, 4, 0, 0); grid->addMultiCellWidget(d->objectTypeCB, 4, 4, 1, 1); - grid->addMultiCellWidget(d->objectTypeDescEdit, 4, 4, 2, 2); + grid->addMultiCellWidget(d->objectTypeDescEdit, 5, 5, 0, 2); QWhatsThis::add(d->objectTypeCB, i18n("<p>Select here the editorial type of content.")); - QWhatsThis::add(d->objectTypeDescEdit, i18n("<p>Set here the editorial description of content. " + QWhatsThis::add(d->objectTypeDescEdit, i18n("<p>Set here the editorial type description of content. " "This field is limited to 64 ASCII characters.")); // -------------------------------------------------------- + d->objectAttributeCheck = new QCheckBox(i18n("Object Attribute:"), parent); + d->objectAttributeCB = new QComboBox(false, parent); + d->objectAttributeDescEdit = new KLineEdit(parent); + d->objectAttributeDescEdit->setValidator(asciiValidator); + d->objectAttributeDescEdit->setMaxLength(64); + d->objectAttributeCB->insertItem(i18n("Current"), 0); + d->objectAttributeCB->insertItem(i18n("Analysis"), 1); + d->objectAttributeCB->insertItem(i18n("Archive material"), 2); + d->objectAttributeCB->insertItem(i18n("Background"), 3); + d->objectAttributeCB->insertItem(i18n("Feature"), 4); + d->objectAttributeCB->insertItem(i18n("Forecast"), 5); + d->objectAttributeCB->insertItem(i18n("History"), 6); + d->objectAttributeCB->insertItem(i18n("Obituary"), 7); + d->objectAttributeCB->insertItem(i18n("Opinion"), 8); + d->objectAttributeCB->insertItem(i18n("Polls & Surveys"), 9); + d->objectAttributeCB->insertItem(i18n("Profile"), 10); + d->objectAttributeCB->insertItem(i18n("Results Listings & Table"), 11); + d->objectAttributeCB->insertItem(i18n("Side bar & Supporting information"), 12); + d->objectAttributeCB->insertItem(i18n("Summary"), 13); + d->objectAttributeCB->insertItem(i18n("Transcript & Verbatim"), 14); + d->objectAttributeCB->insertItem(i18n("Interview"), 15); + d->objectAttributeCB->insertItem(i18n("From the Scene"), 16); + d->objectAttributeCB->insertItem(i18n("Retrospective"), 17); + d->objectAttributeCB->insertItem(i18n("Statistics"), 18); + d->objectAttributeCB->insertItem(i18n("Update"), 19); + d->objectAttributeCB->insertItem(i18n("Wrap-up"), 20); + d->objectAttributeCB->insertItem(i18n("Press Release"), 21); + grid->addMultiCellWidget(d->objectAttributeCheck, 6, 6, 0, 0); + grid->addMultiCellWidget(d->objectAttributeCB, 6, 6, 1, 2); + grid->addMultiCellWidget(d->objectAttributeDescEdit, 7, 7, 0, 2); + QWhatsThis::add(d->objectAttributeCB, i18n("<p>Select here the editorial attribute of content.")); + QWhatsThis::add(d->objectAttributeDescEdit, i18n("<p>Set here the editorial attribute description of " + "content. This field is limited to 64 ASCII characters.")); + + // -------------------------------------------------------- + d->JobIDCheck = new QCheckBox(i18n("Job ID:"), parent); d->JobIDEdit = new KLineEdit(parent); d->JobIDEdit->setValidator(asciiValidator); d->JobIDEdit->setMaxLength(32); - grid->addMultiCellWidget(d->JobIDCheck, 5, 5, 0, 2); - grid->addMultiCellWidget(d->JobIDEdit, 6, 6, 0, 2); + grid->addMultiCellWidget(d->JobIDCheck, 8, 8, 0, 2); + grid->addMultiCellWidget(d->JobIDEdit, 9, 9, 0, 2); QWhatsThis::add(d->JobIDEdit, i18n("<p>Set here the string that identifies content that recurs. " "This field is limited to 32 ASCII characters.")); @@ -167,8 +206,8 @@ d->programEdit = new KLineEdit(parent); d->programEdit->setValidator(asciiValidator); d->programEdit->setMaxLength(32); - grid->addMultiCellWidget(d->programCheck, 7, 7, 0, 2); - grid->addMultiCellWidget(d->programEdit, 8, 8, 0, 2); + grid->addMultiCellWidget(d->programCheck, 10, 10, 0, 2); + grid->addMultiCellWidget(d->programEdit, 11, 11, 0, 2); QWhatsThis::add(d->programEdit, i18n("<p>Set here the content creation program name. " "This field is limited to 32 ASCII characters.")); @@ -178,8 +217,8 @@ d->programVersionEdit = new KLineEdit(parent); d->programVersionEdit->setValidator(asciiValidator); d->programVersionEdit->setMaxLength(10); - grid->addMultiCellWidget(d->programVersionCheck, 9, 9, 0, 2); - grid->addMultiCellWidget(d->programVersionEdit, 10, 10, 0, 0); + grid->addMultiCellWidget(d->programVersionCheck, 12, 12, 0, 2); + grid->addMultiCellWidget(d->programVersionEdit, 13, 13, 0, 0); QWhatsThis::add(d->programVersionEdit, i18n("<p>Set here the content creation program version. " "This field is limited to 10 ASCII characters.")); @@ -187,9 +226,9 @@ QLabel *iptcNote = new QLabel(i18n("<b>Note: IPTC text tags only support printable " "ASCII characters set.</b>"), parent); - grid->addMultiCellWidget(iptcNote, 11, 11, 0, 2); + grid->addMultiCellWidget(iptcNote, 14, 14, 0, 2); grid->setColStretch(2, 10); - grid->setRowStretch(12, 10); + grid->setRowStretch(14, 10); // -------------------------------------------------------- @@ -205,6 +244,12 @@ connect(d->objectTypeCheck, SIGNAL(toggled(bool)), d->objectTypeDescEdit, SLOT(setEnabled(bool))); + connect(d->objectAttributeCheck, SIGNAL(toggled(bool)), + d->objectAttributeCB, SLOT(setEnabled(bool))); + + connect(d->objectAttributeCheck, SIGNAL(toggled(bool)), + d->objectAttributeDescEdit, SLOT(setEnabled(bool))); + connect(d->statusCheck, SIGNAL(toggled(bool)), d->statusEdit, SLOT(setEnabled(bool))); @@ -247,7 +292,7 @@ QString typeSec = data.section(":", 0, 0); if (!typeSec.isEmpty()) { - int type = typeSec.toInt(); + int type = typeSec.toInt()-1; if (type < 3 && type >= 0) { d->objectTypeCB->setCurrentItem(type); @@ -259,6 +304,24 @@ d->objectTypeCB->setEnabled(d->objectTypeCheck->isChecked()); d->objectTypeDescEdit->setEnabled(d->objectTypeCheck->isChecked()); + data = exiv2Iface.getIptcTagString("Iptc.Application2.ObjectAttribute", false); + if (!data.isNull()) + { + QString attSec = data.section(":", 0, 0); + if (!attSec.isEmpty()) + { + int att = attSec.toInt()-1; + if (att < 21 && att >= 0) + { + d->objectAttributeCB->setCurrentItem(att); + d->objectAttributeDescEdit->setText(data.section(":", -1)); + d->objectAttributeCheck->setChecked(true); + } + } + } + d->objectAttributeCB->setEnabled(d->objectAttributeCheck->isChecked()); + d->objectAttributeDescEdit->setEnabled(d->objectAttributeCheck->isChecked()); + data = exiv2Iface.getIptcTagString("Iptc.Application2.FixtureId", false); if (!data.isNull()) { @@ -318,13 +381,24 @@ if (d->objectTypeCheck->isChecked()) { - QString objectType = QString("0%1:%2").arg(d->objectTypeCB->currentItem()) - .arg(d->objectTypeDescEdit->text()); + QString objectType; + objectType.sprintf("%2d", d->objectTypeCB->currentItem()+1); + objectType.append(QString(":%1").arg(d->objectTypeDescEdit->text())); exiv2Iface.setIptcTagString("Iptc.Application2.ObjectType", objectType); } else - exiv2Iface.removeIptcTag("Iptc.Application2.ObjectType"); + exiv2Iface.removeIptcTag("Iptc.Application2.ObjectAttribute"); + if (d->objectAttributeCheck->isChecked()) + { + QString objectAttribute; + objectAttribute.sprintf("%3d", d->objectAttributeCB->currentItem()+1); + objectAttribute.append(QString(":%1").arg(d->objectAttributeDescEdit->text())); + exiv2Iface.setIptcTagString("Iptc.Application2.ObjectAttribute", objectAttribute); + } + else + exiv2Iface.removeIptcTag("Iptc.Application2.ObjectAttribute"); + if (d->JobIDCheck->isChecked()) exiv2Iface.setIptcTagString("Iptc.Application2.FixtureId", d->JobIDEdit->text()); else
SVN commit 595975 by cgilles: kipi-plugins from trunk : MetadataEdit plugin : polish source code : set automaticly IPTC Program/version tags CCBUGS: 91812, 133276, 103255 M +7 -66 iptcstatus.cpp --- trunk/extragear/libs/kipi-plugins/metadataedit/iptcstatus.cpp #595974:595975 @@ -35,6 +35,7 @@ // Local includes. +#include "pluginsversion.h" #include "exiv2iface.h" #include "iptcstatus.h" #include "iptcstatus.moc" @@ -53,15 +54,11 @@ objectTypeCB = 0; statusEdit = 0; JobIDEdit = 0; - programEdit = 0; - programVersionEdit = 0; priorityCheck = 0; objectCycleCheck = 0; objectTypeCheck = 0; statusCheck = 0; JobIDCheck = 0; - programCheck = 0; - programVersionCheck = 0; } QCheckBox *priorityCheck; @@ -70,8 +67,6 @@ QCheckBox *objectAttributeCheck; QCheckBox *statusCheck; QCheckBox *JobIDCheck; - QCheckBox *programCheck; - QCheckBox *programVersionCheck; QComboBox *priorityCB; QComboBox *objectCycleCB; @@ -82,8 +77,6 @@ KLineEdit *objectTypeDescEdit; KLineEdit *objectAttributeDescEdit; KLineEdit *JobIDEdit; - KLineEdit *programEdit; - KLineEdit *programVersionEdit; }; IPTCStatus::IPTCStatus(QWidget* parent, QByteArray& iptcData) @@ -91,7 +84,7 @@ { d = new IPTCStatusPriv; - QGridLayout* grid = new QGridLayout(parent, 14, 2, KDialog::spacingHint()); + QGridLayout* grid = new QGridLayout(parent, 11, 2, KDialog::spacingHint()); // IPTC only accept printable Ascii char. QRegExp asciiRx("[\x20-\x7F]+$"); @@ -191,7 +184,7 @@ // -------------------------------------------------------- - d->JobIDCheck = new QCheckBox(i18n("Job ID:"), parent); + d->JobIDCheck = new QCheckBox(i18n("Job Identification:"), parent); d->JobIDEdit = new KLineEdit(parent); d->JobIDEdit->setValidator(asciiValidator); d->JobIDEdit->setMaxLength(32); @@ -202,33 +195,11 @@ // -------------------------------------------------------- - d->programCheck = new QCheckBox(i18n("Program:"), parent); - d->programEdit = new KLineEdit(parent); - d->programEdit->setValidator(asciiValidator); - d->programEdit->setMaxLength(32); - grid->addMultiCellWidget(d->programCheck, 10, 10, 0, 2); - grid->addMultiCellWidget(d->programEdit, 11, 11, 0, 2); - QWhatsThis::add(d->programEdit, i18n("<p>Set here the content creation program name. " - "This field is limited to 32 ASCII characters.")); - - // -------------------------------------------------------- - - d->programVersionCheck = new QCheckBox(i18n("Program Version:"), parent); - d->programVersionEdit = new KLineEdit(parent); - d->programVersionEdit->setValidator(asciiValidator); - d->programVersionEdit->setMaxLength(10); - grid->addMultiCellWidget(d->programVersionCheck, 12, 12, 0, 2); - grid->addMultiCellWidget(d->programVersionEdit, 13, 13, 0, 0); - QWhatsThis::add(d->programVersionEdit, i18n("<p>Set here the content creation program version. " - "This field is limited to 10 ASCII characters.")); - - // -------------------------------------------------------- - QLabel *iptcNote = new QLabel(i18n("<b>Note: IPTC text tags only support printable " "ASCII characters set.</b>"), parent); - grid->addMultiCellWidget(iptcNote, 14, 14, 0, 2); + grid->addMultiCellWidget(iptcNote, 10, 10, 0, 2); grid->setColStretch(2, 10); - grid->setRowStretch(14, 10); + grid->setRowStretch(11, 10); // -------------------------------------------------------- @@ -256,12 +227,6 @@ connect(d->JobIDCheck, SIGNAL(toggled(bool)), d->JobIDEdit, SLOT(setEnabled(bool))); - connect(d->programCheck, SIGNAL(toggled(bool)), - d->programEdit, SLOT(setEnabled(bool))); - - connect(d->programVersionCheck, SIGNAL(toggled(bool)), - d->programVersionEdit, SLOT(setEnabled(bool))); - // -------------------------------------------------------- readMetadata(iptcData); @@ -330,22 +295,6 @@ } d->JobIDEdit->setEnabled(d->JobIDCheck->isChecked()); - data = exiv2Iface.getIptcTagString("Iptc.Application2.Program", false); - if (!data.isNull()) - { - d->programEdit->setText(data); - d->programCheck->setChecked(true); - } - d->programEdit->setEnabled(d->programCheck->isChecked()); - - data = exiv2Iface.getIptcTagString("Iptc.Application2.ProgramVersion", false); - if (!data.isNull()) - { - d->programVersionEdit->setText(data); - d->programVersionCheck->setChecked(true); - } - d->programVersionEdit->setEnabled(d->programVersionCheck->isChecked()); - data = exiv2Iface.getIptcTagString("Iptc.Application2.Urgency", false); if (!data.isNull()) { @@ -404,16 +353,6 @@ else exiv2Iface.removeIptcTag("Iptc.Application2.FixtureId"); - if (d->programCheck->isChecked()) - exiv2Iface.setIptcTagString("Iptc.Application2.Program", d->programEdit->text()); - else - exiv2Iface.removeIptcTag("Iptc.Application2.Program"); - - if (d->programVersionCheck->isChecked()) - exiv2Iface.setIptcTagString("Iptc.Application2.ProgramVersion", d->programVersionEdit->text()); - else - exiv2Iface.removeIptcTag("Iptc.Application2.ProgramVersion"); - if (d->priorityCheck->isChecked()) exiv2Iface.setIptcTagString("Iptc.Application2.Urgency", QString::number(d->priorityCB->currentItem())); else @@ -439,6 +378,8 @@ else exiv2Iface.removeIptcTag("Iptc.Application2.ObjectCycle"); + exiv2Iface.setImageProgramId(QString("Kipi MetadataEdit"), QString(kipiplugins_version)); + iptcData = exiv2Iface.getIptc(); }
SVN commit 596354 by cgilles: kipiplugins from trunk : MetadataEdit plugin: IPTC Origin informations editor now support all country codes define by ISO-3166 norm. CCMAIL: kde-imaging@kde.org CCBUGS: 91812, 133276, 103255 M +340 -103 iptcorigin.cpp
Ok guys. Let's me resume the current implementation status about IPTC metadata management : - digiKam from trunk (next 0.9.0-beta3 release) store digiKam tags to IPTC keywords _AND_ can restore/create digiKam tags from IPTC keywords. - since digiKam 0.9.0-beta1, we have a full support of IPTC tags in album GUI and Editor using Exiv2 library. There is an IPTC viewer on right "Metadata" sidebar. - in kipi-plugins from trunk (next 0.1.3 release), Exiv2 library is used ined libkexif. A new plugin named "MetadataEdit" have been added to edit in single or Batch mode IPTC metadata. Look this blog entry for details: http://www.digikam.org/?q=node/148 Before to close this B.K.O file, i'm waiting your contructive comments. About the new plugin, please use the kipi-plugins B.K.O entry to make reports using "metadataedit" component. Thanks in advance Gilles Caulier
> > Before to close this B.K.O file, i'm waiting your contructive comments. Really impressive :) Of course I have some remarks (as always ;): - Main screen: Remove buttons are labeled "Remove...". Ellipsis is required only if button/menu entry opens new dialog with further input required. Here it is not the case, simple "Remove" will be enough. - Main screen: Remove action is strange. There is no way to know when this action was reverted or it is possible. If it is not possible warning would be appropriate - Main screen: not sure if wording "IPTC actions" would be understandable for all users. "IPTC information" IMO would be better. - General: better checking for non ASCII characters is needed, warning while applying, leaving section, whatever. Passive info in form of a note isn't enough. - General: some link(s) to info what are those all fields would be great thing. While pros probably know all those keywords by heart all newbies will be overwhelmed and will have problems with proper use of those new possibilities. Import of dictionary in Digikam is overkill but links to IPTC spec on-line would be nice touch. - General: placing of warning note in one place on all screens (bottom?) could be nice visual accent. - Keywords/Categories: First button is labeled "Add...". Ellipsis is required only if button/menu entry opens new dialog with further input required. Here it is not the case, simple "Add" will be enough. - Date & Time - first line "Date/Time created", should be "Creation date/time" or "Date/Time of creation". - Origin: Country - entries are ordered alphabetically according to three letter codes which are not common, better would be order them according to real names. Nitpicking: - General: Everywhere when checkboxes are used checkbox is highlighted when hovering on space outside of checkbox itself or label but when clicking nothing happens. Value of option is changed only when click was while hovering on checkbox or label. This is conflicting visual feedback - option should be changed each time when info about focus is given. Heh, checked few other places: this is general Qt/KDE problem :( - Date & Time - IMO for date would be better to use KDE date widget, but I understand there are some dependency considerations Wish: Move "Comments editor" functionality to this new plugin and allow to edit here also Digikam comments and other metadata not used by EXIF/IPTC. m.
>Really impressive :) Thanks > Of course I have some remarks (as always ;): It's not a problem if it's constructive (:=))) > - Main screen: Remove buttons are labeled "Remove...". Ellipsis is > required only if button/menu entry opens new dialog with further input > required. Here it is not the case, simple "Remove" will be enough. I will fix it. > - Main screen: Remove action is strange. There is no way to know when > this action was reverted or it is possible. If it is not possible > warning would be appropriate Right. Something is missing in listview, especially status. I will do it. > - Main screen: not sure if wording "IPTC actions" would be > understandable for all users. "IPTC information" IMO would be better. Not sure. I want a more large feedback about this point. > - General: better checking for non ASCII characters is needed, warning > while applying, leaving section, whatever. Passive info in form of > a note isn't enough. Ah. This is a complex problem. I will trying to do something. > - General: some link(s) to info what are those all fields would be great > thing. While pros probably know all those keywords by heart all > newbies will be overwhelmed and will have problems with proper use of > those new possibilities. Import of dictionary in Digikam is > overkill but links to IPTC spec on-line would be nice touch. Yes. I will fix it. > - General: placing of warning note in one place on all screens (bottom?) > could be nice visual accent. Already done by the Note on bottom... > - Keywords/Categories: First button is labeled "Add...". Ellipsis is > required only if button/menu entry opens new dialog with further input > required. Here it is not the case, simple "Add" will be enough. I will fix it. > - Date & Time - first line "Date/Time created", should be > "Creation date/time" or "Date/Time of creation". I will fix it. > - Origin: Country - entries are ordered alphabetically according to > three letter codes which are not common, better would be order them > according to real names. Ah. About this point i have take a look into main application with have an IPTC editor. Bibblepro and xnview work like this. > Nitpicking: > - General: Everywhere when checkboxes are used checkbox is highlighted > when hovering on space outside of checkbox itself or label but when > clicking nothing happens. Value of option is changed only when > click was while hovering on checkbox or label. This is conflicting > visual feedback - option should be changed each time when info about > focus is given. Heh, checked few other places: this is general Qt/KDE > problem :( This is a KDE theme problem on your computer. Here i cannot reproduce it. > - Date & Time - IMO for date would be better to use KDE date widget, but > I understand there are some dependency considerations I have tried to do something like that, but i'm a little bit tired (:=)) In TODO (:=))) > Wish: > Move "Comments editor" functionality to this new plugin and allow to > edit here also Digikam comments and other metadata not used by > EXIF/IPTC. Well, i have planned to add new plugin action to use it in single mode. Like this i can start IPTC editor dialog directly from a simple "edit" econ on the top of "Metadata" sidebar tab. Also a new menu entry can be add accordinly. This way will be the same with GPSSync plugin and Map location editor using Google maps. Gilles
> > - General: placing of warning note in one place on all screens > > (bottom?) could be nice visual accent. > > Already done by the Note on bottom... This is not always in the same place. But it is minor problem. > > - Origin: Country - entries are ordered alphabetically according to > > three letter codes which are not common, better would be order them > > according to real names. > > Ah. About this point i have take a look into main application with have > an IPTC editor. Bibblepro and xnview work like this. What Digikam inserts isn't important here. I am thinking primarily about navigation through menu. Order of countries in this list is different from order which is in 99% of such lists in Internet. That is my primary concern.
SVN commit 596690 by cgilles: kipiplugins from trunk : MetadataEdit plugin: fix IPTC editor i18n following Mikolaj Machowski tips. CCBUGS: 91812 M +1 -1 iptccategories.cpp M +2 -2 iptcdatetime.cpp M +1 -1 iptckeywords.cpp M +2 -2 metadataeditdialog.cpp --- trunk/extragear/libs/kipi-plugins/metadataedit/iptccategories.cpp #596689:596690 @@ -103,7 +103,7 @@ d->subCategoriesBox = new KListBox(parent); d->subCategoriesBox->setVScrollBarMode(QScrollView::AlwaysOn); - d->addSubCategoryButton = new QPushButton( i18n("&Add..."), parent); + d->addSubCategoryButton = new QPushButton( i18n("&Add"), parent); d->delSubCategoryButton = new QPushButton( i18n("&Delete"), parent); d->delSubCategoryButton->setEnabled(false); --- trunk/extragear/libs/kipi-plugins/metadataedit/iptcdatetime.cpp #596689:596690 @@ -97,8 +97,8 @@ // -------------------------------------------------------- - d->dateCreatedCheck = new QCheckBox(i18n("Date created"), parent); - d->timeCreatedCheck = new QCheckBox(i18n("Time created"), parent); + d->dateCreatedCheck = new QCheckBox(i18n("Creation date"), parent); + d->timeCreatedCheck = new QCheckBox(i18n("Creation time"), parent); d->dateCreatedSel = new KDateWidget(parent); d->timeCreatedSel = new KTimeWidget(parent); d->dateCreatedSel->setDate(QDate::currentDate()); --- trunk/extragear/libs/kipi-plugins/metadataedit/iptckeywords.cpp #596689:596690 @@ -92,7 +92,7 @@ d->keywordsBox = new KListBox(parent); d->keywordsBox->setVScrollBarMode(QScrollView::AlwaysOn); - d->addKeywordButton = new QPushButton( i18n("&Add..."), parent); + d->addKeywordButton = new QPushButton( i18n("&Add"), parent); d->delKeywordButton = new QPushButton( i18n("&Delete"), parent); d->delKeywordButton->setEnabled(false); --- trunk/extragear/libs/kipi-plugins/metadataedit/metadataeditdialog.cpp #596689:596690 @@ -132,7 +132,7 @@ QPushButton *editExifButton = new QPushButton(i18n("Edit..."), exifBox); QPushButton *loadExifButton = new QPushButton(i18n("Load..."), exifBox); - QPushButton *removeExifButton = new QPushButton(i18n("Remove..."), exifBox); + QPushButton *removeExifButton = new QPushButton(i18n("Remove"), exifBox); QWhatsThis::add(editExifButton, i18n("<p>Edit EXIF data of selected pictures from the list.")); QWhatsThis::add(loadExifButton, i18n("<p>Load EXIF data from a picture and set it to selected " @@ -151,7 +151,7 @@ QPushButton *editIptcButton = new QPushButton(i18n("Edit..."), iptcBox); QPushButton *loadIptcButton = new QPushButton(i18n("Load..."), iptcBox); - QPushButton *removeIptcButton = new QPushButton(i18n("Remove..."), iptcBox); + QPushButton *removeIptcButton = new QPushButton(i18n("Remove"), iptcBox); QWhatsThis::add(editIptcButton, i18n("<p>Edit IPTC data of selected pictures from the list.")); QWhatsThis::add(loadIptcButton, i18n("<p>Load IPTC data from a picture and set it to selected "
SVN commit 597975 by cgilles: kipi-plugins from trunk : MetadataEdit plugin : Finalize plugin BUG: 91812, 103255 M +17 -14 metadataitem.cpp --- trunk/extragear/libs/kipi-plugins/metadataedit/metadataitem.cpp #597974:597975 @@ -44,15 +44,17 @@ MetadataItemPriv() { - enabled = false; - dirty = false; - eraseExif = false; - eraseIptc = false; - readOnly = false; + enabled = false; + dirtyExif = false; + dirtyIptc = false; + eraseExif = false; + eraseIptc = false; + readOnly = false; } bool enabled; - bool dirty; + bool dirtyExif; + bool dirtyIptc; bool eraseExif; bool eraseIptc; bool readOnly; @@ -103,7 +105,7 @@ void MetadataItem::setExif(const QByteArray& exifData, bool dirty) { setEnabled(true); - d->dirty = dirty; + d->dirtyExif = dirty; d->exifData = exifData; d->eraseIptc = false; setText(2, hasExif() ? i18n("Yes") : i18n("No")); @@ -113,7 +115,7 @@ void MetadataItem::setIptc(const QByteArray& iptcData, bool dirty) { setEnabled(true); - d->dirty = dirty; + d->dirtyIptc = dirty; d->iptcData = iptcData; d->eraseIptc = false; setText(3, hasIptc() ? i18n("Yes") : i18n("No")); @@ -135,7 +137,7 @@ if (!isReadOnly()) { d->eraseExif = true; - d->dirty = true; + d->dirtyExif = true; setText(2, i18n("Removed!")); setText(4, i18n("Dirty!")); repaint(); @@ -147,7 +149,7 @@ if (!isReadOnly()) { d->eraseIptc = true; - d->dirty = true; + d->dirtyIptc = true; setText(3, i18n("Removed!")); setText(4, i18n("Dirty!")); repaint(); @@ -181,7 +183,7 @@ { ret &= exiv2Iface.clearExif(); } - else + else if (d->dirtyExif) { ret &= exiv2Iface.setExif(d->exifData); } @@ -190,7 +192,7 @@ { ret &= exiv2Iface.clearIptc(); } - else + else if (d->dirtyIptc) { ret &= exiv2Iface.setIptc(d->iptcData); } @@ -202,7 +204,8 @@ else setPixmap(1, SmallIcon("cancel")); - d->dirty = false; + d->dirtyExif = false; + d->dirtyIptc = false; } } @@ -219,7 +222,7 @@ bool MetadataItem::isDirty() { - return d->dirty; + return (d->dirtyExif || d->dirtyIptc); } bool MetadataItem::isReadOnly()