]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Show the right version states for expanded items.
authorEmmanuel Pescosta <emmanuelpescosta099@gmail.com>
Sun, 29 Sep 2013 16:08:06 +0000 (18:08 +0200)
committerEmmanuel Pescosta <emmanuelpescosta099@gmail.com>
Sun, 29 Sep 2013 16:08:06 +0000 (18:08 +0200)
BUG: 267171
FIXED-IN: 4.11.3
REVIEW: 112980

src/views/versioncontrol/updateitemstatesthread.cpp
src/views/versioncontrol/updateitemstatesthread.h
src/views/versioncontrol/versioncontrolobserver.cpp
src/views/versioncontrol/versioncontrolobserver.h

index fa005f8f1a35b79fca7949a27ba3d86ce3f148b6..6be07d361a98a865c9f1f00ea8921099653bb5d1 100644 (file)
@@ -24,7 +24,7 @@
 #include <QMutexLocker>
 
 UpdateItemStatesThread::UpdateItemStatesThread(KVersionControlPlugin* plugin,
-                                     const QList<VersionControlObserver::ItemState>& itemStates) :
+                                               const QMap<QString, QVector<VersionControlObserver::ItemState> >& itemStates) :
     QThread(),
     m_globalPluginMutex(0),
     m_plugin(plugin),
@@ -47,27 +47,29 @@ void UpdateItemStatesThread::run()
     Q_ASSERT(!m_itemStates.isEmpty());
     Q_ASSERT(m_plugin);
 
-    const QString directory = m_itemStates.first().item.url().directory(KUrl::AppendTrailingSlash);
     m_retrievedItems = false;
 
     QMutexLocker pluginLocker(m_globalPluginMutex);
-    if (m_plugin->beginRetrieval(directory)) {
-        const int count = m_itemStates.count();
+    foreach (const QString& directory, m_itemStates.keys()) {
+        if (m_plugin->beginRetrieval(directory)) {
+            QVector<VersionControlObserver::ItemState>& items = m_itemStates[directory];
+            const int count = items.count();
 
-        KVersionControlPlugin2* pluginV2 = qobject_cast<KVersionControlPlugin2*>(m_plugin);
-        if (pluginV2) {
-            for (int i = 0; i < count; ++i) {
-                m_itemStates[i].version = pluginV2->itemVersion(m_itemStates[i].item);
+            KVersionControlPlugin2* pluginV2 = qobject_cast<KVersionControlPlugin2*>(m_plugin);
+            if (pluginV2) {
+                for (int i = 0; i < count; ++i) {
+                    items[i].version = pluginV2->itemVersion(items[i].item);
+                }
+            } else {
+                for (int i = 0; i < count; ++i) {
+                    const KVersionControlPlugin::VersionState state = m_plugin->versionState(items[i].item);
+                    items[i].version = static_cast<KVersionControlPlugin2::ItemVersion>(state);
+                }
             }
-        } else {
-            for (int i = 0; i < count; ++i) {
-                const KVersionControlPlugin::VersionState state = m_plugin->versionState(m_itemStates[i].item);
-                m_itemStates[i].version = static_cast<KVersionControlPlugin2::ItemVersion>(state);
-            }
-        }
 
-        m_plugin->endRetrieval();
-        m_retrievedItems = true;
+            m_plugin->endRetrieval();
+            m_retrievedItems = true;
+        }
     }
 }
 
@@ -81,7 +83,7 @@ void UpdateItemStatesThread::unlockPlugin()
     m_globalPluginMutex->unlock();
 }
 
-QList<VersionControlObserver::ItemState> UpdateItemStatesThread::itemStates() const
+QMap<QString, QVector<VersionControlObserver::ItemState> > UpdateItemStatesThread::itemStates() const
 {
     return m_itemStates;
 }
index a28169755a1b5bdc765f937b353895fec43b56a4..2914bc2b747329dfb069a33c8ea66d8c5c3f3882 100644 (file)
@@ -47,7 +47,7 @@ public:
      * @param itemStates List of items, where the states get updated.
      */
     UpdateItemStatesThread(KVersionControlPlugin* plugin,
-                           const QList<VersionControlObserver::ItemState>& itemStates);
+                           const QMap<QString, QVector<VersionControlObserver::ItemState> >& itemStates);
     virtual ~UpdateItemStatesThread();
 
     /**
@@ -63,7 +63,7 @@ public:
      */
     void unlockPlugin();
 
-    QList<VersionControlObserver::ItemState> itemStates() const;
+    QMap<QString, QVector<VersionControlObserver::ItemState> > itemStates() const;
 
     bool retrievedItems() const;
 
