From 0706af30c0e08c105e86d49f310f9f0e0f13c3e6 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Sat, 1 Aug 2009 16:07:42 +0000 Subject: [PATCH] Assure that the revision control observer receives the correct revision states of subtree-items. svn path=/trunk/KDE/kdebase/apps/; revision=1005646 --- src/dolphinfileitemdelegate.cpp | 2 +- src/revisioncontrolobserver.cpp | 44 +++++++++++++++++++-------------- src/revisioncontrolobserver.h | 14 ++++++++--- 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/dolphinfileitemdelegate.cpp b/src/dolphinfileitemdelegate.cpp index ddd4435a7f..d0c84a6bb3 100644 --- a/src/dolphinfileitemdelegate.cpp +++ b/src/dolphinfileitemdelegate.cpp @@ -63,7 +63,7 @@ void DolphinFileItemDelegate::paint(QPainter* painter, // The currently shown items are under revision control. Show the current revision // state by adding an emblem. const QModelIndex dirIndex = proxyModel->mapToSource(index); - const QModelIndex revisionIndex = dolphinModel->index(dirIndex.row(), DolphinModel::Revision); + const QModelIndex revisionIndex = dolphinModel->index(dirIndex.row(), DolphinModel::Revision, dirIndex.parent()); const QVariant data = dolphinModel->data(revisionIndex, Qt::DecorationRole); const RevisionControlPlugin::RevisionState state = static_cast(data.toInt()); diff --git a/src/revisioncontrolobserver.cpp b/src/revisioncontrolobserver.cpp index 6ecba64c58..87f0a3aa7d 100644 --- a/src/revisioncontrolobserver.cpp +++ b/src/revisioncontrolobserver.cpp @@ -73,9 +73,12 @@ void UpdateItemStatesThread::run() { Q_ASSERT(!m_itemStates.isEmpty()); Q_ASSERT(m_plugin != 0); - - // it is assumed that all items have the same parent directory - const QString directory = m_itemStates.first().item.url().directory(KUrl::AppendTrailingSlash); + + // The items from m_itemStates may be located in different directory levels. The revision + // plugin requires the root directory for RevisionControlPlugin::beginRetrieval(). Instead + // of doing an expensive search, we utilize the knowledge of the implementation of + // RevisionControlObserver::addDirectory() to be sure that the last item contains the root. + const QString directory = m_itemStates.last().item.url().directory(KUrl::AppendTrailingSlash); QMutexLocker locker(m_pluginMutex); m_retrievedItems = false; @@ -293,22 +296,9 @@ void RevisionControlObserver::updateItemStates() return; } - const int rowCount = m_dolphinModel->rowCount(); - if (rowCount > 0) { - // Build a list of all items in the current directory and delegate - // this list to the thread, which adjusts the revision states. - QList itemStates; - for (int row = 0; row < rowCount; ++row) { - const QModelIndex index = m_dolphinModel->index(row, DolphinModel::Revision); - - ItemState itemState; - itemState.index = index; - itemState.item = m_dolphinModel->itemForIndex(index); - itemState.revision = RevisionControlPlugin::UnversionedRevision; - - itemStates.append(itemState); - } - + QList itemStates; + addDirectory(QModelIndex(), itemStates); + if (!itemStates.isEmpty()) { if (!m_silentUpdate) { emit infoMessage(i18nc("@info:status", "Updating revision information...")); } @@ -317,4 +307,20 @@ void RevisionControlObserver::updateItemStates() } } +void RevisionControlObserver::addDirectory(const QModelIndex& parentIndex, QList& itemStates) +{ + const int rowCount = m_dolphinModel->rowCount(parentIndex); + for (int row = 0; row < rowCount; ++row) { + const QModelIndex index = m_dolphinModel->index(row, DolphinModel::Revision, parentIndex); + addDirectory(index, itemStates); + + ItemState itemState; + itemState.index = index; + itemState.item = m_dolphinModel->itemForIndex(index); + itemState.revision = RevisionControlPlugin::UnversionedRevision; + + itemStates.append(itemState); + } +} + #include "revisioncontrolobserver.moc" diff --git a/src/revisioncontrolobserver.h b/src/revisioncontrolobserver.h index 51c003e43f..2fbd20fb55 100644 --- a/src/revisioncontrolobserver.h +++ b/src/revisioncontrolobserver.h @@ -95,9 +95,6 @@ private slots: void verifyDirectory(); void applyUpdatedItemStates(); -private: - void updateItemStates(); - private: struct ItemState { @@ -105,7 +102,16 @@ private: KFileItem item; RevisionControlPlugin::RevisionState revision; }; - + + void updateItemStates(); + + /** + * Adds recursively all items from the directory \p parentIndex into + * the list \p itemStates. + */ + void addDirectory(const QModelIndex& parentIndex, QList& itemStates); + +private: bool m_pendingItemStatesUpdate; bool m_revisionedDirectory; bool m_silentUpdate; // if true, no messages will be send during the update