From aa2dda8cb4df1da0171dd34f34dacf94c958f21e Mon Sep 17 00:00:00 2001 From: Emmanuel Pescosta Date: Thu, 18 Jul 2013 17:07:34 +0200 Subject: [PATCH] Overwrite the changed role value with an empty QVariant, because the nepomuk roles provider doesn't overwrite it when the property value list is empty. BUG: 322348 REVIEW: 111505 FIXED-IN: 4.11.0 --- src/kitemviews/kfileitemmodelrolesupdater.cpp | 12 ++++++++++-- src/kitemviews/kfileitemmodelrolesupdater.h | 6 +++++- src/kitemviews/private/knepomukrolesprovider.cpp | 7 ++++++- src/kitemviews/private/knepomukrolesprovider.h | 2 ++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/kitemviews/kfileitemmodelrolesupdater.cpp b/src/kitemviews/kfileitemmodelrolesupdater.cpp index 317a7a3522..698a6c5f00 100644 --- a/src/kitemviews/kfileitemmodelrolesupdater.cpp +++ b/src/kitemviews/kfileitemmodelrolesupdater.cpp @@ -294,7 +294,7 @@ void KFileItemModelRolesUpdater::setRoles(const QSet& roles) m_nepomukResourceWatcher = new Nepomuk2::ResourceWatcher(this); connect(m_nepomukResourceWatcher, SIGNAL(propertyChanged(Nepomuk2::Resource,Nepomuk2::Types::Property,QVariantList,QVariantList)), - this, SLOT(applyChangedNepomukRoles(Nepomuk2::Resource))); + this, SLOT(applyChangedNepomukRoles(Nepomuk2::Resource,Nepomuk2::Types::Property))); } else if (!hasNepomukRole && m_nepomukResourceWatcher) { delete m_nepomukResourceWatcher; m_nepomukResourceWatcher = 0; @@ -721,7 +721,7 @@ void KFileItemModelRolesUpdater::resolveRecentlyChangedItems() updateChangedItems(); } -void KFileItemModelRolesUpdater::applyChangedNepomukRoles(const Nepomuk2::Resource& resource) +void KFileItemModelRolesUpdater::applyChangedNepomukRoles(const Nepomuk2::Resource& resource, const Nepomuk2::Types::Property& property) { #ifdef HAVE_NEPOMUK if (!Nepomuk2::ResourceManager::instance()->initialized()) { @@ -740,6 +740,14 @@ void KFileItemModelRolesUpdater::applyChangedNepomukRoles(const Nepomuk2::Resour QHash data = rolesData(item); const KNepomukRolesProvider& rolesProvider = KNepomukRolesProvider::instance(); + const QByteArray role = rolesProvider.roleForPropertyUri(property.uri()); + if (!role.isEmpty() && m_roles.contains(role)) { + // Overwrite the changed role value with an empty QVariant, because the roles + // provider doesn't overwrite it when the property value list is empty. + // See bug 322348 + data.insert(role, QVariant()); + } + QHashIterator it(rolesProvider.roleValues(resource, m_roles)); while (it.hasNext()) { it.next(); diff --git a/src/kitemviews/kfileitemmodelrolesupdater.h b/src/kitemviews/kfileitemmodelrolesupdater.h index 605c36f81a..e17667a0c6 100644 --- a/src/kitemviews/kfileitemmodelrolesupdater.h +++ b/src/kitemviews/kfileitemmodelrolesupdater.h @@ -43,6 +43,10 @@ class QTimer; { class ResourceWatcher; class Resource; + namespace Types + { + class Property; + } } #else // Required for the slot applyChangedNepomukRoles() that @@ -208,7 +212,7 @@ private slots: */ void resolveRecentlyChangedItems(); - void applyChangedNepomukRoles(const Nepomuk2::Resource& resource); + void applyChangedNepomukRoles(const Nepomuk2::Resource& resource, const Nepomuk2::Types::Property& property); /** * Is invoked if a directory watched by KDirWatch got dirty. Updates diff --git a/src/kitemviews/private/knepomukrolesprovider.cpp b/src/kitemviews/private/knepomukrolesprovider.cpp index 661670cfa4..e237f948f3 100644 --- a/src/kitemviews/private/knepomukrolesprovider.cpp +++ b/src/kitemviews/private/knepomukrolesprovider.cpp @@ -68,7 +68,7 @@ QHash KNepomukRolesProvider::roleValues(const Nepomuk2::Re it.next(); const Nepomuk2::Types::Property property = it.key(); - const QByteArray role = m_roleForUri.value(property.uri()); + const QByteArray role = roleForPropertyUri(property.uri()); if (role.isEmpty() || !roles.contains(role)) { continue; } @@ -118,6 +118,11 @@ QHash KNepomukRolesProvider::roleValues(const Nepomuk2::Re return values; } +QByteArray KNepomukRolesProvider::roleForPropertyUri(const QUrl& uri) const +{ + return m_roleForUri.value(uri); +} + KNepomukRolesProvider::KNepomukRolesProvider() : m_roles(), m_roleForUri() diff --git a/src/kitemviews/private/knepomukrolesprovider.h b/src/kitemviews/private/knepomukrolesprovider.h index b8c7e51e60..68a4027e15 100644 --- a/src/kitemviews/private/knepomukrolesprovider.h +++ b/src/kitemviews/private/knepomukrolesprovider.h @@ -55,6 +55,8 @@ public: QHash roleValues(const Nepomuk2::Resource& resource, const QSet& roles) const; + QByteArray roleForPropertyUri(const QUrl& uri) const; + protected: KNepomukRolesProvider();