summaryrefslogtreecommitdiffstats
path: root/kipi-plugins/metadataedit/iptceditdialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kipi-plugins/metadataedit/iptceditdialog.cpp')
-rw-r--r--kipi-plugins/metadataedit/iptceditdialog.cpp412
1 files changed, 412 insertions, 0 deletions
diff --git a/kipi-plugins/metadataedit/iptceditdialog.cpp b/kipi-plugins/metadataedit/iptceditdialog.cpp
new file mode 100644
index 0000000..4713aea
--- /dev/null
+++ b/kipi-plugins/metadataedit/iptceditdialog.cpp
@@ -0,0 +1,412 @@
+/* ============================================================
+ *
+ * This file is a part of kipi-plugins project
+ * http://www.kipi-plugins.org
+ *
+ * Date : 2006-10-12
+ * Description : a dialog to edit IPTC metadata
+ *
+ * Copyright (C) 2006-2007 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ *
+ * This program is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software Foundation;
+ * either version 2, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * ============================================================ */
+
+// Qt includes.
+
+#include <qtimer.h>
+#include <qframe.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+
+// KDE includes.
+
+#include <klocale.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <kapplication.h>
+#include <kmessagebox.h>
+#include <khelpmenu.h>
+#include <kpopupmenu.h>
+
+// LibKIPI includes.
+
+#include <libkipi/imagecollection.h>
+#include <libkipi/plugin.h>
+
+// LibKExiv2 includes.
+
+#include <libkexiv2/kexiv2.h>
+
+// Local includes.
+
+#include "kpaboutdata.h"
+#include "pluginsversion.h"
+#include "iptccaption.h"
+#include "iptccredits.h"
+#include "iptcstatus.h"
+#include "iptcorigin.h"
+#include "iptcdatetime.h"
+#include "iptckeywords.h"
+#include "iptcsubjects.h"
+#include "iptccategories.h"
+#include "iptceditdialog.h"
+#include "iptceditdialog.moc"
+
+namespace KIPIMetadataEditPlugin
+{
+
+class IPTCEditDialogDialogPrivate
+{
+
+public:
+
+ IPTCEditDialogDialogPrivate()
+ {
+ modified = false;
+ isReadOnly = false;
+ page_caption = 0;
+ page_datetime = 0;
+ page_subjects = 0;
+ page_keywords = 0;
+ page_categories = 0;
+ page_credits = 0;
+ page_status = 0;
+ page_origin = 0;
+
+ about = 0;
+
+ captionPage = 0;
+ datetimePage = 0;
+ subjectsPage = 0;
+ keywordsPage = 0;
+ categoriesPage = 0;
+ creditsPage = 0;
+ statusPage = 0;
+ originPage = 0;
+ }
+
+ bool modified;
+ bool isReadOnly;
+
+ QByteArray exifData;
+ QByteArray iptcData;
+
+ QFrame *page_caption;
+ QFrame *page_datetime;
+ QFrame *page_subjects;
+ QFrame *page_keywords;
+ QFrame *page_categories;
+ QFrame *page_credits;
+ QFrame *page_status;
+ QFrame *page_origin;
+
+ KURL::List urls;
+
+ KURL::List::iterator currItem;
+
+ IPTCCaption *captionPage;
+ IPTCDateTime *datetimePage;
+ IPTCSubjects *subjectsPage;
+ IPTCKeywords *keywordsPage;
+ IPTCCategories *categoriesPage;
+ IPTCCredits *creditsPage;
+ IPTCStatus *statusPage;
+ IPTCOrigin *originPage;
+
+ KIPI::Interface *interface;
+
+ KIPIPlugins::KPAboutData *about;
+};
+
+IPTCEditDialog::IPTCEditDialog(QWidget* parent, KURL::List urls, KIPI::Interface *iface)
+ : KDialogBase(IconList, QString::null,
+ urls.count() > 1 ? Help|User1|User2|Stretch|Ok|Apply|Close
+ : Help|Stretch|Ok|Apply|Close,
+ Ok, parent, 0, true, true,
+ KStdGuiItem::guiItem(KStdGuiItem::Forward),
+ KStdGuiItem::guiItem(KStdGuiItem::Back) )
+{
+ d = new IPTCEditDialogDialogPrivate;
+ d->urls = urls;
+ d->interface = iface;
+ d->currItem = d->urls.begin();
+
+ // ---------------------------------------------------------------
+
+ d->page_caption = addPage(i18n("Caption"), i18n("Caption Information"),
+ BarIcon("editclear", KIcon::SizeMedium));
+ d->captionPage = new IPTCCaption(d->page_caption);
+
+ d->page_datetime = addPage(i18n("Date & Time"), i18n("Date and Time Information"),
+ BarIcon("today", KIcon::SizeMedium));
+ d->datetimePage = new IPTCDateTime(d->page_datetime);
+
+ d->page_subjects = addPage(i18n("Subjects"), i18n("Subjects Information"),
+ BarIcon("cookie", KIcon::SizeMedium));
+ d->subjectsPage = new IPTCSubjects(d->page_subjects);
+
+ d->page_keywords = addPage(i18n("Keywords"), i18n("Keywords Information"),
+ BarIcon("bookmark", KIcon::SizeMedium));
+ d->keywordsPage = new IPTCKeywords(d->page_keywords);
+
+ d->page_categories = addPage(i18n("Categories"), i18n("Categories Information"),
+ BarIcon("bookmark_folder", KIcon::SizeMedium));
+ d->categoriesPage = new IPTCCategories(d->page_categories);
+
+ d->page_credits = addPage(i18n("Credits"), i18n("Credits Information"),
+ BarIcon("identity", KIcon::SizeMedium));
+ d->creditsPage = new IPTCCredits(d->page_credits);
+
+ d->page_status = addPage(i18n("Status"), i18n("Status Information"),
+ BarIcon("messagebox_info", KIcon::SizeMedium));
+ d->statusPage = new IPTCStatus(d->page_status);
+
+ d->page_origin = addPage(i18n("Origin"), i18n("Origin Information"),
+ BarIcon("www", KIcon::SizeMedium));
+ d->originPage = new IPTCOrigin(d->page_origin);
+
+ // ---------------------------------------------------------------
+ // About data and help button.
+
+ d->about = new KIPIPlugins::KPAboutData(I18N_NOOP("Edit Metadata"),
+ 0,
+ KAboutData::License_GPL,
+ I18N_NOOP("A Plugin to edit image metadata"),
+ "(c) 2006-2008, Gilles Caulier");
+
+ d->about->addAuthor("Gilles Caulier", I18N_NOOP("Author and Maintainer"),
+ "caulier dot gilles at gmail dot com");
+
+ KHelpMenu* helpMenu = new KHelpMenu(this, d->about, false);
+ helpMenu->menu()->removeItemAt(0);
+ helpMenu->menu()->insertItem(i18n("Plugin Handbook"),
+ this, SLOT(slotHelp()), 0, -1, 0);
+ actionButton(Help)->setPopup( helpMenu->menu() );
+
+ // ------------------------------------------------------------
+
+ connect(d->captionPage, SIGNAL(signalModified()),
+ this, SLOT(slotModified()));
+
+ connect(d->datetimePage, SIGNAL(signalModified()),
+ this, SLOT(slotModified()));
+
+ connect(d->subjectsPage, SIGNAL(signalModified()),
+ this, SLOT(slotModified()));
+
+ connect(d->keywordsPage, SIGNAL(signalModified()),
+ this, SLOT(slotModified()));
+
+ connect(d->categoriesPage, SIGNAL(signalModified()),
+ this, SLOT(slotModified()));
+
+ connect(d->creditsPage, SIGNAL(signalModified()),
+ this, SLOT(slotModified()));
+
+ connect(d->statusPage, SIGNAL(signalModified()),
+ this, SLOT(slotModified()));
+
+ connect(d->originPage, SIGNAL(signalModified()),
+ this, SLOT(slotModified()));
+
+ // ------------------------------------------------------------
+
+ readSettings();
+ slotItemChanged();
+}
+
+IPTCEditDialog::~IPTCEditDialog()
+{
+ delete d->about;
+ delete d;
+}
+
+void IPTCEditDialog::slotHelp()
+{
+ KApplication::kApplication()->invokeHelp("metadataedit", "kipi-plugins");
+}
+
+void IPTCEditDialog::closeEvent(QCloseEvent *e)
+{
+ if (!e) return;
+ saveSettings();
+ e->accept();
+}
+
+void IPTCEditDialog::slotClose()
+{
+ saveSettings();
+ KDialogBase::slotClose();
+}
+
+void IPTCEditDialog::readSettings()
+{
+ KConfig config("kipirc");
+ config.setGroup("Metadata Edit Settings");
+ showPage(config.readNumEntry("IPTC Edit Page", 0));
+ d->captionPage->setCheckedSyncJFIFComment(config.readBoolEntry("Sync JFIF Comment", true));
+ d->captionPage->setCheckedSyncHOSTComment(config.readBoolEntry("Sync Host Comment", true));
+ d->captionPage->setCheckedSyncEXIFComment(config.readBoolEntry("Sync EXIF Comment", true));
+ d->datetimePage->setCheckedSyncHOSTDate(config.readBoolEntry("Sync Host Date", true));
+ d->datetimePage->setCheckedSyncEXIFDate(config.readBoolEntry("Sync EXIF Date", true));
+ resize(configDialogSize(config, QString("IPTC Edit Dialog")));
+}
+
+void IPTCEditDialog::saveSettings()
+{
+ KConfig config("kipirc");
+ config.setGroup("Metadata Edit Settings");
+ config.writeEntry("IPTC Edit Page", activePageIndex());
+ config.writeEntry("Sync JFIF Comment", d->captionPage->syncJFIFCommentIsChecked());
+ config.writeEntry("Sync Host Comment", d->captionPage->syncHOSTCommentIsChecked());
+ config.writeEntry("Sync EXIF Comment", d->captionPage->syncEXIFCommentIsChecked());
+ config.writeEntry("Sync Host Date", d->datetimePage->syncHOSTDateIsChecked());
+ config.writeEntry("Sync EXIF Date", d->datetimePage->syncEXIFDateIsChecked());
+ saveDialogSize(config, QString("IPTC Edit Dialog"));
+ config.sync();
+}
+
+void IPTCEditDialog::slotItemChanged()
+{
+ KExiv2Iface::KExiv2 exiv2Iface;
+ exiv2Iface.load((*d->currItem).path());
+ d->exifData = exiv2Iface.getExif();
+ d->iptcData = exiv2Iface.getIptc();
+ d->captionPage->readMetadata(d->iptcData);
+ d->datetimePage->readMetadata(d->iptcData);
+ d->subjectsPage->readMetadata(d->iptcData);
+ d->keywordsPage->readMetadata(d->iptcData);
+ d->categoriesPage->readMetadata(d->iptcData);
+ d->creditsPage->readMetadata(d->iptcData);
+ d->statusPage->readMetadata(d->iptcData);
+ d->originPage->readMetadata(d->iptcData);
+
+ d->isReadOnly = KExiv2Iface::KExiv2::isReadOnly((*d->currItem).path());
+ d->page_caption->setEnabled(!d->isReadOnly);
+ d->page_datetime->setEnabled(!d->isReadOnly);
+ d->page_subjects->setEnabled(!d->isReadOnly);
+ d->page_keywords->setEnabled(!d->isReadOnly);
+ d->page_categories->setEnabled(!d->isReadOnly);
+ d->page_credits->setEnabled(!d->isReadOnly);
+ d->page_status->setEnabled(!d->isReadOnly);
+ d->page_origin->setEnabled(!d->isReadOnly);
+ enableButton(Apply, !d->isReadOnly);
+
+ setCaption(QString("%1 (%2/%3) - %4")
+ .arg((*d->currItem).filename())
+ .arg(d->urls.findIndex(*(d->currItem))+1)
+ .arg(d->urls.count())
+ .arg(i18n("Edit IPTC Metadata")) +
+ (d->isReadOnly ? QString(" - ") + i18n("(read only)") : QString::null));
+ enableButton(User1, *(d->currItem) != d->urls.last());
+ enableButton(User2, *(d->currItem) != d->urls.first());
+ enableButton(Apply, false);
+}
+
+void IPTCEditDialog::slotApply()
+{
+ if (d->modified && !d->isReadOnly)
+ {
+ KIPI::ImageInfo info = d->interface->info(*d->currItem);
+
+ if (d->captionPage->syncHOSTCommentIsChecked())
+ {
+ info.setDescription(d->captionPage->getIPTCCaption());
+ }
+ d->captionPage->applyMetadata(d->exifData, d->iptcData);
+
+ if (d->datetimePage->syncHOSTDateIsChecked())
+ {
+ info.setTime(d->datetimePage->getIPTCCreationDate());
+ }
+ d->datetimePage->applyMetadata(d->exifData, d->iptcData);
+
+ d->subjectsPage->applyMetadata(d->iptcData);
+ d->keywordsPage->applyMetadata(d->iptcData);
+ d->categoriesPage->applyMetadata(d->iptcData);
+ d->creditsPage->applyMetadata(d->iptcData);
+ d->statusPage->applyMetadata(d->iptcData);
+ d->originPage->applyMetadata(d->iptcData);
+ KExiv2Iface::KExiv2 exiv2Iface;
+ exiv2Iface.load((*d->currItem).path());
+ exiv2Iface.setExif(d->exifData);
+ exiv2Iface.setIptc(d->iptcData);
+ exiv2Iface.save((*d->currItem).path());
+ d->modified = false;
+ }
+}
+
+void IPTCEditDialog::slotUser1()
+{
+ slotApply();
+ d->currItem++;
+ slotItemChanged();
+}
+
+void IPTCEditDialog::slotUser2()
+{
+ slotApply();
+ d->currItem--;
+ slotItemChanged();
+}
+
+void IPTCEditDialog::slotModified()
+{
+ if (!d->isReadOnly)
+ {
+ enableButton(Apply, true);
+ d->modified = true;
+ }
+}
+
+void IPTCEditDialog::slotOk()
+{
+ slotApply();
+ saveSettings();
+ accept();
+}
+
+bool IPTCEditDialog::eventFilter(QObject *, QEvent *e)
+{
+ if ( e->type() == QEvent::KeyPress )
+ {
+ QKeyEvent *k = (QKeyEvent *)e;
+
+ if (k->state() == Qt::ControlButton &&
+ (k->key() == Qt::Key_Enter || k->key() == Qt::Key_Return))
+ {
+ slotApply();
+
+ if (actionButton(User1)->isEnabled())
+ slotUser1();
+
+ return true;
+ }
+ else if (k->state() == Qt::ShiftButton &&
+ (k->key() == Qt::Key_Enter || k->key() == Qt::Key_Return))
+ {
+ slotApply();
+
+ if (actionButton(User2)->isEnabled())
+ slotUser2();
+
+ return true;
+ }
+
+ return false;
+ }
+
+ return false;
+}
+
+} // namespace KIPIMetadataEditPlugin