diff options
Diffstat (limited to 'src/libs/dialogs/imagedialog.cpp')
-rw-r--r-- | src/libs/dialogs/imagedialog.cpp | 366 |
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 |