]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Assure that the revision control observer receives the correct revision states of...
authorPeter Penz <peter.penz19@gmail.com>
Sat, 1 Aug 2009 16:07:42 +0000 (16:07 +0000)
committerPeter Penz <peter.penz19@gmail.com>
Sat, 1 Aug 2009 16:07:42 +0000 (16:07 +0000)
svn path=/trunk/KDE/kdebase/apps/; revision=1005646

src/dolphinfileitemdelegate.cpp
src/revisioncontrolobserver.cpp
src/revisioncontrolobserver.h

index ddd4435a7fa3e178644c57789911669683f20883..d0c84a6bb3e0de12b0f33ce11b7491bc0d43d5e0 100644 (file)
@@ -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<RevisionControlPlugin::RevisionState>(data.toInt());
 
index 6ecba64c588c307ea8892947b0d14e7973677c1a..87f0a3aa7dcd2435ca7fe2bfa7fdd386aec5cd31 100644 (file)
@@ -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<ItemState> 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<ItemState> 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<ItemState>& 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"
index 51c003e43fcda129d70567c6b2d3a9513ea8ef5c..2fbd20fb558bfe12256ba43d18fdc55c8c9d26a5 100644 (file)
@@ -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<ItemState>& itemStates);
+
+private:
     bool m_pendingItemStatesUpdate;
     bool m_revisionedDirectory;
     bool m_silentUpdate; // if true, no messages will be send during the update