X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/dcdf4b01c8b0517ad23b420316e27c8dce9cef82..cebcf8db:/src/kitemviews/private/kbaloorolesprovider.cpp diff --git a/src/kitemviews/private/kbaloorolesprovider.cpp b/src/kitemviews/private/kbaloorolesprovider.cpp index df60a2533..d0632e2c5 100644 --- a/src/kitemviews/private/kbaloorolesprovider.cpp +++ b/src/kitemviews/private/kbaloorolesprovider.cpp @@ -12,32 +12,61 @@ #include #include -#include -#include - -namespace { - QString tagsFromValues(const QStringList& values) - { - if (values.size() == 1) { - return values.at(0); - } +#include - QStringList alphabeticalOrderTags = values; - QCollator coll; - coll.setNumericMode(true); - std::sort(alphabeticalOrderTags.begin(), alphabeticalOrderTags.end(), [&](const QString& s1, const QString& s2){ return coll.compare(s1, s2) < 0; }); - return alphabeticalOrderTags.join(QLatin1String(", ")); +namespace +{ +QString tagsFromValues(const QStringList &values) +{ + if (values.size() == 1) { + return values.at(0); } + + QStringList alphabeticalOrderTags = values; + QCollator coll; + coll.setNumericMode(true); + std::sort(alphabeticalOrderTags.begin(), alphabeticalOrderTags.end(), [&](const QString &s1, const QString &s2) { + return coll.compare(s1, s2) < 0; + }); + return alphabeticalOrderTags.join(QLatin1String(", ")); } -struct KBalooRolesProviderSingleton -{ + using Property = KFileMetaData::Property::Property; + // Mapping from the KFM::Property to the KFileItemModel roles. + const QHash propertyRoleMap() { + static const auto map = QHash { + { Property::Rating, QByteArrayLiteral("rating") }, + { Property::Comment, QByteArrayLiteral("comment") }, + { Property::Title, QByteArrayLiteral("title") }, + { Property::Author, QByteArrayLiteral("author") }, + { Property::Publisher, QByteArrayLiteral("publisher") }, + { Property::PageCount, QByteArrayLiteral("pageCount") }, + { Property::WordCount, QByteArrayLiteral("wordCount") }, + { Property::LineCount, QByteArrayLiteral("lineCount") }, + { Property::Width, QByteArrayLiteral("width") }, + { Property::Height, QByteArrayLiteral("height") }, + { Property::ImageDateTime, QByteArrayLiteral("imageDateTime") }, + { Property::ImageOrientation, QByteArrayLiteral("orientation") }, + { Property::Artist, QByteArrayLiteral("artist") }, + { Property::Genre, QByteArrayLiteral("genre") }, + { Property::Album, QByteArrayLiteral("album") }, + { Property::Duration, QByteArrayLiteral("duration") }, + { Property::BitRate, QByteArrayLiteral("bitrate") }, + { Property::AspectRatio, QByteArrayLiteral("aspectRatio") }, + { Property::FrameRate, QByteArrayLiteral("frameRate") }, + { Property::ReleaseYear, QByteArrayLiteral("releaseYear") }, + { Property::TrackNumber, QByteArrayLiteral("track") } + }; + return map; + } +} + +struct KBalooRolesProviderSingleton { KBalooRolesProvider instance; }; Q_GLOBAL_STATIC(KBalooRolesProviderSingleton, s_balooRolesProvider) - -KBalooRolesProvider& KBalooRolesProvider::instance() +KBalooRolesProvider &KBalooRolesProvider::instance() { return s_balooRolesProvider->instance; } @@ -51,37 +80,39 @@ QSet KBalooRolesProvider::roles() const return m_roles; } -QHash KBalooRolesProvider::roleValues(const Baloo::File& file, - const QSet& roles) const +QHash KBalooRolesProvider::roleValues(const Baloo::File &file, const QSet &roles) const { QHash values; - using entry = std::pair; + using entry = std::pair; - const auto& propMap = file.properties(); + const auto &propMap = file.properties(); auto rangeBegin = propMap.constKeyValueBegin(); while (rangeBegin != propMap.constKeyValueEnd()) { auto key = (*rangeBegin).first; - const KFileMetaData::PropertyInfo propertyInfo(key); - const QByteArray role = roleForProperty(propertyInfo.name()); - auto rangeEnd = std::find_if(rangeBegin, propMap.constKeyValueEnd(), - [key](const entry& e) { return e.first != key; }); + auto rangeEnd = std::find_if(rangeBegin, propMap.constKeyValueEnd(), [key](const entry &e) { + return e.first != key; + }); + const QByteArray role = propertyRoleMap().value(key); if (role.isEmpty() || !roles.contains(role)) { rangeBegin = rangeEnd; continue; } + const KFileMetaData::PropertyInfo propertyInfo(key); auto distance = std::distance(rangeBegin, rangeEnd); if (distance > 1) { QVariantList list; list.reserve(static_cast(distance)); - std::for_each(rangeBegin, rangeEnd, [&list](const entry& s) { list.append(s.second); }); + std::for_each(rangeBegin, rangeEnd, [&list](const entry &s) { + list.append(s.second); + }); values.insert(role, propertyInfo.formatAsDisplayString(list)); } else { - if (propertyInfo.valueType() == QVariant::DateTime) { + if (propertyInfo.valueType() == QMetaType::Type::QDateTime) { // Let dolphin format later Dates values.insert(role, (*rangeBegin).second); } else { @@ -91,6 +122,18 @@ QHash KBalooRolesProvider::roleValues(const Baloo::File& f rangeBegin = rangeEnd; } + if (roles.contains("dimensions")) { + bool widthOk = false; + bool heightOk = false; + + const int width = propMap.value(KFileMetaData::Property::Width).toInt(&widthOk); + const int height = propMap.value(KFileMetaData::Property::Height).toInt(&heightOk); + + if (widthOk && heightOk && width >= 0 && height >= 0) { + values.insert("dimensions", QSize(width, height)); + } + } + KFileMetaData::UserMetaData::Attributes attributes; if (roles.contains("tags")) { attributes |= KFileMetaData::UserMetaData::Tags; @@ -130,41 +173,15 @@ QHash KBalooRolesProvider::roleValues(const Baloo::File& f KBalooRolesProvider::KBalooRolesProvider() { - struct PropertyInfo - { - const char* const property; - const char* const role; - }; - - // Mapping from the URIs to the KFileItemModel roles. Note that this must not be - // a 1:1 mapping: One role may contain several URI-values - static const PropertyInfo propertyInfoList[] = { - { "rating", "rating" }, - { "tag", "tags" }, - { "comment", "comment" }, - { "title", "title" }, - { "wordCount", "wordCount" }, - { "lineCount", "lineCount" }, - { "width", "width" }, - { "height", "height" }, - { "imageDateTime", "imageDateTime"}, - { "imageOrientation", "orientation", }, - { "artist", "artist" }, - { "genre", "genre" }, - { "album", "album" }, - { "duration", "duration" }, - { "bitRate", "bitrate" }, - { "aspectRatio", "aspectRatio" }, - { "frameRate", "frameRate" }, - { "releaseYear", "releaseYear" }, - { "trackNumber", "track" }, - { "originUrl", "originUrl" } - }; - - for (unsigned int i = 0; i < sizeof(propertyInfoList) / sizeof(PropertyInfo); ++i) { - m_roleForProperty.insert(propertyInfoList[i].property, propertyInfoList[i].role); - m_roles.insert(propertyInfoList[i].role); + // Display roles filled from Baloo property cache + for (const auto &role : propertyRoleMap()) { + m_roles.insert(role); } + m_roles.insert("dimensions"); + // Display roles provided by UserMetaData + m_roles.insert(QByteArrayLiteral("tags")); + m_roles.insert(QByteArrayLiteral("rating")); + m_roles.insert(QByteArrayLiteral("comment")); + m_roles.insert(QByteArrayLiteral("originUrl")); } -