-/***************************************************************************
- * Copyright (C) 2012 by Peter Penz <peter.penz19@gmail.com> *
- * Copyright (C) 2013 by Vishesh Handa <me@vhanda.in> *
- * *
- * 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 of the License, 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. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
- ***************************************************************************/
+/*
+ * SPDX-FileCopyrightText: 2012 Peter Penz <peter.penz19@gmail.com>
+ * SPDX-FileCopyrightText: 2013 Vishesh Handa <me@vhanda.in>
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
#include "kbaloorolesprovider.h"
#include <Baloo/File>
#include <KFileMetaData/PropertyInfo>
#include <KFileMetaData/UserMetaData>
-#include <KFormat>
-#include <KLocalizedString>
#include <QCollator>
#include <QDebug>
+#include <QSize>
#include <QTime>
+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(", "));
+ }
+
+ using Property = KFileMetaData::Property::Property;
+ // Mapping from the KFM::Property to the KFileItemModel roles.
+ const QHash<Property, QByteArray> propertyRoleMap() {
+ static const auto map = QHash<Property, QByteArray> {
+ { Property::Rating, QByteArrayLiteral("rating") },
+ { Property::Comment, QByteArrayLiteral("comment") },
+ { Property::Title, QByteArrayLiteral("title") },
+ { 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;
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; });
+ 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;
rangeBegin = rangeEnd;
}
- KFileMetaData::UserMetaData md(file.path());
+ 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")) {
- values.insert("tags", tagsFromValues(md.tags()));
+ attributes |= KFileMetaData::UserMetaData::Tags;
}
if (roles.contains("rating")) {
- values.insert("rating", QString::number(md.rating()));
+ attributes |= KFileMetaData::UserMetaData::Rating;
}
if (roles.contains("comment")) {
- values.insert("comment", md.userComment());
+ attributes |= KFileMetaData::UserMetaData::Comment;
}
if (roles.contains("originUrl")) {
+ attributes |= KFileMetaData::UserMetaData::OriginUrl;
+ }
+
+ if (attributes == KFileMetaData::UserMetaData::None) {
+ return values;
+ }
+
+ KFileMetaData::UserMetaData md(file.path());
+ attributes = md.queryAttributes(attributes);
+
+ if (attributes & KFileMetaData::UserMetaData::Tags) {
+ values.insert("tags", tagsFromValues(md.tags()));
+ }
+ if (attributes & KFileMetaData::UserMetaData::Rating) {
+ values.insert("rating", QString::number(md.rating()));
+ }
+ if (attributes & KFileMetaData::UserMetaData::Comment) {
+ values.insert("comment", md.userComment());
+ }
+ if (attributes & KFileMetaData::UserMetaData::OriginUrl) {
values.insert("originUrl", md.originUrl());
}
return values;
}
-QByteArray KBalooRolesProvider::roleForProperty(const QString& property) const
-{
- return m_roleForProperty.value(property);
-}
-
-KBalooRolesProvider::KBalooRolesProvider() :
- m_roles(),
- m_roleForProperty()
+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");
-QString KBalooRolesProvider::tagsFromValues(const QStringList& values) const
-{
- 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(", "));
+ // 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"));
}
+