diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp index 3d4c3ccd87d..f14d9956df4 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.cpp +++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -462,14 +463,14 @@ void QbsGroupNode::updateQbsGroupData(const qbs::GroupData &grp, const QString & idx->setPathAndLine(Utils::FileName::fromString(grp.location().filePath()), grp.location().line()); - setupFiles(this, grp.allFilePaths(), productPath, updateExisting); + setupFiles(this, grp, grp.allFilePaths(), productPath, updateExisting); if (updateExisting) emitNodeUpdated(); } -void QbsGroupNode::setupFiles(ProjectExplorer::FolderNode *root, const QStringList &files, - const QString &productPath, bool updateExisting) +void QbsGroupNode::setupFiles(ProjectExplorer::FolderNode *root, const qbs::GroupData &group, + const QStringList &files, const QString &productPath, bool updateExisting) { // Build up a tree of nodes: FileTreeNode tree; @@ -487,10 +488,10 @@ void QbsGroupNode::setupFiles(ProjectExplorer::FolderNode *root, const QStringLi FileTreeNode::reorder(&tree, productPath); FileTreeNode::simplify(&tree); - setupFolder(root, &tree, productPath, updateExisting); + setupFolder(root, group, &tree, productPath, updateExisting); } -void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root, +void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root, const qbs::GroupData &group, const FileTreeNode *fileTree, const QString &baseDir, bool updateExisting) { @@ -531,7 +532,7 @@ void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root, if (updateExisting) fn->emitNodeUpdated(); } else { - fn = new ProjectExplorer::FileNode(path, ProjectExplorer::UnknownFileType, false); + fn = new ProjectExplorer::FileNode(path, fileType(group, c->path()), false); filesToAdd.append(fn); } continue; @@ -556,7 +557,7 @@ void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root, fn->setDisplayName(displayNameFromPath(c->path(), baseDir)); } - setupFolder(fn, c, c->path(), updateExisting); + setupFolder(fn, group, c, c->path(), updateExisting); } } root->removeFileNodes(filesToRemove); @@ -564,6 +565,29 @@ void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root, root->addFileNodes(filesToAdd); } +ProjectExplorer::FileType QbsGroupNode::fileType(const qbs::GroupData &group, + const QString &filePath) +{ + if (!group.isValid()) + return ProjectExplorer::UnknownFileType; + const qbs::SourceArtifact artifact = Utils::findOrDefault(group.allSourceArtifacts(), + [filePath](const qbs::SourceArtifact &sa) { return sa.filePath() == filePath; }); + QTC_ASSERT(artifact.isValid(), return ProjectExplorer::UnknownFileType); + if (artifact.fileTags().contains(QLatin1String("c")) + || artifact.fileTags().contains(QLatin1String("cpp")) + || artifact.fileTags().contains(QLatin1String("objc")) + || artifact.fileTags().contains(QLatin1String("objcpp"))) { + return ProjectExplorer::SourceType; + } + if (artifact.fileTags().contains(QLatin1String("hpp"))) + return ProjectExplorer::HeaderType; + if (artifact.fileTags().contains(QLatin1String("qrc"))) + return ProjectExplorer::ResourceType; + if (artifact.fileTags().contains(QLatin1String("ui"))) + return ProjectExplorer::FormType; + return ProjectExplorer::UnknownFileType; +} + // -------------------------------------------------------------------- // QbsProductNode: // -------------------------------------------------------------------- @@ -682,7 +706,7 @@ void QbsProductNode::setQbsProductData(const qbs::Project &project, const qbs::P foreach (const qbs::GroupData &grp, prd.groups()) { if (grp.name() == prd.name() && grp.location() == prd.location()) { // Set implicit product group right onto this node: - QbsGroupNode::setupFiles(this, grp.allFilePaths(), productPath, updateExisting); + QbsGroupNode::setupFiles(this, grp, grp.allFilePaths(), productPath, updateExisting); continue; } QbsGroupNode *gn = findGroupNode(grp.name()); @@ -855,7 +879,8 @@ void QbsRootProjectNode::update() if (Utils::FileName::fromString(f).isChildOf(base)) projectBuildSystemFiles.append(f); } - QbsGroupNode::setupFiles(m_buildSystemFiles, projectBuildSystemFiles, base.toString(), false); + QbsGroupNode::setupFiles(m_buildSystemFiles, qbs::GroupData(), projectBuildSystemFiles, + base.toString(), false); update(m_project->qbsProject(), m_project->qbsProjectData()); } diff --git a/src/plugins/qbsprojectmanager/qbsnodes.h b/src/plugins/qbsprojectmanager/qbsnodes.h index f705495cced..fe30597800d 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.h +++ b/src/plugins/qbsprojectmanager/qbsnodes.h @@ -108,12 +108,15 @@ public: QString productPath() const; - static void setupFiles(FolderNode *root, const QStringList &files, + // group can be invalid + static void setupFiles(FolderNode *root, const qbs::GroupData &group, const QStringList &files, const QString &productPath, bool updateExisting); private: - static void setupFolder(ProjectExplorer::FolderNode *folder, - const FileTreeNode *subFileTree, const QString &baseDir, bool updateExisting); + static void setupFolder(ProjectExplorer::FolderNode *folder, const qbs::GroupData &group, + const FileTreeNode *subFileTree, const QString &baseDir, bool updateExisting); + static ProjectExplorer::FileType fileType(const qbs::GroupData &group, const QString &filePath); + qbs::GroupData m_qbsGroupData; QString m_productPath; diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 6dc7a181e09..07da504eef4 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -254,6 +254,25 @@ bool QbsProject::ensureWriteableQbsFile(const QString &file) return true; } +qbs::GroupData QbsProject::reRetrieveGroupData(const qbs::ProductData &oldProduct, + const qbs::GroupData &oldGroup) +{ + qbs::GroupData newGroup; + foreach (const qbs::ProductData &pd, m_projectData.allProducts()) { + if (uniqueProductName(pd) == uniqueProductName(oldProduct)) { + foreach (const qbs::GroupData &gd, pd.groups()) { + if (gd.location() == oldGroup.location()) { + newGroup = gd; + break; + } + } + break; + } + } + QTC_CHECK(newGroup.isValid()); + return newGroup; +} + bool QbsProject::addFilesToProduct(QbsBaseProjectNode *node, const QStringList &filePaths, const qbs::ProductData &productData, const qbs::GroupData &groupData, QStringList *notAdded) { @@ -273,7 +292,8 @@ bool QbsProject::addFilesToProduct(QbsBaseProjectNode *node, const QStringList & } if (notAdded->count() != filePaths.count()) { m_projectData = m_qbsProject.projectData(); - QbsGroupNode::setupFiles(node, allPaths, QFileInfo(productFilePath).absolutePath(), true); + QbsGroupNode::setupFiles(node, reRetrieveGroupData(productData, groupData), + allPaths, QFileInfo(productFilePath).absolutePath(), true); m_rootProjectNode->update(); } return notAdded->isEmpty(); @@ -300,7 +320,8 @@ bool QbsProject::removeFilesFromProduct(QbsBaseProjectNode *node, const QStringL } if (notRemoved->count() != filePaths.count()) { m_projectData = m_qbsProject.projectData(); - QbsGroupNode::setupFiles(node, allPaths, QFileInfo(productFilePath).absolutePath(), true); + QbsGroupNode::setupFiles(node, reRetrieveGroupData(productData, groupData), allPaths, + QFileInfo(productFilePath).absolutePath(), true); m_rootProjectNode->update(); } return notRemoved->isEmpty(); diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h index b0fb7ad959d..67ccbfc6f4f 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.h +++ b/src/plugins/qbsprojectmanager/qbsproject.h @@ -144,6 +144,9 @@ private: static bool ensureWriteableQbsFile(const QString &file); + qbs::GroupData reRetrieveGroupData(const qbs::ProductData &oldProduct, + const qbs::GroupData &oldGroup); + QbsManager *const m_manager; const QString m_projectName; const QString m_fileName;