diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp index 2f12471cf22f9e995b46a07b2cd579bfdb8c97b8..c0753eacbef1d74baf4b79d61d9886eb7034dbb7 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.cpp +++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp @@ -263,10 +263,11 @@ void QbsGroupNode::setGroup(const qbs::GroupData *group, const QString &productP m_productPath = productPath; + // Set Product file node used to jump to the product setPath(group->location().fileName); setDisplayName(group->name()); - // Set Product file node used to jump to the product + // set up file node... QbsFileNode *indexFile = 0; if (!m_group) { indexFile = new QbsFileNode(group->location().fileName, @@ -280,6 +281,15 @@ void QbsGroupNode::setGroup(const qbs::GroupData *group, const QString &productP indexFile->emitNodeUpdated(); } + m_group = group; + + setGroup(this, group, productPath, QList<ProjectExplorer::Node *>() << indexFile); + emitNodeUpdated(); +} + +void QbsGroupNode::setGroup(QbsBaseProjectNode *root, const qbs::GroupData *group, + const QString &productPath, QList<ProjectExplorer::Node *> keepers) +{ // Build up a tree of nodes: FileTreeNode *tree = new FileTreeNode(QString()); @@ -293,16 +303,13 @@ void QbsGroupNode::setGroup(const qbs::GroupData *group, const QString &productP FileTreeNode::reorder(tree, productPath, tree); FileTreeNode::simplify(tree); - setupFolders(this, tree, productPath, QList<ProjectExplorer::Node *>() << indexFile); - + setupFolders(root, root, tree, productPath, keepers); delete tree; - - m_group = group; - emitNodeUpdated(); } -void QbsGroupNode::setupFolders(ProjectExplorer::FolderNode *root, FileTreeNode *node, - const QString &baseDirPath, QList<ProjectExplorer::Node *> keepers) +void QbsGroupNode::setupFolders(QbsBaseProjectNode *topLevel, ProjectExplorer::FolderNode *root, + FileTreeNode *node, const QString &baseDirPath, + QList<ProjectExplorer::Node *> keepers) { QList<ProjectExplorer::FileNode *> filesToRemove; foreach (ProjectExplorer::FileNode *fn, root->fileNodes()) { @@ -338,7 +345,7 @@ void QbsGroupNode::setupFolders(ProjectExplorer::FolderNode *root, FileTreeNode ProjectExplorer::FolderNode *fn = root->findSubFolder(path); if (path == baseDirPath) { - setupFolders(root, c, c->path(), foldersToKeep); + setupFolders(topLevel, root, c, c->path(), foldersToKeep); continue; } @@ -350,14 +357,14 @@ void QbsGroupNode::setupFolders(ProjectExplorer::FolderNode *root, FileTreeNode foldersToRemove.removeOne(fn); } else { fn = new ProjectExplorer::FolderNode(path); - addFolderNodes(QList<ProjectExplorer::FolderNode *>() << fn, root); + topLevel->addFolderNodes(QList<ProjectExplorer::FolderNode *>() << fn, root); } foldersToKeep.append(fn); - setupFolders(fn, c, c->path()); + setupFolders(topLevel, fn, c, c->path()); } - addFileNodes(filesToAdd, root); - removeFileNodes(filesToRemove, root); - removeFolderNodes(foldersToRemove, root); + topLevel->removeFileNodes(filesToRemove, root); + topLevel->removeFolderNodes(foldersToRemove, root); + topLevel->addFileNodes(filesToAdd, root); } // -------------------------------------------------------------------- @@ -387,28 +394,38 @@ void QbsProductNode::setProduct(const qbs::ProductData *prd) // Set Product file node used to jump to the product QList<ProjectExplorer::FileNode *> files = fileNodes(); + QList<ProjectExplorer::Node *> toKeep; if (files.isEmpty()) { - addFileNodes(QList<ProjectExplorer::FileNode *>() - << new QbsFileNode(prd->location().fileName, - ProjectExplorer::ProjectFileType, false, - prd->location().line), - this); + QbsFileNode *idx = new QbsFileNode(prd->location().fileName, + ProjectExplorer::ProjectFileType, false, + prd->location().line); + addFileNodes(QList<ProjectExplorer::FileNode *>() << idx, this); + toKeep.append(idx); } else { - QbsFileNode *qbsFile = static_cast<QbsFileNode *>(files.at(0)); - qbsFile->setPath(prd->location().fileName); - qbsFile->setLine(prd->location().line); + QbsFileNode *idx = static_cast<QbsFileNode *>(files.at(0)); + idx->setPath(prd->location().fileName); + idx->setLine(prd->location().line); + toKeep.append(idx); } QList<ProjectExplorer::ProjectNode *> toAdd; QList<ProjectExplorer::ProjectNode *> toRemove = subProjectNodes(); 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::setGroup(this, &grp, productPath, toKeep); + continue; + } QbsGroupNode *qn = findGroupNode(grp.name()); if (qn) { toRemove.removeAll(qn); + toKeep.append(qn); qn->setGroup(&grp, productPath); } else { - toAdd << new QbsGroupNode(&grp, productPath); + qn = new QbsGroupNode(&grp, productPath); + toAdd.append(qn); + toKeep.append(qn); } } diff --git a/src/plugins/qbsprojectmanager/qbsnodes.h b/src/plugins/qbsprojectmanager/qbsnodes.h index 5cbdef311e91f7fc464c608cdab47f453c58e9f7..6f703cfda561c5247dd21afd24018e3befe00bd1 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.h +++ b/src/plugins/qbsprojectmanager/qbsnodes.h @@ -96,6 +96,9 @@ public: const QString &newFilePath); QList<ProjectExplorer::RunConfiguration *> runConfigurationsFor(Node *node); + +private: + friend class QbsGroupNode; }; // -------------------------------------------------------------------- @@ -115,10 +118,13 @@ public: QString productPath() const; + static void setGroup(QbsBaseProjectNode *root, const qbs::GroupData *group, + const QString &productPath, QList<Node *> keepers); + private: - void setupFolders(ProjectExplorer::FolderNode *root, FileTreeNode *node, - const QString &baseDirPath, - QList<ProjectExplorer::Node *> keepers = QList<ProjectExplorer::Node *>()); + static void setupFolders(QbsBaseProjectNode *topLevel, FolderNode *root, FileTreeNode *node, + const QString &baseDirPath, + QList<ProjectExplorer::Node *> keepers = QList<ProjectExplorer::Node *>()); const qbs::GroupData *m_group; QString m_productPath;