diff --git a/src/plugins/genericprojectmanager/genericprojectnodes.cpp b/src/plugins/genericprojectmanager/genericprojectnodes.cpp index 1db52cc5f3eb35e4f3a3353bdb2e4e4faabbf180..3d5bc3e4ce28af079b026a80df2f0b23e5ad7bcf 100644 --- a/src/plugins/genericprojectmanager/genericprojectnodes.cpp +++ b/src/plugins/genericprojectmanager/genericprojectnodes.cpp @@ -50,36 +50,88 @@ Core::IFile *GenericProjectNode::projectFile() const QString GenericProjectNode::projectFilePath() const { return _projectFile->fileName(); } +static QStringList convertToAbsoluteFiles(const QDir &dir, const QStringList &paths) +{ + QStringList absolutePaths; + foreach (const QString &file, paths) { + QFileInfo fileInfo(dir, file); + absolutePaths.append(fileInfo.absoluteFilePath()); + } + absolutePaths.removeDuplicates(); + return absolutePaths; +} + void GenericProjectNode::refresh() { + using namespace ProjectExplorer; + + removeFileNodes(fileNodes(), this); + removeFolderNodes(subFolderNodes(), this); + + QDir projectPath(path()); + QSettings projectInfo(projectFilePath(), QSettings::IniFormat); - _files = projectInfo.value(QLatin1String("files")).toStringList(); - _generated = projectInfo.value(QLatin1String("generated")).toStringList(); - _includePaths = projectInfo.value(QLatin1String("includes")).toStringList(); + _files = convertToAbsoluteFiles(projectPath, projectInfo.value(QLatin1String("files")).toStringList()); + _generated = convertToAbsoluteFiles(projectPath, projectInfo.value(QLatin1String("generated")).toStringList()); + _includePaths = convertToAbsoluteFiles(projectPath, projectInfo.value(QLatin1String("includes")).toStringList()); _defines = projectInfo.value(QLatin1String("defines")).toStringList(); _toolChainId = projectInfo.value(QLatin1String("toolchain"), QLatin1String("gcc")).toString().toLower(); - using namespace ProjectExplorer; - - QList<FileNode *> fileNodes; - - FileNode *projectFileNode = new FileNode(projectFilePath(), ProjectFileType, /*generated = */ false); - fileNodes.append(projectFileNode); + FileNode *projectFileNode = new FileNode(projectFilePath(), ProjectFileType, + /* generated = */ false); + addFileNodes(QList<FileNode *>() << projectFileNode, this); - QDir projectPath(path()); + QHash<QString, FolderNode *> folders; + QHash<FolderNode *, QStringList> filesInFolder; + QList<FolderNode *> folderNodes; foreach (const QString &file, _files) { QFileInfo fileInfo(projectPath, file); - QString filePath = fileInfo.absoluteFilePath(); - FileType fileType = SourceType; // ### FIXME - FileNode *fileNode = new FileNode(filePath, fileType, /*generated = */ false); + if (! fileInfo.isFile()) + continue; // not a file. + + QString folderPath = fileInfo.canonicalPath(); + if (! folderPath.startsWith(path())) { + qDebug() << "*** skip:" << folderPath; + continue; + } + + folderPath = folderPath.mid(path().length() + 1); - fileNodes.append(fileNode); + FolderNode *folder = folders.value(folderPath); + if (! folder) { + folder = new FolderNode(folderPath); + folders.insert(folderPath, folder); + + folderNodes.append(folder); + } + + filesInFolder[folder].append(fileInfo.canonicalFilePath()); } - addFileNodes(fileNodes, this); + addFolderNodes(folderNodes, this); + + QHashIterator<FolderNode *, QStringList> it(filesInFolder); + while (it.hasNext()) { + it.next(); + + FolderNode *folder = it.key(); + QStringList files = it.value(); + + QList<FileNode *> fileNodes; + foreach (const QString &filePath, files) { + QFileInfo fileInfo(projectPath, filePath); + + FileNode *fileNode = new FileNode(fileInfo.absoluteFilePath(), + SourceType, /*generated = */ false); + + fileNodes.append(fileNode); + } + + addFileNodes(fileNodes, folder); + } } QStringList GenericProjectNode::files() const