summaryrefslogtreecommitdiffstats
path: root/src/libs/dialogs/imagedialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/dialogs/imagedialog.cpp')
-rw-r--r--src/libs/dialogs/imagedialog.cpp366
1 files changed, 366 insertions, 0 deletions
diff --git a/src/libs/dialogs/imagedialog.cpp b/src/libs/dialogs/imagedialog.cpp
new file mode 100644
index 00000000..d052a2af
--- /dev/null
+++ b/src/libs/dialogs/imagedialog.cpp
@@ -0,0 +1,366 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date : 2008-03-13
+ * Description : image files selector dialog.
+ *
+ * Copyright (C) 2008 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.
+ *
+ * ============================================================ */
+
+// TQt includes.
+
+#include <tqlabel.h>
+#include <tqlayout.h>
+#include <tqguardedptr.h>
+#include <tqtimer.h>
+
+// KDE includes.
+
+#include <tdeapplication.h>
+#include <tdelocale.h>
+#include <kstandarddirs.h>
+#include <tdefiledialog.h>
+#include <kimageio.h>
+#include <kiconloader.h>
+
+// LibKDcraw includes.
+
+#include <libkdcraw/version.h>
+#include <libkdcraw/kdcraw.h>
+
+#if KDCRAW_VERSION < 0x000106
+#include <libkdcraw/dcrawbinary.h>
+#endif
+
+// Local includes.
+
+#include "ddebug.h"
+#include "dmetadata.h"
+#include "thumbnailsize.h"
+#include "thumbnailjob.h"
+#include "imagedialog.h"
+#include "imagedialog.moc"
+
+namespace Digikam
+{
+
+class ImageDialogPreviewPrivate
+{
+
+public:
+
+ ImageDialogPreviewPrivate()
+ {
+ imageLabel = 0;
+ infoLabel = 0;
+ thumbJob = 0;
+ timer = 0;
+ }
+
+ TQTimer *timer;
+
+ TQLabel *imageLabel;
+ TQLabel *infoLabel;
+
+ KURL currentURL;
+
+ DMetadata metaIface;
+
+ TQGuardedPtr<ThumbnailJob> thumbJob;
+};
+
+ImageDialogPreview::ImageDialogPreview(TQWidget *parent)
+ : KPreviewWidgetBase(parent)
+{
+ d = new ImageDialogPreviewPrivate;
+
+ TQVBoxLayout *vlay = new TQVBoxLayout(this);
+ d->imageLabel = new TQLabel(this);
+ d->imageLabel->setAlignment(TQt::AlignHCenter | TQt::AlignVCenter);
+ d->imageLabel->setSizePolicy(TQSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Expanding));
+
+ d->infoLabel = new TQLabel(this);
+
+ vlay->setMargin(0);
+ vlay->setSpacing(KDialog::spacingHint());
+ vlay->addWidget(d->imageLabel);
+ vlay->addWidget(d->infoLabel);
+
+ setSupportedMimeTypes(KImageIO::mimeTypes());
+
+ d->timer = new TQTimer(this);
+
+ connect(d->timer, TQ_SIGNAL(timeout()),
+ this, TQ_SLOT(showPreview()) );
+}
+
+ImageDialogPreview::~ImageDialogPreview()
+{
+ if (!d->thumbJob.isNull())
+ {
+ d->thumbJob->kill();
+ d->thumbJob = 0;
+ }
+ delete d;
+}
+
+TQSize ImageDialogPreview::sizeHint() const
+{
+ return TQSize(256, 256);
+}
+
+void ImageDialogPreview::resizeEvent(TQResizeEvent *)
+{
+ d->timer->start(100, true);
+}
+
+void ImageDialogPreview::showPreview()
+{
+ KURL url(d->currentURL);
+ clearPreview();
+ showPreview(url);
+}
+
+void ImageDialogPreview::showPreview(const KURL& url)
+{
+ if (!url.isValid())
+ {
+ clearPreview();
+ return;
+ }
+
+ if (url != d->currentURL)
+ {
+ clearPreview();
+ d->currentURL = url;
+
+ if (!d->thumbJob.isNull())
+ {
+ d->thumbJob->kill();
+ d->thumbJob = 0;
+ }
+
+ d->thumbJob = new ThumbnailJob(url, ThumbnailSize::Huge, true, true);
+
+ connect(d->thumbJob, TQ_SIGNAL(signalThumbnail(const KURL&, const TQPixmap&)),
+ this, TQ_SLOT(slotGotThumbnail(const KURL&, const TQPixmap&)));
+
+ connect(d->thumbJob, TQ_SIGNAL(signalFailed(const KURL&)),
+ this, TQ_SLOT(slotFailedThumbnail(const KURL&)));
+
+ d->metaIface.load(d->currentURL.path());
+ PhotoInfoContainer info = d->metaIface.getPhotographInformations();
+ if (!info.isEmpty())
+ {
+ TQString identify;
+ TQString make, model, dateTime, aperture, focalLength, exposureTime, sensitivity;
+ TQString unavailable(i18n("<i>unavailable</i>"));
+ TQString cellBeg("<tr><td><nobr><font size=-1>");
+ TQString cellMid("</font></nobr></td><td><nobr><font size=-1>");
+ TQString cellEnd("</font></nobr></td></tr>");
+
+ if (info.make.isEmpty()) make = unavailable;
+ else make = info.make;
+
+ if (info.model.isEmpty()) model = unavailable;
+ else model = info.model;
+
+ if (!info.dateTime.isValid()) dateTime = unavailable;
+ else dateTime = TDEGlobal::locale()->formatDateTime(info.dateTime, true, true);
+
+ if (info.aperture.isEmpty()) aperture = unavailable;
+ else aperture = info.aperture;
+
+ if (info.focalLength.isEmpty()) focalLength = unavailable;
+ else focalLength = info.focalLength;
+
+ if (info.exposureTime.isEmpty()) exposureTime = unavailable;
+ else exposureTime = info.exposureTime;
+
+ if (info.sensitivity.isEmpty()) sensitivity = unavailable;
+ else sensitivity = i18n("%1 ISO").arg(info.sensitivity);
+
+ identify = "<table cellspacing=0 cellpadding=0>";
+ identify += cellBeg + i18n("Make:") + cellMid + make + cellEnd;
+ identify += cellBeg + i18n("Model:") + cellMid + model + cellEnd;
+ identify += cellBeg + i18n("Created:") + cellMid + dateTime + cellEnd;
+ identify += cellBeg + i18n("Aperture:") + cellMid + aperture + cellEnd;
+ identify += cellBeg + i18n("Focal:") + cellMid + focalLength + cellEnd;
+ identify += cellBeg + i18n("Exposure:") + cellMid + exposureTime + cellEnd;
+ identify += cellBeg + i18n("Sensitivity:") + cellMid + sensitivity + cellEnd;
+ identify += "</table>";
+
+ d->infoLabel->setText(identify);
+ }
+ else
+ d->infoLabel->clear();
+ }
+}
+
+void ImageDialogPreview::slotGotThumbnail(const KURL& url, const TQPixmap& pix)
+{
+ if (url == d->currentURL)
+ {
+ TQPixmap pixmap;
+ TQSize s = d->imageLabel->contentsRect().size();
+
+ if (s.width() < pix.width() || s.height() < pix.height())
+ pixmap = pix.convertToImage().smoothScale(s, TQImage::ScaleMin);
+ else
+ pixmap = pix;
+
+ d->imageLabel->setPixmap(pixmap);
+ }
+}
+
+void ImageDialogPreview::slotFailedThumbnail(const KURL& /*url*/)
+{
+ TDEIconLoader* iconLoader = TDEApplication::kApplication()->iconLoader();
+ d->imageLabel->setPixmap(iconLoader->loadIcon("image-x-generic", TDEIcon::NoGroup, 128,
+ TDEIcon::DefaultState, 0, true));
+}
+
+void ImageDialogPreview::clearPreview()
+{
+ d->imageLabel->clear();
+ d->infoLabel->clear();
+ d->currentURL = KURL();
+}
+
+// ------------------------------------------------------------------------
+
+class ImageDialogPrivate
+{
+
+public:
+
+ ImageDialogPrivate()
+ {
+ singleSelect = false;
+ }
+
+ bool singleSelect;
+
+ TQString fileformats;
+
+ KURL url;
+ KURL::List urls;
+};
+
+ImageDialog::ImageDialog(TQWidget* parent, const KURL &url, bool singleSelect, const TQString& caption)
+{
+ d = new ImageDialogPrivate;
+ d->singleSelect = singleSelect;
+
+ TQStringList patternList = TQStringList::split('\n', KImageIO::pattern(KImageIO::Reading));
+
+ // All Images from list must been always the first entry given by KDE API
+ TQString allPictures = patternList[0];
+
+#if KDCRAW_VERSION < 0x000106
+ // Add other files format witch are missing to All Images" type mime provided by KDE and remplace current.
+ if (KDcrawIface::DcrawBinary::instance()->versionIsRight())
+ {
+ allPictures.insert(allPictures.find("|"), TQString(KDcrawIface::DcrawBinary::instance()->rawFiles()) + TQString(" *.JPE *.TIF"));
+ patternList.remove(patternList[0]);
+ patternList.prepend(allPictures);
+ // Added RAW file formats supported by dcraw program like a type mime.
+ // Nota: we cannot use here "image/x-raw" type mime from KDE because it uncomplete
+ // or unavailable (see file #121242 in B.K.O).
+ patternList.append(i18n("\n%1|Camera RAW files").arg(TQString(KDcrawIface::DcrawBinary::instance()->rawFiles())));
+ }
+#else
+ allPictures.insert(allPictures.find("|"), TQString(KDcrawIface::KDcraw::rawFiles()) + TQString(" *.JPE *.TIF"));
+ patternList.remove(patternList[0]);
+ patternList.prepend(allPictures);
+ // Added RAW file formats supported by dcraw program like a type mime.
+ // Nota: we cannot use here "image/x-raw" type mime from KDE because it uncomplete
+ // or unavailable (see file #121242 in B.K.O).
+ patternList.append(i18n("\n%1|Camera RAW files").arg(TQString(KDcrawIface::KDcraw::rawFiles())));
+#endif
+
+ d->fileformats = patternList.join("\n");
+
+ DDebug() << "fileformats=" << d->fileformats << endl;
+
+ KFileDialog dlg(url.path(), d->fileformats, parent, "imageFileOpenDialog", false);
+ ImageDialogPreview *preview = new ImageDialogPreview(&dlg);
+ dlg.setPreviewWidget(preview);
+ dlg.setOperationMode(KFileDialog::Opening);
+
+ if (d->singleSelect)
+ {
+ dlg.setMode(KFile::File);
+ if (caption.isEmpty()) dlg.setCaption(i18n("Select an Image"));
+ else dlg.setCaption(caption);
+ dlg.exec();
+ d->url = dlg.selectedURL();
+ }
+ else
+ {
+ dlg.setMode(KFile::Files);
+ if (caption.isEmpty()) dlg.setCaption(i18n("Select Images"));
+ else dlg.setCaption(caption);
+ dlg.exec();
+ d->urls = dlg.selectedURLs();
+ }
+}
+
+ImageDialog::~ImageDialog()
+{
+ delete d;
+}
+
+bool ImageDialog::singleSelect() const
+{
+ return d->singleSelect;
+}
+
+TQString ImageDialog::fileformats() const
+{
+ return d->fileformats;
+}
+
+KURL ImageDialog::url() const
+{
+ return d->url;
+}
+
+KURL::List ImageDialog::urls() const
+{
+ return d->urls;
+}
+
+KURL::List ImageDialog::getImageURLs(TQWidget* parent, const KURL& url, const TQString& caption)
+{
+ ImageDialog dlg(parent, url, false, caption);
+ if (!dlg.urls().isEmpty())
+ return dlg.urls();
+ else
+ return KURL::List();
+}
+
+KURL ImageDialog::getImageURL(TQWidget* parent, const KURL& url, const TQString& caption)
+{
+ ImageDialog dlg(parent, url, true, caption);
+ if (dlg.url() != KURL())
+ return dlg.url();
+ else
+ return KURL();
+}
+
+} // namespace Digikam