diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 437319ef3d1..8d2efbe0ba8 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -557,7 +557,7 @@ QStringList Qt4PriFileNode::fullVPaths(const QStringList &baseVPaths, QtSupport: return vPaths; } -static QSet recursiveEnumerate(const QString &folder) +QSet Qt4PriFileNode::recursiveEnumerate(const QString &folder) { QSet result; QFileInfo fi(folder); @@ -718,10 +718,66 @@ void Qt4PriFileNode::watchFolders(const QSet &folders) m_watchedFolders = folders; } -void Qt4PriFileNode::folderChanged(const QString &changedFolder) +bool Qt4PriFileNode::folderChanged(const QString &changedFolder, const QSet &newFiles) { - Q_UNUSED(changedFolder); - scheduleUpdate(); + //qDebug()<<"########## Qt4PriFileNode::folderChanged"; + // So, we need to figure out which files changed. + + QSet addedFiles = newFiles; + addedFiles.subtract(m_recursiveEnumerateFiles); + + QSet removedFiles = m_recursiveEnumerateFiles; + removedFiles.subtract(newFiles); + + foreach (const Utils::FileName &file, removedFiles) { + if (!file.isChildOf(Utils::FileName::fromString(changedFolder))) + removedFiles.remove(file); + } + + if (addedFiles.isEmpty() && removedFiles.isEmpty()) + return false; + + m_recursiveEnumerateFiles = newFiles; + + // Apply the differences + // per file type + const QVector &fileTypes = qt4NodeStaticData()->fileTypeData; + for (int i = 0; i < fileTypes.size(); ++i) { + FileType type = fileTypes.at(i).type; + QSet add = filterFilesRecursiveEnumerata(type, addedFiles); + QSet remove = filterFilesRecursiveEnumerata(type, removedFiles); + + if (!add.isEmpty() || !remove.isEmpty()) { + // Scream :) +// qDebug()<<"For type"<type = type; + subfolder->icon = fileTypes.at(i).icon; + subfolder->fullPath = m_projectDir; + subfolder->typeName = fileTypes.at(i).typeName; + subfolder->priority = -i; + subfolder->displayName = fileTypes.at(i).typeName; + contents.virtualfolders.append(subfolder); + // create the hierarchy with subdirectories + subfolder->create(m_projectDir, m_files[type], type); + } + } + + contents.updateSubFolders(this, this); + return true; } bool Qt4PriFileNode::deploysFolder(const QString &folder) const diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h index 745b7459667..58ba3bdb89e 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.h +++ b/src/plugins/qt4projectmanager/qt4nodes.h @@ -162,7 +162,7 @@ public: bool renameFile(const FileType fileType, const QString &filePath, const QString &newFilePath); - void folderChanged(const QString &changedFolder); + bool folderChanged(const QString &changedFolder, const QSet &newFiles); bool deploysFolder(const QString &folder) const; QList runConfigurationsFor(Node *node); @@ -172,6 +172,7 @@ public: // Set by parent bool includedInExactParse() const; + static QSet recursiveEnumerate(const QString &folder); protected: void setIncludedInExactParse(bool b); static QStringList varNames(FileType type); diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index 4ba2a96919a..a5ba9339268 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -146,7 +146,7 @@ class CentralizedFolderWatcher : public QObject { Q_OBJECT public: - CentralizedFolderWatcher(QObject *parent); + CentralizedFolderWatcher(Qt4Project *parent); ~CentralizedFolderWatcher(); void watchFolders(const QList &folders, Qt4ProjectManager::Qt4PriFileNode *node); void unwatchFolders(const QList &folders, Qt4ProjectManager::Qt4PriFileNode *node); @@ -157,6 +157,7 @@ private slots: void delayedFolderChanged(const QString &folder); private: + Qt4Project *m_project; QSet recursiveDirs(const QString &folder); QFileSystemWatcher m_watcher; QMultiMap m_map; @@ -1215,7 +1216,8 @@ namespace { bool debugCFW = false; } -CentralizedFolderWatcher::CentralizedFolderWatcher(QObject *parent) : QObject(parent) +CentralizedFolderWatcher::CentralizedFolderWatcher(Qt4Project *parent) + : QObject(parent), m_project(parent) { m_compressTimer.setSingleShot(true); m_compressTimer.setInterval(200); @@ -1337,12 +1339,19 @@ void CentralizedFolderWatcher::delayedFolderChanged(const QString &folder) QString dir = folder; const QChar slash = QLatin1Char('/'); + bool newOrRemovedFiles = false; while (true) { if (!dir.endsWith(slash)) dir.append(slash); QList nodes = m_map.values(dir); - foreach (Qt4ProjectManager::Qt4PriFileNode *node, nodes) { - node->folderChanged(folder); + if (!nodes.isEmpty()) { + // Collect all the files + QSet newFiles; + newFiles += Qt4PriFileNode::recursiveEnumerate(folder); + foreach (Qt4ProjectManager::Qt4PriFileNode *node, nodes) { + newOrRemovedFiles = newOrRemovedFiles + || node->folderChanged(folder, newFiles); + } } // Chop off last part, and break if there's nothing to chop off @@ -1357,7 +1366,6 @@ void CentralizedFolderWatcher::delayedFolderChanged(const QString &folder) dir.truncate(index + 1); } - QString folderWithSlash = folder; if (!folder.endsWith(slash)) folderWithSlash.append(slash); @@ -1374,6 +1382,11 @@ void CentralizedFolderWatcher::delayedFolderChanged(const QString &folder) m_watcher.addPaths(tmp.toList()); m_recursiveWatchedFolders += tmp; } + + if (newOrRemovedFiles) { + m_project->updateFileList(); + m_project->updateCodeModels(); + } } bool Qt4Project::needsConfiguration() const