#ifdef HAVE_NEPOMUK
#include "private/knepomukrolesprovider.h"
- #include "private/nepomuk/resourcewatcher.h"
+ #include <Nepomuk2/ResourceWatcher>
#endif
// Required includes for subItemsCount():
, m_nepomukResourceWatcher(0),
m_nepomukUriItems()
#endif
-
{
Q_ASSERT(model);
if (hasNepomukRole && !m_nepomukResourceWatcher) {
Q_ASSERT(m_nepomukUriItems.isEmpty());
- m_nepomukResourceWatcher = new Nepomuk::ResourceWatcher(this);
- connect(m_nepomukResourceWatcher, SIGNAL(propertyChanged(Nepomuk::Resource,Nepomuk::Types::Property,QVariantList,QVariantList)),
- this, SLOT(applyChangedNepomukRoles(Nepomuk::Resource)));
- connect(m_nepomukResourceWatcher, SIGNAL(propertyRemoved(Nepomuk::Resource,Nepomuk::Types::Property,QVariant)),
- this, SLOT(applyChangedNepomukRoles(Nepomuk::Resource)));
- connect(m_nepomukResourceWatcher, SIGNAL(propertyAdded(Nepomuk::Resource,Nepomuk::Types::Property,QVariant)),
- this, SLOT(applyChangedNepomukRoles(Nepomuk::Resource)));
- connect(m_nepomukResourceWatcher, SIGNAL(resourceCreated(Nepomuk::Resource,QList<QUrl>)),
- this, SLOT(applyChangedNepomukRoles(Nepomuk::Resource)));
+ m_nepomukResourceWatcher = new Nepomuk2::ResourceWatcher(this);
+ connect(m_nepomukResourceWatcher, SIGNAL(propertyChanged(Nepomuk2::Resource,Nepomuk2::Types::Property,QVariantList,QVariantList)),
+ this, SLOT(applyChangedNepomukRoles(Nepomuk2::Resource)));
+ connect(m_nepomukResourceWatcher, SIGNAL(propertyRemoved(Nepomuk2::Resource,Nepomuk2::Types::Property,QVariant)),
+ this, SLOT(applyChangedNepomukRoles(Nepomuk2::Resource)));
+ connect(m_nepomukResourceWatcher, SIGNAL(propertyAdded(Nepomuk2::Resource,Nepomuk2::Types::Property,QVariant)),
+ this, SLOT(applyChangedNepomukRoles(Nepomuk2::Resource)));
+ connect(m_nepomukResourceWatcher, SIGNAL(resourceCreated(Nepomuk2::Resource,QList<QUrl>)),
+ this, SLOT(applyChangedNepomukRoles(Nepomuk2::Resource)));
} else if (!hasNepomukRole && m_nepomukResourceWatcher) {
delete m_nepomukResourceWatcher;
m_nepomukResourceWatcher = 0;
if (m_nepomukResourceWatcher) {
// Don't let the ResourceWatcher watch for removed items
if (allItemsRemoved) {
- m_nepomukResourceWatcher->setResources(QList<Nepomuk::Resource>());
+ m_nepomukResourceWatcher->setResources(QList<Nepomuk2::Resource>());
m_nepomukResourceWatcher->stop();
m_nepomukUriItems.clear();
} else {
- QList<Nepomuk::Resource> newResources;
- const QList<Nepomuk::Resource> oldResources = m_nepomukResourceWatcher->resources();
- foreach (const Nepomuk::Resource& resource, oldResources) {
- const QUrl uri = resource.resourceUri();
+ QList<Nepomuk2::Resource> newResources;
+ const QList<Nepomuk2::Resource> oldResources = m_nepomukResourceWatcher->resources();
+ foreach (const Nepomuk2::Resource& resource, oldResources) {
+ const QUrl uri = resource.uri();
const KUrl itemUrl = m_nepomukUriItems.value(uri);
if (m_model->index(itemUrl) >= 0) {
newResources.append(resource);
void KFileItemModelRolesUpdater::slotGotPreview(const KFileItem& item, const QPixmap& pixmap)
{
+ const int oldNumberOfPendingItems = m_pendingVisibleItems.count() + m_pendingInvisibleItems.count();
+
m_pendingVisibleItems.remove(item);
m_pendingInvisibleItems.remove(item);
+ const int newNumberOfPendingItems = m_pendingVisibleItems.count() + m_pendingInvisibleItems.count();
+
+ if (oldNumberOfPendingItems == newNumberOfPendingItems) {
+ // 'item' could not be removed from either of the sets. It looks like
+ // we have hit bug 304986. Replace the items in the sets by the items
+ // in the model to work around the problem.
+ // NOTE: This workaround is not needed any more in KDE 4.10.
+ m_pendingVisibleItems = sortedItems(m_pendingVisibleItems).toSet();
+ m_pendingInvisibleItems = sortedItems(m_pendingInvisibleItems).toSet();
+ }
+
const int index = m_model->index(item);
if (index < 0) {
return;
void KFileItemModelRolesUpdater::slotPreviewFailed(const KFileItem& item)
{
+ const int oldNumberOfPendingItems = m_pendingVisibleItems.count() + m_pendingInvisibleItems.count();
+
m_pendingVisibleItems.remove(item);
m_pendingInvisibleItems.remove(item);
+ const int newNumberOfPendingItems = m_pendingVisibleItems.count() + m_pendingInvisibleItems.count();
+
+ if (oldNumberOfPendingItems == newNumberOfPendingItems) {
+ // 'item' could not be removed from either of the sets. It looks like
+ // we have hit bug 304986. Replace the items in the sets by the items
+ // in the model to work around the problem.
+ // NOTE: This workaround is not needed any more in KDE 4.10.
+ m_pendingVisibleItems = sortedItems(m_pendingVisibleItems).toSet();
+ m_pendingInvisibleItems = sortedItems(m_pendingInvisibleItems).toSet();
+ }
+
const bool clearPreviews = m_clearPreviews;
m_clearPreviews = true;
applyResolvedRoles(item, ResolveAll);
bool changed = false;
for (int i = 0; i <= 1; ++i) {
QSet<KFileItem>& pendingItems = (i == 0) ? m_pendingVisibleItems : m_pendingInvisibleItems;
- QSetIterator<KFileItem> it(pendingItems);
- while (it.hasNext() && !changed && resolvedCount < MaxResolveItemsCount) {
- const KFileItem item = it.next();
- pendingItems.remove(item);
- changed = applyResolvedRoles(item, ResolveAll);
+ QSet<KFileItem>::iterator it = pendingItems.begin();
+ while (it != pendingItems.end() && !changed && resolvedCount < MaxResolveItemsCount) {
+ changed = applyResolvedRoles(*it, ResolveAll);
+ it = pendingItems.erase(it);
++resolvedCount;
}
}
startUpdating(itemRanges);
}
-void KFileItemModelRolesUpdater::applyChangedNepomukRoles(const Nepomuk::Resource& resource)
+void KFileItemModelRolesUpdater::applyChangedNepomukRoles(const Nepomuk2::Resource& resource)
{
#ifdef HAVE_NEPOMUK
- const KUrl itemUrl = m_nepomukUriItems.value(resource.resourceUri());
+ const KUrl itemUrl = m_nepomukUriItems.value(resource.uri());
const KFileItem item = m_model->fileItem(itemUrl);
if (item.isNull()) {
if (hasValidIndexRange) {
// Move all current pending visible items that are not visible anymore
// to the pending invisible items.
- QSetIterator<KFileItem> it(m_pendingVisibleItems);
- while (it.hasNext()) {
- const KFileItem item = it.next();
+ QSet<KFileItem>::iterator it = m_pendingVisibleItems.begin();
+ while (it != m_pendingVisibleItems.end()) {
+ const KFileItem item = *it;
const int index = m_model->index(item);
if (index < m_firstVisibleIndex || index > m_lastVisibleIndex) {
- m_pendingVisibleItems.remove(item);
+ it = m_pendingVisibleItems.erase(it);
m_pendingInvisibleItems.insert(item);
+ } else {
+ ++it;
}
}
}
// MIME-type in a fast way.
QElapsedTimer timer;
timer.start();
+
KFileItemList itemSubSet;
- for (int i = 0; i < items.count(); ++i) {
+ const int count = items.count();
+ itemSubSet.reserve(count);
+ for (int i = 0; i < count; ++i) {
KFileItem item = items.at(i);
item.determineMimeType();
- itemSubSet.append(items.at(i));
+ itemSubSet.append(item);
if (timer.elapsed() > MaxBlockTimeout) {
#ifdef KFILEITEMMODELROLESUPDATER_DEBUG
kDebug() << "Maximum time of" << MaxBlockTimeout << "ms exceeded, creating only previews for"
timer.start();
// Resolve the MIME type of all visible items
- QSetIterator<KFileItem> visibleIt(m_pendingVisibleItems);
- while (visibleIt.hasNext()) {
- const KFileItem item = visibleIt.next();
+ QSet<KFileItem>::iterator visibleIt = m_pendingVisibleItems.begin();
+ while (visibleIt != m_pendingVisibleItems.end()) {
+ const KFileItem item = *visibleIt;
if (!hasSlowRoles) {
Q_ASSERT(!m_pendingInvisibleItems.contains(item));
// All roles will be resolved by applyResolvedRoles()
- m_pendingVisibleItems.remove(item);
+ visibleIt = m_pendingVisibleItems.erase(visibleIt);
+ } else {
+ ++visibleIt;
}
applyResolvedRoles(item, resolveHint);
++resolvedCount;
m_pendingInvisibleItems.insert(item);
}
}
- for (int i = m_lastVisibleIndex + 1; i < m_model->count(); ++i) {
+ const int count = m_model->count();
+ for (int i = m_lastVisibleIndex + 1; i < count; ++i) {
const KFileItem item = m_model->fileItem(i);
if (!item.isNull()) {
m_pendingInvisibleItems.insert(item);
// Trigger a preview generation of all pending items. Assure that the visible
// pending items get generated first.
- QSet<KFileItem> pendingItems;
- pendingItems += m_pendingVisibleItems;
- pendingItems += m_pendingInvisibleItems;
- resetPendingRoles();
- Q_ASSERT(m_pendingVisibleItems.isEmpty());
- Q_ASSERT(m_pendingInvisibleItems.isEmpty());
+ // Step 1: Check if any items in m_pendingVisibleItems are not visible any more
+ // and move them to m_pendingInvisibleItems.
+ QSet<KFileItem>::iterator itVisible = m_pendingVisibleItems.begin();
+ while (itVisible != m_pendingVisibleItems.end()) {
+ const KFileItem item = *itVisible;
+ if (item.isNull()) {
+ itVisible = m_pendingVisibleItems.erase(itVisible);
+ continue;
+ }
- QSetIterator<KFileItem> it(pendingItems);
- while (it.hasNext()) {
- const KFileItem item = it.next();
+ const int index = m_model->index(item);
+ if (!hasValidIndexRange || (index >= m_firstVisibleIndex && index <= m_lastVisibleIndex)) {
+ ++itVisible;
+ } else {
+ itVisible = m_pendingVisibleItems.erase(itVisible);
+ m_pendingInvisibleItems.insert(item);
+ }
+ }
+
+ // Step 2: Check if any items in m_pendingInvisibleItems have become visible
+ // and move them to m_pendingVisibleItems.
+ QSet<KFileItem>::iterator itInvisible = m_pendingInvisibleItems.begin();
+ while (itInvisible != m_pendingInvisibleItems.end()) {
+ const KFileItem item = *itInvisible;
if (item.isNull()) {
+ itInvisible = m_pendingInvisibleItems.erase(itInvisible);
continue;
}
const int index = m_model->index(item);
if (!hasValidIndexRange || (index >= m_firstVisibleIndex && index <= m_lastVisibleIndex)) {
+ itInvisible = m_pendingInvisibleItems.erase(itInvisible);
m_pendingVisibleItems.insert(item);
} else {
- m_pendingInvisibleItems.insert(item);
+ ++itInvisible;
}
}
#ifdef HAVE_NEPOMUK
if (m_nepomukResourceWatcher) {
const KNepomukRolesProvider& rolesProvider = KNepomukRolesProvider::instance();
- Nepomuk::Resource resource(item.nepomukUri());
+ Nepomuk2::Resource resource(item.nepomukUri());
QHashIterator<QByteArray, QVariant> it(rolesProvider.roleValues(resource, m_roles));
while (it.hasNext()) {
it.next();
data.insert(it.key(), it.value());
}
- QUrl uri = resource.resourceUri();
+ QUrl uri = resource.uri();
if (uri.isEmpty()) {
// TODO: Is there another way to explicitly create a resource?
// We need a resource to be able to track it for changes.
resource.setRating(0);
- uri = resource.resourceUri();
+ uri = resource.uri();
}
if (!uri.isEmpty() && !m_nepomukUriItems.contains(uri)) {
m_nepomukResourceWatcher->addResource(resource);