From: Frank Reininghaus Date: Tue, 30 Oct 2012 06:26:30 +0000 (+0100) Subject: Merge remote-tracking branch 'origin/KDE/4.9' X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/1d9d83b4342031c94a55cc4e6b73ade461b7c17d?hp=-c Merge remote-tracking branch 'origin/KDE/4.9' --- 1d9d83b4342031c94a55cc4e6b73ade461b7c17d diff --combined src/kitemviews/kfileitemmodelrolesupdater.cpp index ae9358192,57beb9d2f..936e6a740 --- a/src/kitemviews/kfileitemmodelrolesupdater.cpp +++ b/src/kitemviews/kfileitemmodelrolesupdater.cpp @@@ -40,7 -40,7 +40,7 @@@ #ifdef HAVE_NEPOMUK #include "private/knepomukrolesprovider.h" - #include "private/nepomuk/resourcewatcher.h" + #include #endif // Required includes for subItemsCount(): @@@ -92,6 -92,7 +92,6 @@@ KFileItemModelRolesUpdater::KFileItemMo , m_nepomukResourceWatcher(0), m_nepomukUriItems() #endif - { Q_ASSERT(model); @@@ -276,15 -277,15 +276,15 @@@ void KFileItemModelRolesUpdater::setRol 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)), - 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)), + this, SLOT(applyChangedNepomukRoles(Nepomuk2::Resource))); } else if (!hasNepomukRole && m_nepomukResourceWatcher) { delete m_nepomukResourceWatcher; m_nepomukResourceWatcher = 0; @@@ -351,14 -352,14 +351,14 @@@ void KFileItemModelRolesUpdater::slotIt if (m_nepomukResourceWatcher) { // Don't let the ResourceWatcher watch for removed items if (allItemsRemoved) { - m_nepomukResourceWatcher->setResources(QList()); + m_nepomukResourceWatcher->setResources(QList()); m_nepomukResourceWatcher->stop(); m_nepomukUriItems.clear(); } else { - QList newResources; - const QList oldResources = m_nepomukResourceWatcher->resources(); - foreach (const Nepomuk::Resource& resource, oldResources) { - const QUrl uri = resource.resourceUri(); + QList newResources; + const QList 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); @@@ -438,9 -439,22 +438,22 @@@ void KFileItemModelRolesUpdater::slotSo 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; @@@ -498,9 -512,22 +511,22 @@@ 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); @@@ -541,10 -568,11 +567,10 @@@ void KFileItemModelRolesUpdater::resolv bool changed = false; for (int i = 0; i <= 1; ++i) { QSet& pendingItems = (i == 0) ? m_pendingVisibleItems : m_pendingInvisibleItems; - QSetIterator it(pendingItems); - while (it.hasNext() && !changed && resolvedCount < MaxResolveItemsCount) { - const KFileItem item = it.next(); - pendingItems.remove(item); - changed = applyResolvedRoles(item, ResolveAll); + QSet::iterator it = pendingItems.begin(); + while (it != pendingItems.end() && !changed && resolvedCount < MaxResolveItemsCount) { + changed = applyResolvedRoles(*it, ResolveAll); + it = pendingItems.erase(it); ++resolvedCount; } } @@@ -588,10 -616,10 +614,10 @@@ void KFileItemModelRolesUpdater::resolv 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()) { @@@ -654,15 -682,13 +680,15 @@@ void KFileItemModelRolesUpdater::startU if (hasValidIndexRange) { // Move all current pending visible items that are not visible anymore // to the pending invisible items. - QSetIterator it(m_pendingVisibleItems); - while (it.hasNext()) { - const KFileItem item = it.next(); + QSet::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; } } } @@@ -709,14 -735,11 +735,14 @@@ void KFileItemModelRolesUpdater::startP // 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" @@@ -771,15 -794,13 +797,15 @@@ void KFileItemModelRolesUpdater::resolv timer.start(); // Resolve the MIME type of all visible items - QSetIterator visibleIt(m_pendingVisibleItems); - while (visibleIt.hasNext()) { - const KFileItem item = visibleIt.next(); + QSet::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; @@@ -877,8 -898,7 +903,8 @@@ void KFileItemModelRolesUpdater::sortAn 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); @@@ -901,42 -921,26 +927,42 @@@ void KFileItemModelRolesUpdater::sortAn // Trigger a preview generation of all pending items. Assure that the visible // pending items get generated first. - QSet 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::iterator itVisible = m_pendingVisibleItems.begin(); + while (itVisible != m_pendingVisibleItems.end()) { + const KFileItem item = *itVisible; + if (item.isNull()) { + itVisible = m_pendingVisibleItems.erase(itVisible); + continue; + } - QSetIterator 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::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; } } @@@ -1071,19 -1075,19 +1097,19 @@@ QHash KFileItemMo #ifdef HAVE_NEPOMUK if (m_nepomukResourceWatcher) { const KNepomukRolesProvider& rolesProvider = KNepomukRolesProvider::instance(); - Nepomuk::Resource resource(item.nepomukUri()); + Nepomuk2::Resource resource(item.nepomukUri()); QHashIterator 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);