OSDN Git Service

QmlProject: Fix creator becoming unresponsive if filesystem changes
authorKai Koehne <kai.koehne@nokia.com>
Mon, 22 Nov 2010 13:57:14 +0000 (14:57 +0100)
committerKai Koehne <kai.koehne@nokia.com>
Mon, 22 Nov 2010 14:28:38 +0000 (15:28 +0100)
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
src/plugins/qmlprojectmanager/fileformat/filefilteritems.cpp
src/plugins/qmlprojectmanager/fileformat/filefilteritems.h

index d78a3eb..85bcff1 100644 (file)
@@ -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;
index ec27e1c..42a244e 100644 (file)
@@ -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;