From a0dc497935cff83bf0c3d2594d844823a9fe6d5b Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Mon, 22 Nov 2010 14:57:14 +0100
Subject: [PATCH] QmlProject: Fix creator becoming unresponsive if filesystem
 changes

Buffer update calls to the project tree. Otherwise large updates (e.g.
renaming a directory) will block QtCreator for up to several minutes.

Reviewed-by: ckamm
---
 .../fileformat/filefilteritems.cpp                 | 14 +++++++++++++-
 .../qmlprojectmanager/fileformat/filefilteritems.h |  3 +++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/plugins/qmlprojectmanager/fileformat/filefilteritems.cpp b/src/plugins/qmlprojectmanager/fileformat/filefilteritems.cpp
index d78a3ebac93..85bcff190d5 100644
--- a/src/plugins/qmlprojectmanager/fileformat/filefilteritems.cpp
+++ b/src/plugins/qmlprojectmanager/fileformat/filefilteritems.cpp
@@ -8,7 +8,10 @@ FileFilterBaseItem::FileFilterBaseItem(QObject *parent) :
         QmlProjectContentItem(parent),
         m_recurse(RecurseDefault)
 {
+    m_updateFileListTimer.setSingleShot(true);
+    m_updateFileListTimer.setInterval(50);
     connect(&m_dirWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(updateFileList()));
+    connect(&m_updateFileListTimer, SIGNAL(timeout()), this, SLOT(updateFileListNow()));
 }
 
 QString FileFilterBaseItem::directory() const
@@ -32,7 +35,7 @@ void FileFilterBaseItem::setDefaultDirectory(const QString &dirPath)
         return;
     m_defaultDir = dirPath;
 
-    updateFileList();
+    updateFileListNow();
 }
 
 QString FileFilterBaseItem::filter() const
@@ -155,6 +158,15 @@ QString FileFilterBaseItem::absoluteDir() const
 
 void FileFilterBaseItem::updateFileList()
 {
+    if (!m_updateFileListTimer.isActive())
+        m_updateFileListTimer.start();
+}
+
+void FileFilterBaseItem::updateFileListNow()
+{
+    if (m_updateFileListTimer.isActive())
+        m_updateFileListTimer.stop();
+
     const QString projectDir = absoluteDir();
     if (projectDir.isEmpty())
         return;
diff --git a/src/plugins/qmlprojectmanager/fileformat/filefilteritems.h b/src/plugins/qmlprojectmanager/fileformat/filefilteritems.h
index ec27e1cd264..42a244e5d41 100644
--- a/src/plugins/qmlprojectmanager/fileformat/filefilteritems.h
+++ b/src/plugins/qmlprojectmanager/fileformat/filefilteritems.h
@@ -6,6 +6,7 @@
 #include <QSet>
 #include <qdeclarative.h>
 #include <QFileSystemWatcher>
+#include <QTimer>
 
 #include "qmlprojectitem.h"
 #include "filesystemwatcher.h"
@@ -49,6 +50,7 @@ signals:
 
 private slots:
     void updateFileList();
+    void updateFileListNow();
 
 private:
     QString absolutePath(const QString &path) const;
@@ -74,6 +76,7 @@ private:
 
     QSet<QString> m_files;
     FileSystemWatcher m_dirWatcher;
+    QTimer m_updateFileListTimer;
 
 
     friend class ProjectItem;
-- 
GitLab