+/**
+ * The performance of updating the revision state of items depends
+ * on the used plugin. To prevent that Dolphin gets blocked by a
+ * slow plugin, the updating is delegated to a thread.
+ */
+class LIBDOLPHINPRIVATE_EXPORT UpdateItemStatesThread : public QThread
+{
+public:
+ UpdateItemStatesThread(QObject* parent);
+ void setData(RevisionControlPlugin* plugin,
+ const QList<RevisionControlObserver::ItemState>& itemStates);
+ QList<RevisionControlObserver::ItemState> itemStates() const;
+
+protected:
+ virtual void run();
+
+private:
+ RevisionControlPlugin* m_plugin;
+ QList<RevisionControlObserver::ItemState> m_itemStates;
+};
+
+UpdateItemStatesThread::UpdateItemStatesThread(QObject* parent) :
+ QThread(parent)
+{
+}
+
+void UpdateItemStatesThread::setData(RevisionControlPlugin* plugin,
+ const QList<RevisionControlObserver::ItemState>& itemStates)
+{
+ m_plugin = plugin;
+ m_itemStates = itemStates;
+}
+
+void UpdateItemStatesThread::run()
+{
+ Q_ASSERT(m_itemStates.count() > 0);
+ 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);
+
+ if (m_plugin->beginRetrieval(directory)) {
+ const int count = m_itemStates.count();
+ for (int i = 0; i < count; ++i) {
+ m_itemStates[i].revision = m_plugin->revisionState(m_itemStates[i].item);
+ }
+ m_plugin->endRetrieval();
+ }
+}
+
+QList<RevisionControlObserver::ItemState> UpdateItemStatesThread::itemStates() const
+{
+ return m_itemStates;
+}
+
+// ---
+