@@ -75,7 +75,7 @@ private:
     KVersionControlPlugin* m_plugin;
 
     bool m_retrievedItems;
-    QList<VersionControlObserver::ItemState> m_itemStates;
+    QMap<QString, QVector<VersionControlObserver::ItemState> > m_itemStates;
 };
 
 #endif // UPDATEITEMSTATESTHREAD_H
index 402a2de54c1644169ceae455486050015461ff7e..4d939ee0dffdd2e7f5c2b194cc5cb8d0ca8d5b19 100644 (file)
@@ -204,11 +204,15 @@ void VersionControlObserver::slotThreadFinished()
         return;
     }
 
-    const QList<ItemState> itemStates = thread->itemStates();
-    foreach (const ItemState& itemState, itemStates) {
-        QHash<QByteArray, QVariant> values;
-        values.insert("version", QVariant(itemState.version));
-        m_model->setData(itemState.index, values);
+    const QMap<QString, QVector<ItemState> >& itemStates = thread->itemStates();
+    foreach (const QString& directory, itemStates.keys()) {
+        const QVector<ItemState>& items = itemStates.value(directory);
+
+        foreach (const ItemState& item, items) {
+            QHash<QByteArray, QVariant> values;
+            values.insert("version", QVariant(item.version));
+            m_model->setData(item.index, values);
+        }
     }
 
     if (!m_silentUpdate) {
@@ -233,18 +237,9 @@ void VersionControlObserver::updateItemStates()
         m_pendingItemStatesUpdate = true;
         return;
     }
-    QList<ItemState> itemStates;
-    const int itemCount = m_model->count();
-    itemStates.reserve(itemCount);
 
-    for (int i = 0; i < itemCount; ++i) {
-        ItemState itemState;
-        itemState.index = i;
-        itemState.item = m_model->fileItem(i);
-        itemState.version = KVersionControlPlugin2::UnversionedVersion;
-
-        itemStates.append(itemState);
-    }
+    QMap<QString, QVector<ItemState> > itemStates;
+    createItemStatesList(itemStates);
 
     if (!itemStates.isEmpty()) {
         if (!m_silentUpdate) {
@@ -260,6 +255,42 @@ void VersionControlObserver::updateItemStates()
     }
 }
 
+int VersionControlObserver::createItemStatesList(QMap<QString, QVector<ItemState> >& itemStates,
+                                                 const int firstIndex)
+{
+    const int itemCount = m_model->count();
+    const int currentExpansionLevel = m_model->expandedParentsCount(firstIndex);
+
+    QVector<ItemState> items;
+    items.reserve(itemCount - firstIndex);
+
+    int index;
+    for (index = firstIndex; index < itemCount; ++index) {
+        const int expansionLevel = m_model->expandedParentsCount(index);
+
+        if (expansionLevel == currentExpansionLevel) {
+            ItemState itemState;
+            itemState.index = index;
+            itemState.item = m_model->fileItem(index);
+            itemState.version = KVersionControlPlugin2::UnversionedVersion;
+
+            items.append(itemState);
+        } else if (expansionLevel > currentExpansionLevel) {
+            // Sub folder
+            index += createItemStatesList(itemStates, index) - 1;
+        } else {
+            break;
+        }
+    }
+
+    if (items.count() > 0) {
+        const KUrl& url = items.first().item.url();
+        itemStates.insert(url.directory(KUrl::AppendTrailingSlash), items);
+    }
+
+    return index - firstIndex; // number of processed items
+}
+
 KVersionControlPlugin* VersionControlObserver::searchPlugin(const KUrl& directory) const
 {
     static bool pluginsAvailable = true;
index 501af7d6fd450d5198deaa8ddb6548f02471dca0..980374af97e7af70d861f276672df88ed93303cd 100644 (file)
@@ -109,6 +109,22 @@ private:
 
     void updateItemStates();
 
+    /**
+     * It creates a item state list for every expanded directory and stores
+     * this list together with the directory url in the \a itemStates map.
+     *
+     * @itemStates      A map of item state lists for every expanded directory
+     *                  and its items, where the "key" is the directory url and
+     *                  the "value" is a list of ItemStates for every item
+     *                  within this directory.
+     * @firstIndex      The index to start the processing from, this is needed
+     *                  because this function is recursively called.
+     *
+     * @return          The number of (recursive) processed items.
+     */
+    int createItemStatesList(QMap<QString, QVector<ItemState> >& itemStates,
+                             const int firstIndex = 0);
+
     /**
      * Returns a matching plugin for the given directory.
      * 0 is returned, if no matching plugin has been found.