From c44b9e685e55c419be2d139744233d232da82898 Mon Sep 17 00:00:00 2001 From: Emmanuel Pescosta Date: Sun, 29 Sep 2013 18:08:06 +0200 Subject: [PATCH] Show the right version states for expanded items. BUG: 267171 FIXED-IN: 4.11.3 REVIEW: 112980 --- .../versioncontrol/updateitemstatesthread.cpp | 36 ++++++----- .../versioncontrol/updateitemstatesthread.h | 6 +- .../versioncontrol/versioncontrolobserver.cpp | 63 ++++++++++++++----- .../versioncontrol/versioncontrolobserver.h | 16 +++++ 4 files changed, 85 insertions(+), 36 deletions(-) diff --git a/src/views/versioncontrol/updateitemstatesthread.cpp b/src/views/versioncontrol/updateitemstatesthread.cpp index fa005f8f1a..6be07d361a 100644 --- a/src/views/versioncontrol/updateitemstatesthread.cpp +++ b/src/views/versioncontrol/updateitemstatesthread.cpp @@ -24,7 +24,7 @@ #include UpdateItemStatesThread::UpdateItemStatesThread(KVersionControlPlugin* plugin, - const QList& itemStates) : + const QMap >& 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& items = m_itemStates[directory]; + const int count = items.count(); - KVersionControlPlugin2* pluginV2 = qobject_cast(m_plugin); - if (pluginV2) { - for (int i = 0; i < count; ++i) { - m_itemStates[i].version = pluginV2->itemVersion(m_itemStates[i].item); - } - } 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(state); + KVersionControlPlugin2* pluginV2 = qobject_cast(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(state); + } } + + m_plugin->endRetrieval(); + m_retrievedItems = true; } - - m_plugin->endRetrieval(); - m_retrievedItems = true; } } @@ -81,7 +83,7 @@ void UpdateItemStatesThread::unlockPlugin() m_globalPluginMutex->unlock(); } -QList UpdateItemStatesThread::itemStates() const +QMap > UpdateItemStatesThread::itemStates() const { return m_itemStates; } diff --git a/src/views/versioncontrol/updateitemstatesthread.h b/src/views/versioncontrol/updateitemstatesthread.h index a28169755a..2914bc2b74 100644 --- a/src/views/versioncontrol/updateitemstatesthread.h +++ b/src/views/versioncontrol/updateitemstatesthread.h @@ -47,7 +47,7 @@ public: * @param itemStates List of items, where the states get updated. */ UpdateItemStatesThread(KVersionControlPlugin* plugin, - const QList& itemStates); + const QMap >& itemStates); virtual ~UpdateItemStatesThread(); /** @@ -63,7 +63,7 @@ public: */ void unlockPlugin(); - QList itemStates() const; + QMap > itemStates() const; bool retrievedItems() const; @@ -75,7 +75,7 @@ private: KVersionControlPlugin* m_plugin; bool m_retrievedItems; - QList m_itemStates; + QMap > m_itemStates; }; #endif // UPDATEITEMSTATESTHREAD_H diff --git a/src/views/versioncontrol/versioncontrolobserver.cpp b/src/views/versioncontrol/versioncontrolobserver.cpp index 402a2de54c..4d939ee0df 100644 --- a/src/views/versioncontrol/versioncontrolobserver.cpp +++ b/src/views/versioncontrol/versioncontrolobserver.cpp @@ -204,11 +204,15 @@ void VersionControlObserver::slotThreadFinished() return; } - const QList itemStates = thread->itemStates(); - foreach (const ItemState& itemState, itemStates) { - QHash values; - values.insert("version", QVariant(itemState.version)); - m_model->setData(itemState.index, values); + const QMap >& itemStates = thread->itemStates(); + foreach (const QString& directory, itemStates.keys()) { + const QVector& items = itemStates.value(directory); + + foreach (const ItemState& item, items) { + QHash 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 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 > itemStates; + createItemStatesList(itemStates); if (!itemStates.isEmpty()) { if (!m_silentUpdate) { @@ -260,6 +255,42 @@ void VersionControlObserver::updateItemStates() } } +int VersionControlObserver::createItemStatesList(QMap >& itemStates, + const int firstIndex) +{ + const int itemCount = m_model->count(); + const int currentExpansionLevel = m_model->expandedParentsCount(firstIndex); + + QVector 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; diff --git a/src/views/versioncontrol/versioncontrolobserver.h b/src/views/versioncontrol/versioncontrolobserver.h index 501af7d6fd..980374af97 100644 --- a/src/views/versioncontrol/versioncontrolobserver.h +++ b/src/views/versioncontrol/versioncontrolobserver.h @@ -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 >& itemStates, + const int firstIndex = 0); + /** * Returns a matching plugin for the given directory. * 0 is returned, if no matching plugin has been found.