diff options
| author | Alexander Stippich <[email protected]> | 2019-05-21 20:27:29 +0200 |
|---|---|---|
| committer | Alexander Stippich <[email protected]> | 2019-05-30 11:18:41 +0200 |
| commit | 36b61838a27df32824c58f383453bb94b730b52c (patch) | |
| tree | 5005a731bd6f2635a4c8a43ba11db4172559e69a /src | |
| parent | c22df71df28315b8b1964671d3452fad5b6ae0f5 (diff) | |
handle maps with multiple or single entries from Baloo
Summary:
Handle maps which may contain multiple entries with the same key.
Bumps frameworks to 5.58. Equivalent to D20739.
Reviewers: #dolphin, elvisangelaccio, bruns
Reviewed By: #dolphin, elvisangelaccio, bruns
Subscribers: kfm-devel
Tags: #dolphin
Differential Revision: https://phabricator.kde.org/D21157
Diffstat (limited to 'src')
| -rw-r--r-- | src/kitemviews/private/kbaloorolesprovider.cpp | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/src/kitemviews/private/kbaloorolesprovider.cpp b/src/kitemviews/private/kbaloorolesprovider.cpp index 469f07915..f3671540d 100644 --- a/src/kitemviews/private/kbaloorolesprovider.cpp +++ b/src/kitemviews/private/kbaloorolesprovider.cpp @@ -56,18 +56,34 @@ QHash<QByteArray, QVariant> KBalooRolesProvider::roleValues(const Baloo::File& f { QHash<QByteArray, QVariant> values; - QMapIterator<KFileMetaData::Property::Property, QVariant> it(file.properties()); - while (it.hasNext()) { - it.next(); + using entry = std::pair<const KFileMetaData::Property::Property&, const QVariant&>; + + 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; }); - const KFileMetaData::PropertyInfo pi(it.key()); - const QString property = pi.name(); - const QByteArray role = roleForProperty(property); if (role.isEmpty() || !roles.contains(role)) { + rangeBegin = rangeEnd; continue; } - values.insert(role, pi.formatAsDisplayString(it.value())); + auto distance = std::distance(rangeBegin, rangeEnd); + if (distance > 1) { + QVariantList list; + list.reserve(static_cast<int>(distance)); + std::for_each(rangeBegin, rangeEnd, [&list](const entry& s) { list.append(s.second); }); + values.insert(role, propertyInfo.formatAsDisplayString(list)); + } else { + values.insert(role, propertyInfo.formatAsDisplayString((*rangeBegin).second)); + } + rangeBegin = rangeEnd; } KFileMetaData::UserMetaData md(file.path()); |
