/* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2006-02-08 * Description : A tab to display camera item information * * Copyright (C) 2006-2008 by Gilles Caulier * * 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 #include #include #include #include #include #include #include #include // KDE includes. #include #include #include #include #include #include #include #include // Local includes. #include "ddebug.h" #include "dmetadata.h" #include "gpiteminfo.h" #include "navigatebarwidget.h" #include "cameraitempropertiestab.h" #include "cameraitempropertiestab.moc" namespace Digikam { class CameraItemPropertiesTabPriv { public: CameraItemPropertiesTabPriv() { title = 0; file = 0; folder = 0; date = 0; size = 0; isReadable = 0; isWritable = 0; mime = 0; dimensions = 0; newFileName = 0; downloaded = 0; settingsArea = 0; title2 = 0; make = 0; model = 0; photoDate = 0; aperture = 0; focalLength = 0; exposureTime = 0; sensitivity = 0; exposureMode = 0; flash = 0; whiteBalance = 0; labelFile = 0; labelFolder = 0; labelFileIsReadable = 0; labelFileIsWritable = 0; labelFileDate = 0; labelFileSize = 0; labelImageMime = 0; labelImageDimensions = 0; labelNewFileName = 0; labelAlreadyDownloaded = 0; labelPhotoMake = 0; labelPhotoModel = 0; labelPhotoDateTime = 0; labelPhotoAperture = 0; labelPhotoFocalLength = 0; labelPhotoExposureTime = 0; labelPhotoSensitivity = 0; labelPhotoExposureMode = 0; labelPhotoFlash = 0; labelPhotoWhiteBalance = 0; } TQLabel *title; TQLabel *file; TQLabel *folder; TQLabel *date; TQLabel *size; TQLabel *isReadable; TQLabel *isWritable; TQLabel *mime; TQLabel *dimensions; TQLabel *newFileName; TQLabel *downloaded; TQLabel *title2; TQLabel *make; TQLabel *model; TQLabel *photoDate; TQLabel *aperture; TQLabel *focalLength; TQLabel *exposureTime; TQLabel *sensitivity; TQLabel *exposureMode; TQLabel *flash; TQLabel *whiteBalance; TQFrame *settingsArea; KSqueezedTextLabel *labelFile; KSqueezedTextLabel *labelFolder; KSqueezedTextLabel *labelFileIsReadable; KSqueezedTextLabel *labelFileIsWritable; KSqueezedTextLabel *labelFileDate; KSqueezedTextLabel *labelFileSize; KSqueezedTextLabel *labelImageMime; KSqueezedTextLabel *labelImageDimensions; KSqueezedTextLabel *labelNewFileName; KSqueezedTextLabel *labelAlreadyDownloaded; KSqueezedTextLabel *labelPhotoMake; KSqueezedTextLabel *labelPhotoModel; KSqueezedTextLabel *labelPhotoDateTime; KSqueezedTextLabel *labelPhotoAperture; KSqueezedTextLabel *labelPhotoFocalLength; KSqueezedTextLabel *labelPhotoExposureTime; KSqueezedTextLabel *labelPhotoSensitivity; KSqueezedTextLabel *labelPhotoExposureMode; KSqueezedTextLabel *labelPhotoFlash; KSqueezedTextLabel *labelPhotoWhiteBalance; }; CameraItemPropertiesTab::CameraItemPropertiesTab(TQWidget* parent, bool navBar) : NavigateBarTab(parent) { d = new CameraItemPropertiesTabPriv; setupNavigateBar(navBar); TQScrollView *sv = new TQScrollView(this); sv->viewport()->setBackgroundMode(TQt::PaletteBackground); sv->setResizePolicy(TQScrollView::AutoOneFit); sv->setFrameStyle(TQFrame::NoFrame); d->settingsArea = new TQFrame(sv->viewport()); d->settingsArea->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken ); d->settingsArea->setLineWidth( style().pixelMetric(TQStyle::PM_DefaultFrameWidth, this) ); sv->addChild(d->settingsArea); m_navigateBarLayout->addWidget(sv); // -------------------------------------------------- TQGridLayout *settingsLayout = new TQGridLayout(d->settingsArea, 27, 1, KDialog::spacingHint(), 0); d->title = new TQLabel(i18n("Camera File Properties"), d->settingsArea); d->file = new TQLabel(i18n("File:"), d->settingsArea); d->folder = new TQLabel(i18n("Folder:"), d->settingsArea); d->date = new TQLabel(i18n("Date:"), d->settingsArea); d->size = new TQLabel(i18n("Size:"), d->settingsArea); d->isReadable = new TQLabel(i18n("Readable:"), d->settingsArea); d->isWritable = new TQLabel(i18n("Writable:"), d->settingsArea); d->mime = new TQLabel(i18n("Type:"), d->settingsArea); d->dimensions = new TQLabel(i18n("Dimensions:"), d->settingsArea); d->newFileName = new TQLabel(i18n("New Name:"), d->settingsArea); d->downloaded = new TQLabel(i18n("Downloaded:"), d->settingsArea); KSeparator *line = new KSeparator(TQt::Horizontal, d->settingsArea); d->title2 = new TQLabel(i18n("Photograph Properties"), d->settingsArea); d->make = new TQLabel(i18n("Make:"), d->settingsArea); d->model = new TQLabel(i18n("Model:"), d->settingsArea); d->photoDate = new TQLabel(i18n("Created:"), d->settingsArea); d->aperture = new TQLabel(i18n("Aperture:"), d->settingsArea); d->focalLength = new TQLabel(i18n("Focal:"), d->settingsArea); d->exposureTime = new TQLabel(i18n("Exposure:"), d->settingsArea); d->sensitivity = new TQLabel(i18n("Sensitivity:"), d->settingsArea); d->exposureMode = new TQLabel(i18n("Mode/Program:"), d->settingsArea); d->flash = new TQLabel(i18n("Flash:"), d->settingsArea); d->whiteBalance = new TQLabel(i18n("White balance:"), d->settingsArea); d->labelFile = new KSqueezedTextLabel(0, d->settingsArea); d->labelFolder = new KSqueezedTextLabel(0, d->settingsArea); d->labelFileDate = new KSqueezedTextLabel(0, d->settingsArea); d->labelFileSize = new KSqueezedTextLabel(0, d->settingsArea); d->labelFileIsReadable = new KSqueezedTextLabel(0, d->settingsArea); d->labelFileIsWritable = new KSqueezedTextLabel(0, d->settingsArea); d->labelImageMime = new KSqueezedTextLabel(0, d->settingsArea); d->labelImageDimensions = new KSqueezedTextLabel(0, d->settingsArea); d->labelNewFileName = new KSqueezedTextLabel(0, d->settingsArea); d->labelAlreadyDownloaded = new KSqueezedTextLabel(0, d->settingsArea); d->labelPhotoMake = new KSqueezedTextLabel(0, d->settingsArea); d->labelPhotoModel = new KSqueezedTextLabel(0, d->settingsArea); d->labelPhotoDateTime = new KSqueezedTextLabel(0, d->settingsArea); d->labelPhotoAperture = new KSqueezedTextLabel(0, d->settingsArea); d->labelPhotoFocalLength = new KSqueezedTextLabel(0, d->settingsArea); d->labelPhotoExposureTime = new KSqueezedTextLabel(0, d->settingsArea); d->labelPhotoSensitivity = new KSqueezedTextLabel(0, d->settingsArea); d->labelPhotoExposureMode = new KSqueezedTextLabel(0, d->settingsArea); d->labelPhotoFlash = new KSqueezedTextLabel(0, d->settingsArea); d->labelPhotoWhiteBalance = new KSqueezedTextLabel(0, d->settingsArea); int hgt = fontMetrics().height()-2; d->title->setAlignment(TQt::AlignCenter); d->file->setMaximumHeight(hgt); d->folder->setMaximumHeight(hgt); d->date->setMaximumHeight(hgt); d->size->setMaximumHeight(hgt); d->isReadable->setMaximumHeight(hgt); d->isWritable->setMaximumHeight(hgt); d->mime->setMaximumHeight(hgt); d->dimensions->setMaximumHeight(hgt); d->newFileName->setMaximumHeight(hgt); d->downloaded->setMaximumHeight(hgt); d->labelFile->setMaximumHeight(hgt); d->labelFolder->setMaximumHeight(hgt); d->labelFileDate->setMaximumHeight(hgt); d->labelFileSize->setMaximumHeight(hgt); d->labelFileIsReadable->setMaximumHeight(hgt); d->labelFileIsWritable->setMaximumHeight(hgt); d->labelImageMime->setMaximumHeight(hgt); d->labelImageDimensions->setMaximumHeight(hgt); d->labelNewFileName->setMaximumHeight(hgt); d->labelAlreadyDownloaded->setMaximumHeight(hgt); d->title2->setAlignment(TQt::AlignCenter); d->make->setMaximumHeight(hgt); d->model->setMaximumHeight(hgt); d->photoDate->setMaximumHeight(hgt); d->aperture->setMaximumHeight(hgt); d->focalLength->setMaximumHeight(hgt); d->exposureTime->setMaximumHeight(hgt); d->sensitivity->setMaximumHeight(hgt); d->exposureMode->setMaximumHeight(hgt); d->flash->setMaximumHeight(hgt); d->whiteBalance->setMaximumHeight(hgt); d->labelPhotoMake->setMaximumHeight(hgt); d->labelPhotoModel->setMaximumHeight(hgt); d->labelPhotoDateTime->setMaximumHeight(hgt); d->labelPhotoAperture->setMaximumHeight(hgt); d->labelPhotoFocalLength->setMaximumHeight(hgt); d->labelPhotoExposureTime->setMaximumHeight(hgt); d->labelPhotoSensitivity->setMaximumHeight(hgt); d->labelPhotoExposureMode->setMaximumHeight(hgt); d->labelPhotoFlash->setMaximumHeight(hgt); d->labelPhotoWhiteBalance->setMaximumHeight(hgt); // -------------------------------------------------- settingsLayout->addMultiCellWidget(d->title, 0, 0, 0, 1); settingsLayout->addMultiCell(new TQSpacerItem(KDialog::spacingHint(), KDialog::spacingHint(), TQSizePolicy::Minimum, TQSizePolicy::MinimumExpanding), 1, 1, 0, 1); settingsLayout->addMultiCellWidget(d->file, 2, 2, 0, 0); settingsLayout->addMultiCellWidget(d->labelFile, 2, 2, 1, 1); settingsLayout->addMultiCellWidget(d->folder, 3, 3, 0, 0); settingsLayout->addMultiCellWidget(d->labelFolder, 3, 3, 1, 1); settingsLayout->addMultiCellWidget(d->date, 4, 4, 0, 0); settingsLayout->addMultiCellWidget(d->labelFileDate, 4, 4, 1, 1); settingsLayout->addMultiCellWidget(d->size, 5, 5, 0, 0); settingsLayout->addMultiCellWidget(d->labelFileSize, 5, 5, 1, 1); settingsLayout->addMultiCellWidget(d->isReadable, 6, 6, 0, 0); settingsLayout->addMultiCellWidget(d->labelFileIsReadable, 6, 6, 1, 1); settingsLayout->addMultiCellWidget(d->isWritable, 7, 7, 0, 0); settingsLayout->addMultiCellWidget(d->labelFileIsWritable, 7, 7, 1, 1); settingsLayout->addMultiCellWidget(d->mime, 8, 8, 0, 0); settingsLayout->addMultiCellWidget(d->labelImageMime, 8, 8, 1, 1); settingsLayout->addMultiCellWidget(d->dimensions, 9, 9, 0, 0); settingsLayout->addMultiCellWidget(d->labelImageDimensions, 9, 9, 1, 1); settingsLayout->addMultiCellWidget(d->newFileName, 10, 10, 0, 0); settingsLayout->addMultiCellWidget(d->labelNewFileName, 10, 10, 1, 1); settingsLayout->addMultiCellWidget(d->downloaded, 11, 11, 0, 0); settingsLayout->addMultiCellWidget(d->labelAlreadyDownloaded, 11, 11, 1, 1); settingsLayout->addMultiCell(new TQSpacerItem(KDialog::spacingHint(), KDialog::spacingHint(), TQSizePolicy::Minimum, TQSizePolicy::MinimumExpanding), 12, 12, 0, 1); settingsLayout->addMultiCellWidget(line, 13, 13, 0, 1); settingsLayout->addMultiCell(new TQSpacerItem(KDialog::spacingHint(), KDialog::spacingHint(), TQSizePolicy::Minimum, TQSizePolicy::MinimumExpanding), 14, 14, 0, 1); settingsLayout->addMultiCellWidget(d->title2, 15, 15, 0, 1); settingsLayout->addMultiCell(new TQSpacerItem(KDialog::spacingHint(), KDialog::spacingHint(), TQSizePolicy::Minimum, TQSizePolicy::MinimumExpanding), 16, 16, 0, 1); settingsLayout->addMultiCellWidget(d->make, 17, 17, 0, 0); settingsLayout->addMultiCellWidget(d->labelPhotoMake, 17, 17, 1, 1); settingsLayout->addMultiCellWidget(d->model, 18, 18, 0, 0); settingsLayout->addMultiCellWidget(d->labelPhotoModel, 18, 18, 1, 1); settingsLayout->addMultiCellWidget(d->photoDate, 19, 19, 0, 0); settingsLayout->addMultiCellWidget(d->labelPhotoDateTime, 19, 19, 1, 1); settingsLayout->addMultiCellWidget(d->aperture, 20, 20, 0, 0); settingsLayout->addMultiCellWidget(d->labelPhotoAperture, 20, 20, 1, 1); settingsLayout->addMultiCellWidget(d->focalLength, 21, 21, 0, 0); settingsLayout->addMultiCellWidget(d->labelPhotoFocalLength, 21, 21, 1, 1); settingsLayout->addMultiCellWidget(d->exposureTime, 22, 22, 0, 0); settingsLayout->addMultiCellWidget(d->labelPhotoExposureTime, 22, 22, 1, 1); settingsLayout->addMultiCellWidget(d->sensitivity, 23, 23, 0, 0); settingsLayout->addMultiCellWidget(d->labelPhotoSensitivity, 23, 23, 1, 1); settingsLayout->addMultiCellWidget(d->exposureMode, 24, 24, 0, 0); settingsLayout->addMultiCellWidget(d->labelPhotoExposureMode, 24, 24, 1, 1); settingsLayout->addMultiCellWidget(d->flash, 25, 25, 0, 0); settingsLayout->addMultiCellWidget(d->labelPhotoFlash, 25, 25, 1, 1); settingsLayout->addMultiCellWidget(d->whiteBalance, 26, 26, 0, 0); settingsLayout->addMultiCellWidget(d->labelPhotoWhiteBalance, 26, 26, 1, 1); settingsLayout->setRowStretch(27, 10); settingsLayout->setColStretch(1, 10); } CameraItemPropertiesTab::~CameraItemPropertiesTab() { delete d; } void CameraItemPropertiesTab::setCurrentItem(const GPItemInfo* itemInfo, const TQString &newFileName, const TQByteArray& exifData, const KURL ¤tURL) { if (!itemInfo) { d->labelFile->setText(TQString()); d->labelFolder->setText(TQString()); d->labelFileIsReadable->setText(TQString()); d->labelFileIsWritable->setText(TQString()); d->labelFileDate->setText(TQString()); d->labelFileSize->setText(TQString()); d->labelImageMime->setText(TQString()); d->labelImageDimensions->setText(TQString()); d->labelNewFileName->setText(TQString()); d->labelAlreadyDownloaded->setText(TQString()); d->labelPhotoMake->setText(TQString()); d->labelPhotoModel->setText(TQString()); d->labelPhotoDateTime->setText(TQString()); d->labelPhotoAperture->setText(TQString()); d->labelPhotoFocalLength->setText(TQString()); d->labelPhotoExposureTime->setText(TQString()); d->labelPhotoSensitivity->setText(TQString()); d->labelPhotoExposureMode->setText(TQString()); d->labelPhotoFlash->setText(TQString()); d->labelPhotoWhiteBalance->setText(TQString()); setEnabled(false); return; } setEnabled(true); TQString str; TQString unknown(i18n("unknown")); // -- Camera file system information ------------------------------------------ d->labelFile->setText(itemInfo->name); d->labelFolder->setText(itemInfo->folder); if (itemInfo->readPermissions < 0) str = unknown; else if (itemInfo->readPermissions == 0) str = i18n("No"); else str = i18n("Yes"); d->labelFileIsReadable->setText(str); if (itemInfo->writePermissions < 0) str = unknown; else if (itemInfo->writePermissions == 0) str = i18n("No"); else str = i18n("Yes"); d->labelFileIsWritable->setText(str); TQDateTime date; date.setTime_t(itemInfo->mtime); d->labelFileDate->setText(TDEGlobal::locale()->formatDateTime(date, true, true)); str = i18n("%1 (%2)").arg(TDEIO::convertSize(itemInfo->size)) .arg(TDEGlobal::locale()->formatNumber(itemInfo->size, 0)); d->labelFileSize->setText(str); // -- Image Properties -------------------------------------------------- d->labelImageMime->setText( (itemInfo->mime == TQString("image/x-raw")) ? i18n("RAW Image") : KMimeType::mimeType(itemInfo->mime)->comment() ); TQString mpixels; TQSize dims; if (itemInfo->width == -1 && itemInfo->height == -1 && !currentURL.isEmpty()) { // delayed loading to list faster from UMSCamera if (itemInfo->mime == TQString("image/x-raw")) { DMetadata metaData(currentURL.path()); dims = metaData.getImageDimensions(); } else { KFileMetaInfo meta(currentURL.path()); if (meta.isValid()) { if (meta.containsGroup("Jpeg EXIF Data")) dims = meta.group("Jpeg EXIF Data").item("Dimensions").value().toSize(); else if (meta.containsGroup("General")) dims = meta.group("General").item("Dimensions").value().toSize(); else if (meta.containsGroup("Technical")) dims = meta.group("Technical").item("Dimensions").value().toSize(); } } } else { // if available (GPCamera), take dimensions directly from itemInfo dims = TQSize(itemInfo->width, itemInfo->height); } mpixels.setNum(dims.width()*dims.height()/1000000.0, 'f', 2); str = (!dims.isValid()) ? unknown : i18n("%1x%2 (%3Mpx)") .arg(dims.width()).arg(dims.height()).arg(mpixels); d->labelImageDimensions->setText(str); // -- Download information ------------------------------------------ d->labelNewFileName->setText(newFileName.isEmpty() ? i18n("unchanged") : newFileName); if (itemInfo->downloaded == GPItemInfo::DownloadUnknow) str = unknown; else if (itemInfo->downloaded == GPItemInfo::DownloadedYes) str = i18n("Yes"); else str = i18n("No"); d->labelAlreadyDownloaded->setText(str); // -- Photograph information ------------------------------------------ // NOTA: If something is changed here, please updated albumfiletip section too. TQString unavailable(i18n("unavailable")); DMetadata metaData; metaData.setExif(exifData); PhotoInfoContainer photoInfo = metaData.getPhotographInformations(); if (photoInfo.isEmpty()) { d->title2->hide(); d->make->hide(); d->model->hide(); d->photoDate->hide(); d->aperture->hide(); d->focalLength->hide(); d->exposureTime->hide(); d->sensitivity->hide(); d->exposureMode->hide(); d->flash->hide(); d->whiteBalance->hide(); d->labelPhotoMake->hide(); d->labelPhotoModel->hide(); d->labelPhotoDateTime->hide(); d->labelPhotoAperture->hide(); d->labelPhotoFocalLength->hide(); d->labelPhotoExposureTime->hide(); d->labelPhotoSensitivity->hide(); d->labelPhotoExposureMode->hide(); d->labelPhotoFlash->hide(); d->labelPhotoWhiteBalance->hide(); } else { d->title2->show(); d->make->show(); d->model->show(); d->photoDate->show(); d->aperture->show(); d->focalLength->show(); d->exposureTime->show(); d->sensitivity->show(); d->exposureMode->show(); d->flash->show(); d->whiteBalance->show(); d->labelPhotoMake->show(); d->labelPhotoModel->show(); d->labelPhotoDateTime->show(); d->labelPhotoAperture->show(); d->labelPhotoFocalLength->show(); d->labelPhotoExposureTime->show(); d->labelPhotoSensitivity->show(); d->labelPhotoExposureMode->show(); d->labelPhotoFlash->show(); d->labelPhotoWhiteBalance->show(); } d->labelPhotoMake->setText(photoInfo.make.isEmpty() ? unavailable : photoInfo.make); d->labelPhotoModel->setText(photoInfo.model.isEmpty() ? unavailable : photoInfo.model); if (photoInfo.dateTime.isValid()) { str = TDEGlobal::locale()->formatDateTime(photoInfo.dateTime, true, true); d->labelPhotoDateTime->setText(str); } else d->labelPhotoDateTime->setText(unavailable); d->labelPhotoAperture->setText(photoInfo.aperture.isEmpty() ? unavailable : photoInfo.aperture); if (photoInfo.focalLength35mm.isEmpty()) d->labelPhotoFocalLength->setText(photoInfo.focalLength.isEmpty() ? unavailable : photoInfo.focalLength); else { str = i18n("%1 (35mm: %2)").arg(photoInfo.focalLength).arg(photoInfo.focalLength35mm); d->labelPhotoFocalLength->setText(str); } d->labelPhotoExposureTime->setText(photoInfo.exposureTime.isEmpty() ? unavailable : photoInfo.exposureTime); d->labelPhotoSensitivity->setText(photoInfo.sensitivity.isEmpty() ? unavailable : i18n("%1 ISO").arg(photoInfo.sensitivity)); if (photoInfo.exposureMode.isEmpty() && photoInfo.exposureProgram.isEmpty()) d->labelPhotoExposureMode->setText(unavailable); else if (!photoInfo.exposureMode.isEmpty() && photoInfo.exposureProgram.isEmpty()) d->labelPhotoExposureMode->setText(photoInfo.exposureMode); else if (photoInfo.exposureMode.isEmpty() && !photoInfo.exposureProgram.isEmpty()) d->labelPhotoExposureMode->setText(photoInfo.exposureProgram); else { str = TQString("%1 / %2").arg(photoInfo.exposureMode).arg(photoInfo.exposureProgram); d->labelPhotoExposureMode->setText(str); } d->labelPhotoFlash->setText(photoInfo.flash.isEmpty() ? unavailable : photoInfo.flash); d->labelPhotoWhiteBalance->setText(photoInfo.whiteBalance.isEmpty() ? unavailable : photoInfo.whiteBalance); } } // NameSpace Digikam