]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Merge remote-tracking branch 'origin/KDE/4.9'
authorFrank Reininghaus <frank78ac@googlemail.com>
Tue, 30 Oct 2012 06:26:30 +0000 (07:26 +0100)
committerFrank Reininghaus <frank78ac@googlemail.com>
Tue, 30 Oct 2012 06:26:30 +0000 (07:26 +0100)
1  2 
src/kitemviews/kfileitemmodelrolesupdater.cpp

index ae935819272a4ea1925bbd40718fd26e2734665a,57beb9d2f63637c4aa98ef4cef1379e24e6d2c04..936e6a740513419881b8529a968997eb954bf4a5
@@@ -40,7 -40,7 +40,7 @@@
  
  #ifdef HAVE_NEPOMUK
      #include "private/knepomukrolesprovider.h"
 -    #include "private/nepomuk/resourcewatcher.h"
 +    #include <Nepomuk2/ResourceWatcher>
  #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<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;
@@@ -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<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);
@@@ -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;
  
  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<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;
          }
      }
@@@ -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<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;
              }
          }
      }
@@@ -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<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;
@@@ -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<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;
          }
      }
  
@@@ -1071,19 -1075,19 +1097,19 @@@ QHash<QByteArray, QVariant> KFileItemMo
  #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);