// 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());
{
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;
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..."));
}
}
}
+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"
void verifyDirectory();
void applyUpdatedItemStates();
-private:
- void updateItemStates();
-
private:
struct ItemState
{
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