diff --git a/core/app/views/tableview/tableview_column_configuration_dialog.cpp b/core/app/views/tableview/tableview_column_configuration_dialog.cpp index cb74f60fff..72a43dbf56 100644 --- a/core/app/views/tableview/tableview_column_configuration_dialog.cpp +++ b/core/app/views/tableview/tableview_column_configuration_dialog.cpp @@ -1,121 +1,123 @@ /* ============================================================ * * This file is a part of digiKam project * https://www.digikam.org * * Date : 2013-03-02 * Description : Table view: Column configuration dialog * - * Copyright (C) 2013 by Michael G. Hansen + * Copyright (C) 2017-2020 by Gilles Caulier + * Copyright (C) 2013 by Michael G. Hansen * * 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. * * ============================================================ */ #include "tableview_column_configuration_dialog.h" // Qt includes #include #include #include // KDE includes #include // Local includes #include "tableview_columnfactory.h" #include "tableview_model.h" #include "tableview_selection_model_syncer.h" #include "thumbnailloadthread.h" #include "digikam_debug.h" namespace Digikam { class ItemAlbumModel; class ItemFilterModel; class Q_DECL_HIDDEN TableViewConfigurationDialog::Private { public: explicit Private() : columnIndex(0), buttons(nullptr), columnObject(nullptr), columnConfigurationWidget(nullptr) { } int columnIndex; QDialogButtonBox* buttons; TableViewColumn* columnObject; TableViewColumnConfigurationWidget* columnConfigurationWidget; }; TableViewConfigurationDialog::TableViewConfigurationDialog(TableViewShared* const sharedObject, const int columnIndex, QWidget* const parentWidget) : QDialog(parentWidget), d(new Private()), s(sharedObject) { d->columnIndex = columnIndex; d->columnObject = s->tableViewModel->getColumnObject(d->columnIndex); d->columnConfigurationWidget = d->columnObject->getConfigurationWidget(this); if (d->columnObject) { setWindowTitle(i18n("Configure column \"%1\"", d->columnObject->getTitle())); } else { qCWarning(DIGIKAM_GENERAL_LOG) << "Column object from TableView is null"; } - d->buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); + d->buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); d->buttons->button(QDialogButtonBox::Ok)->setDefault(true); QVBoxLayout* const vbx = new QVBoxLayout(this); vbx->addWidget(d->columnConfigurationWidget); vbx->addWidget(d->buttons); setLayout(vbx); connect(d->buttons->button(QDialogButtonBox::Ok), SIGNAL(clicked()), this, SLOT(accept())); connect(d->buttons->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); } TableViewConfigurationDialog::~TableViewConfigurationDialog() { } TableViewColumnConfiguration TableViewConfigurationDialog::getNewConfiguration() const { if (d->columnConfigurationWidget) { return d->columnConfigurationWidget->getNewConfiguration(); } else { qCWarning(DIGIKAM_GENERAL_LOG) << "Configuration widget from TableView is null"; + return TableViewColumnConfiguration(); } } } // namespace Digikam diff --git a/core/app/views/tableview/tableview_column_configuration_dialog.h b/core/app/views/tableview/tableview_column_configuration_dialog.h index f5f25dce13..4884fdebda 100644 --- a/core/app/views/tableview/tableview_column_configuration_dialog.h +++ b/core/app/views/tableview/tableview_column_configuration_dialog.h @@ -1,61 +1,65 @@ /* ============================================================ * * This file is a part of digiKam project * https://www.digikam.org * * Date : 2013-03-02 * Description : Table view: Column cpp dialog * - * Copyright (C) 2013 by Michael G. Hansen + * Copyright (C) 2017-2020 by Gilles Caulier + * Copyright (C) 2013 by Michael G. Hansen * * 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. * * ============================================================ */ #ifndef DIGIKAM_TABLE_VIEW_COLUMN_CONFIGURATION_DIALOG_H #define DIGIKAM_TABLE_VIEW_COLUMN_CONFIGURATION_DIALOG_H // KDE includes #include // Local includes #include "tableview_columnfactory.h" #include "tableview_shared.h" class QMenu; class QContextMenuEvent; namespace Digikam { class TableViewConfigurationDialog : public QDialog { Q_OBJECT public: - explicit TableViewConfigurationDialog(TableViewShared* const sharedObject, const int columnIndex, QWidget* const parentWidget); + explicit TableViewConfigurationDialog(TableViewShared* const sharedObject, + const int columnIndex, + QWidget* const parentWidget); virtual ~TableViewConfigurationDialog(); TableViewColumnConfiguration getNewConfiguration() const; private: class Private; + const QScopedPointer d; TableViewShared* const s; }; } // namespace Digikam #endif // DIGIKAM_TABLE_VIEW_COLUMN_CONFIGURATION_DIALOG_H diff --git a/core/app/views/tableview/tableview_column_file.cpp b/core/app/views/tableview/tableview_column_file.cpp index 7e5888a86b..6640bcdaf6 100644 --- a/core/app/views/tableview/tableview_column_file.cpp +++ b/core/app/views/tableview/tableview_column_file.cpp @@ -1,259 +1,274 @@ /* ============================================================ * * This file is a part of digiKam project * https://www.digikam.org * * Date : 2013-02-25 * Description : Table view column helpers: File properties * - * Copyright (C) 2013 by Michael G. Hansen + * Copyright (C) 2017-2020 by Gilles Caulier + * Copyright (C) 2013 by Michael G. Hansen * * 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. * * ============================================================ */ #include "tableview_column_file.h" // Qt includes #include #include #include #include // KDE includes #include // Local includes #include "digikam_debug.h" #include "itempropertiestab.h" #include "iteminfo.h" namespace Digikam { namespace TableViewColumns { ColumnFileProperties::ColumnFileProperties(TableViewShared* const tableViewShared, const TableViewColumnConfiguration& pConfiguration, const SubColumn pSubColumn, QObject* const parent) : TableViewColumn(tableViewShared, pConfiguration, parent), subColumn(pSubColumn) { } TableViewColumnDescription ColumnFileProperties::getDescription() { TableViewColumnDescription description(QLatin1String("file-properties"), i18n("File properties")); description.setIcon(QLatin1String("dialog-information")); description.addSubColumn(TableViewColumnDescription(QLatin1String("filename"), i18n("Filename"))); description.addSubColumn(TableViewColumnDescription(QLatin1String("filepath"), i18n("Path"))); description.addSubColumn(TableViewColumnDescription(QLatin1String("filesize"), i18n("Size"))); description.addSubColumn(TableViewColumnDescription(QLatin1String("filelastmodified"), i18n("Last modified"))); return description; } QStringList ColumnFileProperties::getSubColumns() { QStringList columns; - columns << QLatin1String("filename") << QLatin1String("filepath") - << QLatin1String("filesize") << QLatin1String("filelastmodified"); + columns << QLatin1String("filename") + << QLatin1String("filepath") + << QLatin1String("filesize") + << QLatin1String("filelastmodified"); return columns; } QString ColumnFileProperties::getTitle() const { switch (subColumn) { case SubColumnName: return i18n("Filename"); + case SubColumnFilePath: return i18n("Path"); + case SubColumnSize: return i18n("Size"); + case SubColumnLastModified: return i18n("Last modified"); } return QString(); } TableViewColumn::ColumnFlags ColumnFileProperties::getColumnFlags() const { - if ((subColumn == SubColumnSize) || - (subColumn == SubColumnLastModified)) + if ( + (subColumn == SubColumnSize) || + (subColumn == SubColumnLastModified) + ) { - return ColumnCustomSorting | ColumnHasConfigurationWidget; + return (ColumnCustomSorting | ColumnHasConfigurationWidget); } return ColumnNoFlags; } QVariant ColumnFileProperties::data(TableViewModel::Item* const item, const int role) const { - if ( (role != Qt::DisplayRole) && - (role != Qt::TextAlignmentRole) ) + if ( + (role != Qt::DisplayRole) && + (role != Qt::TextAlignmentRole) + ) { return QVariant(); } if (role == Qt::TextAlignmentRole) { switch (subColumn) { case SubColumnSize: return QVariant(Qt::Alignment(Qt::AlignRight | Qt::AlignVCenter)); default: return QVariant(); } } const ItemInfo info = s->tableViewModel->infoFromItem(item); switch (subColumn) { case SubColumnName: return info.fileUrl().fileName(); break; case SubColumnFilePath: return QDir::toNativeSeparators(info.fileUrl().toLocalFile()); break; case SubColumnSize: { /// @todo Add configuration options for SI-prefixes /// @todo Use an enum instead to avoid lots of string comparisons + const QString formatKey = configuration.getSetting(QLatin1String("format"), QLatin1String("human")); if (formatKey == QLatin1String("human")) { return ItemPropertiesTab::humanReadableBytesCount(info.fileSize()); } else { // formatKey == "plain" + return QLocale().toString(info.fileSize()); } + break; } case SubColumnLastModified: { const QDateTime lastModifiedTime = info.modDateTime(); return QLocale().toString(lastModifiedTime, QLocale::ShortFormat); } } return QVariant(); } TableViewColumn::ColumnCompareResult ColumnFileProperties::compare(TableViewModel::Item* const itemA, TableViewModel::Item* const itemB) const { const ItemInfo infoA = s->tableViewModel->infoFromItem(itemA); const ItemInfo infoB = s->tableViewModel->infoFromItem(itemB); switch (subColumn) { case SubColumnSize: { const int sizeA = infoA.fileSize(); const int sizeB = infoB.fileSize(); return compareHelper(sizeA, sizeB); } case SubColumnLastModified: { const QDateTime dtA = infoA.modDateTime(); const QDateTime dtB = infoB.modDateTime(); return compareHelper(dtA, dtB); } default: { qCWarning(DIGIKAM_GENERAL_LOG) << "file: unimplemented comparison, subColumn=" << subColumn; return CmpEqual; } } } // --------------------------------------------------------------------------------------- ColumnFileConfigurationWidget::ColumnFileConfigurationWidget(TableViewShared* const sharedObject, const TableViewColumnConfiguration& columnConfiguration, QWidget* const parentWidget) : TableViewColumnConfigurationWidget(sharedObject, columnConfiguration, parentWidget), subColumn(ColumnFileProperties::SubColumnName), selectorSizeType(nullptr) { ColumnFileProperties::getSubColumnIndex(configuration.columnId, &subColumn); switch (subColumn) { case ColumnFileProperties::SubColumnSize: { QFormLayout* const box1 = new QFormLayout(); selectorSizeType = new QComboBox(this); selectorSizeType->addItem(i18n("Human readable"), QLatin1String("human")); selectorSizeType->addItem(i18n("Plain"), QLatin1String("plain")); box1->addRow(i18n("Display format"), selectorSizeType); setLayout(box1); const int index = selectorSizeType->findData(configuration.getSetting(QLatin1String("format"), QLatin1String("human"))); selectorSizeType->setCurrentIndex(index>=0 ? index : 0); break; } default: + { break; + } } } ColumnFileConfigurationWidget::~ColumnFileConfigurationWidget() { } TableViewColumnConfiguration ColumnFileConfigurationWidget::getNewConfiguration() { const QString formatKey = selectorSizeType->itemData(selectorSizeType->currentIndex()).toString(); configuration.columnSettings.insert(QLatin1String("format"), formatKey); return configuration; } void ColumnFileProperties::setConfiguration(const TableViewColumnConfiguration& newConfiguration) { configuration = newConfiguration; emit signalAllDataChanged(); } TableViewColumnConfigurationWidget* ColumnFileProperties::getConfigurationWidget(QWidget* const parentWidget) const { return new ColumnFileConfigurationWidget(s, configuration, parentWidget); } } // namespace TableViewColumns } // namespace Digikam diff --git a/core/app/views/tableview/tableview_column_file.h b/core/app/views/tableview/tableview_column_file.h index a68fadceae..f9b48a1002 100644 --- a/core/app/views/tableview/tableview_column_file.h +++ b/core/app/views/tableview/tableview_column_file.h @@ -1,106 +1,107 @@ /* ============================================================ * * This file is a part of digiKam project * https://www.digikam.org * * Date : 2013-02-25 * Description : Table view column helpers: File properties * - * Copyright (C) 2013 by Michael G. Hansen + * Copyright (C) 2017-2020 by Gilles Caulier + * Copyright (C) 2013 by Michael G. Hansen * * 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. * * ============================================================ */ #ifndef DIGIKAM_TABLE_VIEW_COLUMN_FILE_H #define DIGIKAM_TABLE_VIEW_COLUMN_FILE_H // Qt includes #include // Local includes #include "tableview_columnfactory.h" class QComboBox; namespace Digikam { namespace TableViewColumns { class ColumnFileProperties : public TableViewColumn { Q_OBJECT public: enum SubColumn { - SubColumnName = 0, - SubColumnFilePath = 1, - SubColumnSize = 2, + SubColumnName = 0, + SubColumnFilePath = 1, + SubColumnSize = 2, SubColumnLastModified = 3 }; public: explicit ColumnFileProperties(TableViewShared* const tableViewShared, const TableViewColumnConfiguration& pConfiguration, const SubColumn pSubColumn, QObject* const parent = nullptr); virtual ~ColumnFileProperties() {}; - virtual TableViewColumnConfigurationWidget* getConfigurationWidget(QWidget* const parentWidget) const; + virtual TableViewColumnConfigurationWidget* getConfigurationWidget(QWidget* const parentWidget) const; virtual void setConfiguration(const TableViewColumnConfiguration& newConfiguration); - virtual QString getTitle() const; - virtual ColumnFlags getColumnFlags() const; - virtual QVariant data(TableViewModel::Item* const item, const int role) const; + virtual QString getTitle() const; + virtual ColumnFlags getColumnFlags() const; + virtual QVariant data(TableViewModel::Item* const item, const int role) const; virtual ColumnCompareResult compare(TableViewModel::Item* const itemA, TableViewModel::Item* const itemB) const; public: static TableViewColumnDescription getDescription(); static QStringList getSubColumns(); private: SubColumn subColumn; }; // --------------------------------------------------------------------------------------- class ColumnFileConfigurationWidget : public TableViewColumnConfigurationWidget { Q_OBJECT public: explicit ColumnFileConfigurationWidget(TableViewShared* const sharedObject, const TableViewColumnConfiguration& columnConfiguration, QWidget* const parentWidget); virtual ~ColumnFileConfigurationWidget(); virtual TableViewColumnConfiguration getNewConfiguration(); private: ColumnFileProperties::SubColumn subColumn; QComboBox* selectorSizeType; }; } // namespace TableViewColumns } // namespace Digikam #endif // DIGIKAM_TABLE_VIEW_COLUMN_FILE_H diff --git a/core/app/views/tableview/tableview_column_photo.cpp b/core/app/views/tableview/tableview_column_photo.cpp index 00478bcd51..3cded724cf 100644 --- a/core/app/views/tableview/tableview_column_photo.cpp +++ b/core/app/views/tableview/tableview_column_photo.cpp @@ -1,458 +1,493 @@ /* ============================================================ * * This file is a part of digiKam project * https://www.digikam.org * * Date : 2013-03-14 * Description : Table view column helpers: Photo properties * - * Copyright (C) 2013 by Michael G. Hansen + * Copyright (C) 2017-2020 by Gilles Caulier + * Copyright (C) 2013 by Michael G. Hansen * * 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. * * ============================================================ */ #include "tableview_column_photo.h" // Qt includes #include #include #include // KDE includes #include // Local includes #include "digikam_debug.h" #include "coredbinfocontainers.h" #include "itempropertiestab.h" #include "dmetadata.h" #include "iteminfo.h" namespace Digikam { namespace TableViewColumns { ColumnPhotoProperties::ColumnPhotoProperties(TableViewShared* const tableViewShared, const TableViewColumnConfiguration& pConfiguration, const SubColumn pSubColumn, QObject* const parent) : TableViewColumn(tableViewShared, pConfiguration, parent), subColumn(pSubColumn) { } ColumnPhotoProperties::~ColumnPhotoProperties() { } QStringList ColumnPhotoProperties::getSubColumns() { QStringList columns; - columns << QLatin1String("cameramaker") << QLatin1String("cameramodel") - << QLatin1String("lens") << QLatin1String("aperture") - << QLatin1String("focal") << QLatin1String("exposure") - << QLatin1String("sensitivity") << QLatin1String("modeprogram") - << QLatin1String("flash") << QLatin1String("whitebalance"); + columns << QLatin1String("cameramaker") + << QLatin1String("cameramodel") + << QLatin1String("lens") + << QLatin1String("aperture") + << QLatin1String("focal") + << QLatin1String("exposure") + << QLatin1String("sensitivity") + << QLatin1String("modeprogram") + << QLatin1String("flash") + << QLatin1String("whitebalance"); return columns; } TableViewColumnDescription ColumnPhotoProperties::getDescription() { TableViewColumnDescription description(QLatin1String("photo-properties"), i18n("Photo properties")); description.setIcon(QLatin1String("camera-photo")); description.addSubColumn(TableViewColumnDescription(QLatin1String("cameramaker"), i18n("Camera maker"))); description.addSubColumn(TableViewColumnDescription(QLatin1String("cameramodel"), i18n("Camera model"))); description.addSubColumn(TableViewColumnDescription(QLatin1String("lens"), i18n("Lens"))); description.addSubColumn(TableViewColumnDescription(QLatin1String("aperture"), i18n("Aperture"))); description.addSubColumn(TableViewColumnDescription(QLatin1String("focal"), i18n("Focal length"))); description.addSubColumn(TableViewColumnDescription(QLatin1String("exposure"), i18n("Exposure"))); description.addSubColumn(TableViewColumnDescription(QLatin1String("sensitivity"), i18n("Sensitivity"))); description.addSubColumn(TableViewColumnDescription(QLatin1String("modeprogram"), i18n("Mode/program"))); description.addSubColumn(TableViewColumnDescription(QLatin1String("flash"), i18n("Flash"))); - description.addSubColumn(TableViewColumnDescription(QLatin1String("bordertool"), i18n("White balance"))); + description.addSubColumn(TableViewColumnDescription(QLatin1String("whitebalance"), i18n("White balance"))); return description; } QString ColumnPhotoProperties::getTitle() const { switch (subColumn) { case SubColumnCameraMaker: return i18n("Camera maker"); + case SubColumnCameraModel: return i18n("Camera model"); + case SubColumnLens: return i18n("Lens"); + case SubColumnAperture: return i18n("Aperture"); + case SubColumnFocal: return i18n("Focal length"); + case SubColumnExposure: return i18n("Exposure"); + case SubColumnSensitivity: return i18n("Sensitivity"); + case SubColumnModeProgram: return i18n("Mode/program"); + case SubColumnFlash: return i18n("Flash"); + case SubColumnWhiteBalance: return i18n("White balance"); } return QString(); } TableViewColumn::ColumnFlags ColumnPhotoProperties::getColumnFlags() const { ColumnFlags flags(ColumnNoFlags); - if ((subColumn == SubColumnAperture) || + if ( + (subColumn == SubColumnAperture) || (subColumn == SubColumnFocal) || (subColumn == SubColumnExposure) || - (subColumn == SubColumnSensitivity) ) + (subColumn == SubColumnSensitivity) + ) { flags |= ColumnCustomSorting; } if (subColumn == SubColumnExposure) { flags |= ColumnHasConfigurationWidget; } return flags; } QVariant ColumnPhotoProperties::data(TableViewModel::Item* const item, const int role) const { if (role != Qt::DisplayRole) { return QVariant(); } switch (subColumn) { case SubColumnCameraMaker: { QString cameraMaker = s->tableViewModel->itemDatabaseFieldRaw(item, DatabaseFields::Set(DatabaseFields::Make)).toString(); ItemPropertiesTab::shortenedMakeInfo(cameraMaker); return cameraMaker; } + case SubColumnCameraModel: { QString cameraModel = s->tableViewModel->itemDatabaseFieldRaw(item, DatabaseFields::Set(DatabaseFields::Model)).toString(); ItemPropertiesTab::shortenedModelInfo(cameraModel); return cameraModel; } + case SubColumnLens: { const QString cameraLens = s->tableViewModel->itemDatabaseFieldRaw(item, DatabaseFields::Set(DatabaseFields::Lens)).toString(); return cameraLens; } + case SubColumnAperture: { const QVariant apertureVariant = s->tableViewModel->itemDatabaseFieldRaw(item, DatabaseFields::Set(DatabaseFields::Aperture)); const QString apertureString = DMetadata::valueToString(apertureVariant, MetadataInfo::Aperture); return apertureString; } + case SubColumnFocal: { /// @todo Make this configurable + const DatabaseFields::Set requiredSet = DatabaseFields::Set(DatabaseFields::FocalLength | DatabaseFields::FocalLength35); const TableViewModel::DatabaseFieldsHashRaw rawFields = s->tableViewModel->itemDatabaseFieldsRaw(item, requiredSet); const QVariant focalLengthVariant = rawFields.value(DatabaseFields::FocalLength); const QString focalLengthString = DMetadata::valueToString(focalLengthVariant, MetadataInfo::FocalLength); const QVariant focalLength35Variant = rawFields.value(DatabaseFields::FocalLength35); const QString focalLength35String = DMetadata::valueToString(focalLength35Variant, MetadataInfo::FocalLengthIn35mm); if (focalLength35String.isEmpty()) { return focalLengthString; } if (focalLengthString.isEmpty()) { return QString(); } /// @todo What if only 35 mm is set? + return i18n("%1 (%2)", focalLengthString, focalLength35String); } + case SubColumnExposure: { /// @todo Add a configuration option for fraction vs number, units s vs ms vs mus + const QVariant exposureVariant = s->tableViewModel->itemDatabaseFieldRaw(item, DatabaseFields::Set(DatabaseFields::ExposureTime)); if (configuration.getSetting(QLatin1String("format"), QLatin1String("fraction")) == QLatin1String("fraction")) { const QString exposureString = DMetadata::valueToString(exposureVariant, MetadataInfo::ExposureTime); + return exposureString; } if (!exposureVariant.isValid()) { return QString(); } const QString unitKey = configuration.getSetting(QLatin1String("unit"), QLatin1String("seconds")); double multiplier = 1.0; KLocalizedString exposureTimeLocalizedString = ki18n("%1 s"); - if (unitKey == QLatin1String("milliseconds")) + if (unitKey == QLatin1String("milliseconds")) { multiplier = 1000.0; exposureTimeLocalizedString = ki18n("%1 ms"); } else if (unitKey == QLatin1String("microseconds")) { multiplier = 1000000.0; exposureTimeLocalizedString = ki18n("%1 µs"); } const double exposureTime = exposureVariant.toDouble() * multiplier; + /// @todo Seems like we have to check for 0 here, too, as an invalid value if (exposureTime == 0) { return QString(); } /// @todo Remove trailing zeros? /// @todo Align right? --> better align at decimal point + const QString exposureTimeString = exposureTimeLocalizedString.subs(QLocale().toString(exposureTime, 'g', 3)).toString(); + return exposureTimeString; } + case SubColumnSensitivity: { const QVariant sensitivityVariant = s->tableViewModel->itemDatabaseFieldRaw(item, - DatabaseFields::Set(DatabaseFields::Sensitivity)); + DatabaseFields::Set(DatabaseFields::Sensitivity)); const QString sensitivityString = DMetadata::valueToString(sensitivityVariant, MetadataInfo::Sensitivity); if (sensitivityString.isEmpty()) { return QString(); } return i18n("%1 ISO", sensitivityString); } + case SubColumnModeProgram: { const DatabaseFields::Set requiredSet = DatabaseFields::Set(DatabaseFields::ExposureMode | DatabaseFields::ExposureProgram); const TableViewModel::DatabaseFieldsHashRaw rawFields = s->tableViewModel->itemDatabaseFieldsRaw(item, requiredSet); const QVariant exposureModeVariant = rawFields.value(DatabaseFields::ExposureMode); const QString exposureModeString = DMetadata::valueToString(exposureModeVariant, MetadataInfo::ExposureMode); const QVariant exposureProgramVariant = rawFields.value(DatabaseFields::ExposureProgram); const QString exposureProgramString = DMetadata::valueToString(exposureProgramVariant, MetadataInfo::ExposureProgram); - if (exposureModeString.isEmpty() && exposureProgramString.isEmpty()) + if (exposureModeString.isEmpty() && exposureProgramString.isEmpty()) { return QString(); } else if (!exposureModeString.isEmpty() && exposureProgramString.isEmpty()) { return exposureModeString; } else if (exposureModeString.isEmpty() && !exposureProgramString.isEmpty()) { return exposureProgramString; } return QString::fromUtf8("%1 / %2").arg(exposureModeString).arg(exposureProgramString); } + case SubColumnFlash: { const QVariant flashModeVariant = s->tableViewModel->itemDatabaseFieldRaw(item, DatabaseFields::Set(DatabaseFields::FlashMode)); const QString flashModeString = DMetadata::valueToString(flashModeVariant, MetadataInfo::FlashMode); return flashModeString; } + case SubColumnWhiteBalance: { const QVariant whiteBalanceVariant = s->tableViewModel->itemDatabaseFieldRaw(item, DatabaseFields::Set(DatabaseFields::WhiteBalance)); const QString whiteBalanceString = DMetadata::valueToString(whiteBalanceVariant, MetadataInfo::WhiteBalance); return whiteBalanceString; } } return QVariant(); } TableViewColumn::ColumnCompareResult ColumnPhotoProperties::compare(TableViewModel::Item* const itemA, TableViewModel::Item* const itemB) const { const ItemInfo infoA = s->tableViewModel->infoFromItem(itemA); const ItemInfo infoB = s->tableViewModel->infoFromItem(itemB); switch (subColumn) { - case SubColumnAperture: { const QVariant variantA = s->tableViewModel->itemDatabaseFieldRaw(itemA, DatabaseFields::Set(DatabaseFields::Aperture)); const QVariant variantB = s->tableViewModel->itemDatabaseFieldRaw(itemB, DatabaseFields::Set(DatabaseFields::Aperture)); const double apertureA = variantA.toDouble(); const double apertureB = variantB.toDouble(); return compareHelper(apertureA, apertureB); } case SubColumnFocal: { /// @todo This just works if both have focal length set, not if focal length 35 has to be used + const QVariant variantA = s->tableViewModel->itemDatabaseFieldRaw(itemA, DatabaseFields::Set(DatabaseFields::FocalLength)); const QVariant variantB = s->tableViewModel->itemDatabaseFieldRaw(itemB, DatabaseFields::Set(DatabaseFields::FocalLength)); const double focalLengthA = variantA.toDouble(); const double focalLengthB = variantB.toDouble(); return compareHelper(focalLengthA, focalLengthB); } case SubColumnExposure: { const QVariant variantA = s->tableViewModel->itemDatabaseFieldRaw(itemA, DatabaseFields::Set(DatabaseFields::ExposureTime)); const QVariant variantB = s->tableViewModel->itemDatabaseFieldRaw(itemB, DatabaseFields::Set(DatabaseFields::ExposureTime)); const double exposureTimeA = variantA.toDouble(); const double exposureTimeB = variantB.toDouble(); return compareHelper(exposureTimeA, exposureTimeB); } case SubColumnSensitivity: { const QVariant variantA = s->tableViewModel->itemDatabaseFieldRaw(itemA, DatabaseFields::Set(DatabaseFields::Sensitivity)); const QVariant variantB = s->tableViewModel->itemDatabaseFieldRaw(itemB, DatabaseFields::Set(DatabaseFields::Sensitivity)); const double sensitivityA = variantA.toDouble(); const double sensitivityB = variantB.toDouble(); return compareHelper(sensitivityA, sensitivityB); } default: { qCWarning(DIGIKAM_GENERAL_LOG) << "item: unimplemented comparison, subColumn=" << subColumn; return CmpEqual; } } } TableViewColumnConfigurationWidget* ColumnPhotoProperties::getConfigurationWidget(QWidget* const parentWidget) const { TableViewColumnConfiguration myConfiguration = getConfiguration(); return new ColumnPhotoConfigurationWidget(s, myConfiguration, parentWidget); } // --------------------------------------------------------------------------------------------------------------------- ColumnPhotoConfigurationWidget::ColumnPhotoConfigurationWidget(TableViewShared* const sharedObject, const TableViewColumnConfiguration& columnConfiguration, QWidget* const parentWidget) : TableViewColumnConfigurationWidget(sharedObject, columnConfiguration, parentWidget), subColumn(ColumnPhotoProperties::SubColumnExposure), selectorExposureTimeFormat(nullptr), selectorExposureTimeUnit(nullptr) { ColumnPhotoProperties::getSubColumnIndex(configuration.columnId, &subColumn); switch (subColumn) { case ColumnPhotoProperties::SubColumnExposure: { QFormLayout* const box1 = new QFormLayout(); selectorExposureTimeFormat = new QComboBox(this); selectorExposureTimeFormat->addItem(i18n("Fraction"), QLatin1String("fraction")); selectorExposureTimeFormat->addItem(i18n("Rational"), QLatin1String("rational")); box1->addRow(i18n("Format"), selectorExposureTimeFormat); selectorExposureTimeUnit = new QComboBox(this); selectorExposureTimeUnit->addItem(i18n("Seconds"), QLatin1String("seconds")); selectorExposureTimeUnit->addItem(i18n("Milliseconds"), QLatin1String("milliseconds")); selectorExposureTimeUnit->addItem(i18n("Microseconds"), QLatin1String("microseconds")); box1->addRow(i18n("Unit"), selectorExposureTimeUnit); setLayout(box1); const int indexF = selectorExposureTimeFormat->findData(configuration.getSetting(QLatin1String("format"), QLatin1String("fraction"))); selectorExposureTimeFormat->setCurrentIndex(indexF >= 0 ? indexF : 0); const int indexU = selectorExposureTimeUnit->findData(configuration.getSetting(QLatin1String("unit"), QLatin1String("seconds"))); selectorExposureTimeUnit->setCurrentIndex(indexU >= 0 ? indexU : 0); slotUpdateUI(); connect(selectorExposureTimeFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdateUI())); break; } default: + { break; + } } } ColumnPhotoConfigurationWidget::~ColumnPhotoConfigurationWidget() { } TableViewColumnConfiguration ColumnPhotoConfigurationWidget::getNewConfiguration() { const QString formatKey = selectorExposureTimeFormat->itemData(selectorExposureTimeFormat->currentIndex()).toString(); configuration.columnSettings.insert(QLatin1String("format"), formatKey); const QString unitKey = selectorExposureTimeUnit->itemData(selectorExposureTimeUnit->currentIndex()).toString(); configuration.columnSettings.insert(QLatin1String("unit"), unitKey); return configuration; } void ColumnPhotoProperties::setConfiguration(const TableViewColumnConfiguration& newConfiguration) { configuration = newConfiguration; emit signalAllDataChanged(); } void ColumnPhotoConfigurationWidget::slotUpdateUI() { if (selectorExposureTimeFormat) { const QString currentKey = selectorExposureTimeFormat->itemData(selectorExposureTimeFormat->currentIndex()).toString(); const bool needsUnits = (currentKey == QLatin1String("rational")); selectorExposureTimeUnit->setEnabled(needsUnits); } } } // namespace TableViewColumns } // namespace Digikam diff --git a/core/app/views/tableview/tableview_column_photo.h b/core/app/views/tableview/tableview_column_photo.h index d02494cfdb..97a82dad32 100644 --- a/core/app/views/tableview/tableview_column_photo.h +++ b/core/app/views/tableview/tableview_column_photo.h @@ -1,115 +1,116 @@ /* ============================================================ * * This file is a part of digiKam project * https://www.digikam.org * * Date : 2013-03-14 * Description : Table view column helpers: Photo properties * - * Copyright (C) 2013 by Michael G. Hansen + * Copyright (C) 2017-2020 by Gilles Caulier + * Copyright (C) 2013 by Michael G. Hansen * * 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. * * ============================================================ */ #ifndef DIGIKAM_TABLE_VIEW_COLUMN_PHOTO_H #define DIGIKAM_TABLE_VIEW_COLUMN_PHOTO_H // Qt includes #include // Local includes #include "tableview_columnfactory.h" class QComboBox; namespace Digikam { namespace TableViewColumns { class ColumnPhotoProperties : public TableViewColumn { Q_OBJECT public: enum SubColumn { SubColumnCameraMaker = 0, SubColumnCameraModel = 1, SubColumnLens = 2, SubColumnAperture = 3, SubColumnFocal = 4, SubColumnExposure = 5, SubColumnSensitivity = 6, SubColumnModeProgram = 7, SubColumnFlash = 8, SubColumnWhiteBalance = 9 }; private: SubColumn subColumn; public: explicit ColumnPhotoProperties(TableViewShared* const tableViewShared, const TableViewColumnConfiguration& pConfiguration, const SubColumn pSubColumn, QObject* const parent = nullptr); virtual ~ColumnPhotoProperties(); - virtual QString getTitle() const; - virtual ColumnFlags getColumnFlags() const; - virtual QVariant data(TableViewModel::Item* const item, const int role) const; + virtual QString getTitle() const; + virtual ColumnFlags getColumnFlags() const; + virtual QVariant data(TableViewModel::Item* const item, const int role) const; virtual ColumnCompareResult compare(TableViewModel::Item* const itemA, TableViewModel::Item* const itemB) const; - virtual TableViewColumnConfigurationWidget* getConfigurationWidget(QWidget* const parentWidget) const; + virtual TableViewColumnConfigurationWidget* getConfigurationWidget(QWidget* const parentWidget) const; virtual void setConfiguration(const TableViewColumnConfiguration& newConfiguration); static TableViewColumnDescription getDescription(); static QStringList getSubColumns(); }; // ---------------------------------------------------------------------------------------------------------------------- class ColumnPhotoConfigurationWidget : public TableViewColumnConfigurationWidget { Q_OBJECT public: explicit ColumnPhotoConfigurationWidget(TableViewShared* const sharedObject, const TableViewColumnConfiguration& columnConfiguration, QWidget* const parentWidget); virtual ~ColumnPhotoConfigurationWidget(); virtual TableViewColumnConfiguration getNewConfiguration(); private Q_SLOTS: void slotUpdateUI(); private: ColumnPhotoProperties::SubColumn subColumn; QComboBox* selectorExposureTimeFormat; QComboBox* selectorExposureTimeUnit; }; } // namespace TableViewColumns } // namespace Digikam #endif // DIGIKAM_TABLE_VIEW_COLUMN_PHOTO_H diff --git a/core/app/views/tableview/tableview_columns.h b/core/app/views/tableview/tableview_columns.h index 8159ca7ee2..c0f9db6abc 100644 --- a/core/app/views/tableview/tableview_columns.h +++ b/core/app/views/tableview/tableview_columns.h @@ -1,36 +1,37 @@ /* ============================================================ * * This file is a part of digiKam project * https://www.digikam.org * * Date : 2013-02-12 * Description : Table view column helpers * - * Copyright (C) 2013 by Michael G. Hansen + * Copyright (C) 2017-2020 by Gilles Caulier + * Copyright (C) 2013 by Michael G. Hansen * * 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. * * ============================================================ */ #ifndef DIGIKAM_TABLE_VIEW_COLUMNS_H #define DIGIKAM_TABLE_VIEW_COLUMNS_H // Local includes #include "tableview_column_audiovideo.h" #include "tableview_column_digikam.h" #include "tableview_column_file.h" #include "tableview_column_geo.h" #include "tableview_column_item.h" #include "tableview_column_photo.h" #include "tableview_column_thumbnail.h" #endif // DIGIKAM_TABLE_VIEW_COLUMNS_H diff --git a/project/bundles/mxe/config.sh b/project/bundles/mxe/config.sh index 35a1282082..f0d0a23eb0 100644 --- a/project/bundles/mxe/config.sh +++ b/project/bundles/mxe/config.sh @@ -1,77 +1,77 @@ #!/bin/bash # Copyright (c) 2013-2020 by Gilles Caulier # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. ######################################################################## # Absolute path where are downloaded all tarballs to compile. DOWNLOAD_DIR="`pwd`/temp.dwnld" # Absolute path where are compiled all tarballs BUILDING_DIR="`pwd`/temp.build" #------------------------------------------------------------------------------------------- # MXE configuration #------------ # IMPORTANT: Target Windows architecture to build installer. Possible values: 32 or 64 bits. MXE_ARCHBITS=32 #------------ if [[ $MXE_ARCHBITS == 32 ]]; then # Windows 32 bits shared MXE_BUILD_TARGETS="i686-w64-mingw32.shared" MXE_BUILDROOT="`pwd`/build.win32" elif [[ $MXE_ARCHBITS == 64 ]]; then # Windows 64 bits shared MXE_BUILD_TARGETS="x86_64-w64-mingw32.shared" MXE_BUILDROOT="`pwd`/build.win64" else echo "Unsupported or wrong target Windows architecture: $MXE_ARCHBITS bits." exit -1 fi echo "Target Windows architecture: $MXE_ARCHBITS bits." MXE_GIT_URL="https://github.com/mxe/mxe.git" MXE_GIT_REVISION=master MXE_INSTALL_PREFIX=${MXE_BUILDROOT}/usr/${MXE_BUILD_TARGETS}/ MXE_TOOLCHAIN=${MXE_INSTALL_PREFIX}/share/cmake/mxe-conf.cmake #------------------------------------------------------------------------------------------- # URL to git repository to checkout digiKam source code DK_GITURL="git@invent.kde.org:kde/digikam.git" # digiKam tarball information. DK_URL="http://download.kde.org/stable/digikam" # Location to build source code. DK_BUILDTEMP=~/dktemp # digiKam tag version from git. Official tarball do not include extra shared libraries. # The list of tags can be listed with this url: https://quickgit.kde.org/?p=digikam.git&a=tags # If you want to package current implemntation from git, use "master" as tag. #DK_VERSION=v7.0.0-beta2 DK_VERSION=master #DK_VERSION=development/dplugins # Installer sub version to differentiates newer updates of the installer itself, even if the underlying application hasn’t changed. #DK_EPOCH="-01" # Epoch with time-stamp for pre-release bundle in ISO format DK_EPOCH="-`date "+%Y%m%dT%H%M%S"`" # Installer will include or not digiKam debug symbols -DK_DEBUG=0 +DK_DEBUG=1 # Sign bundles with GPG. Passphrase must be hosted in ~/.gnupg/dkorg-gpg-pwd.txt DK_SIGN=0 # Upload automatically bundle to files.kde.org (pre-release only). DK_UPLOAD=1 DK_UPLOADURL="digikam@milonia.kde.org" DK_UPLOADDIR="/srv/archives/files/digikam/"