QbsProjectManager: Make generated files available in project tree

Task-number: QTCREATORBUG-15978
Change-Id: Ia1890f1c4f8d1fa76568e42e15741281acb7dbb0
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Christian Kandeler
2016-07-28 17:41:58 +02:00
committed by Christian Kandeler
parent f06a5db22b
commit bfd0827811
3 changed files with 37 additions and 17 deletions

View File

@@ -280,8 +280,9 @@ QString QbsFileNode::displayName() const
QbsFolderNode::QbsFolderNode(const Utils::FileName &folderPath, ProjectExplorer::NodeType nodeType, QbsFolderNode::QbsFolderNode(const Utils::FileName &folderPath, ProjectExplorer::NodeType nodeType,
const QString &displayName) const QString &displayName, bool isGeneratedFilesFolder)
: ProjectExplorer::FolderNode(folderPath, nodeType, displayName) : ProjectExplorer::FolderNode(folderPath, nodeType, displayName),
m_isGeneratedFilesFolder(isGeneratedFilesFolder)
{ {
} }
@@ -428,14 +429,14 @@ void QbsGroupNode::updateQbsGroupData(const qbs::GroupData &grp, const QString &
idx->setAbsoluteFilePathAndLine(Utils::FileName::fromString(grp.location().filePath()), idx->setAbsoluteFilePathAndLine(Utils::FileName::fromString(grp.location().filePath()),
grp.location().line()); grp.location().line());
setupFiles(this, grp, grp.allFilePaths(), productPath, updateExisting); setupFiles(this, grp, grp.allFilePaths(), productPath, updateExisting, false);
if (updateExisting) if (updateExisting)
emitNodeUpdated(); emitNodeUpdated();
} }
void QbsGroupNode::setupFiles(ProjectExplorer::FolderNode *root, const qbs::GroupData &group, void QbsGroupNode::setupFiles(ProjectExplorer::FolderNode *root, const qbs::GroupData &group,
const QStringList &files, const QString &productPath, bool updateExisting) const QStringList &files, const QString &productPath, bool updateExisting, bool generated)
{ {
// Build up a tree of nodes: // Build up a tree of nodes:
FileTreeNode tree; FileTreeNode tree;
@@ -457,14 +458,15 @@ void QbsGroupNode::setupFiles(ProjectExplorer::FolderNode *root, const qbs::Grou
foreach (const qbs::ArtifactData &sa, group.allSourceArtifacts()) foreach (const qbs::ArtifactData &sa, group.allSourceArtifacts())
fileTypeHash[sa.filePath()] = fileType(sa); fileTypeHash[sa.filePath()] = fileType(sa);
setupFolder(root, fileTypeHash, &tree, productPath, updateExisting); setupFolder(root, fileTypeHash, &tree, productPath, updateExisting, generated);
} }
void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root, void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root,
const QHash<QString, ProjectExplorer::FileType> &fileTypeHash, const QHash<QString, ProjectExplorer::FileType> &fileTypeHash,
const FileTreeNode *fileTree, const FileTreeNode *fileTree,
const QString &baseDir, const QString &baseDir,
bool updateExisting) bool updateExisting,
bool generated)
{ {
// We only need to care about FileNodes and FolderNodes here. Everything else is // We only need to care about FileNodes and FolderNodes here. Everything else is
// handled elsewhere. // handled elsewhere.
@@ -482,6 +484,9 @@ void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root,
foreach (ProjectExplorer::FolderNode *fn, root->subFolderNodes()) { foreach (ProjectExplorer::FolderNode *fn, root->subFolderNodes()) {
if (fn->nodeType() == ProjectExplorer::ProjectNodeType) if (fn->nodeType() == ProjectExplorer::ProjectNodeType)
continue; // Skip ProjectNodes mixed into the folders... continue; // Skip ProjectNodes mixed into the folders...
const auto * const qbsFolder = dynamic_cast<QbsFolderNode *>(fn);
if (qbsFolder && qbsFolder->isGeneratedFilesFolder())
continue;
foldersToRemove.append(fn); foldersToRemove.append(fn);
} }
@@ -506,7 +511,7 @@ void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root,
if (updateExisting) if (updateExisting)
fn->emitNodeUpdated(); fn->emitNodeUpdated();
} else { } else {
fn = new ProjectExplorer::FileNode(path, newFileType, false); fn = new ProjectExplorer::FileNode(path, newFileType, generated);
filesToAdd.append(fn); filesToAdd.append(fn);
} }
continue; continue;
@@ -526,7 +531,7 @@ void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root,
} else { } else {
fn = new QbsFolderNode(Utils::FileName::fromString(c->path()), fn = new QbsFolderNode(Utils::FileName::fromString(c->path()),
ProjectExplorer::FolderNodeType, ProjectExplorer::FolderNodeType,
displayNameFromPath(c->path(), baseDir)); displayNameFromPath(c->path(), baseDir), false);
} }
root->addFolderNodes(QList<FolderNode *>() << fn); root->addFolderNodes(QList<FolderNode *>() << fn);
} else { } else {
@@ -539,7 +544,7 @@ void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root,
if (isQrcFile) if (isQrcFile)
static_cast<ResourceTopLevelNode *>(fn)->update(); static_cast<ResourceTopLevelNode *>(fn)->update();
else else
setupFolder(fn, fileTypeHash, c, c->path(), updateExisting); setupFolder(fn, fileTypeHash, c, c->path(), updateExisting, generated);
} }
} }
@@ -574,13 +579,17 @@ ProjectExplorer::FileType QbsGroupNode::fileType(const qbs::ArtifactData &artifa
// -------------------------------------------------------------------- // --------------------------------------------------------------------
QbsProductNode::QbsProductNode(const qbs::Project &project, const qbs::ProductData &prd) : QbsProductNode::QbsProductNode(const qbs::Project &project, const qbs::ProductData &prd) :
QbsBaseProjectNode(Utils::FileName::fromString(prd.location().filePath())) QbsBaseProjectNode(Utils::FileName::fromString(prd.location().filePath())),
m_generatedFilesNode(new QbsFolderNode(Utils::FileName::fromString(prd.buildDirectory()),
ProjectExplorer::FolderNodeType,
QCoreApplication::translate("QbsProductNode", "Generated files"), true))
{ {
if (m_productIcon.isNull()) if (m_productIcon.isNull())
m_productIcon = generateIcon(QString::fromLatin1(Constants::QBS_PRODUCT_OVERLAY_ICON)); m_productIcon = generateIcon(QString::fromLatin1(Constants::QBS_PRODUCT_OVERLAY_ICON));
setIcon(m_productIcon); setIcon(m_productIcon);
addFolderNodes(QList<ProjectExplorer::FolderNode *>() << m_generatedFilesNode);
auto idx = new QbsFileNode(Utils::FileName::fromString(prd.location().filePath()), auto idx = new QbsFileNode(Utils::FileName::fromString(prd.location().filePath()),
ProjectExplorer::ProjectFileType, false, ProjectExplorer::ProjectFileType, false,
prd.location().line()); prd.location().line());
@@ -687,7 +696,8 @@ void QbsProductNode::setQbsProductData(const qbs::Project &project, const qbs::P
foreach (const qbs::GroupData &grp, prd.groups()) { foreach (const qbs::GroupData &grp, prd.groups()) {
if (grp.name() == prd.name() && grp.location() == prd.location()) { if (grp.name() == prd.name() && grp.location() == prd.location()) {
// Set implicit product group right onto this node: // Set implicit product group right onto this node:
QbsGroupNode::setupFiles(this, grp, grp.allFilePaths(), productPath, updateExisting); QbsGroupNode::setupFiles(this, grp, grp.allFilePaths(), productPath, updateExisting,
false);
continue; continue;
} }
QbsGroupNode *gn = findGroupNode(grp.name()); QbsGroupNode *gn = findGroupNode(grp.name());
@@ -700,6 +710,11 @@ void QbsProductNode::setQbsProductData(const qbs::Project &project, const qbs::P
} }
} }
const QStringList generatedFiles
= Utils::transform(prd.generatedArtifacts(), &qbs::ArtifactData::filePath);
QbsGroupNode::setupFiles(m_generatedFilesNode, qbs::GroupData(), generatedFiles,
prd.buildDirectory(), true, true);
addProjectNodes(toAdd); addProjectNodes(toAdd);
removeProjectNodes(toRemove); removeProjectNodes(toRemove);
@@ -859,7 +874,7 @@ void QbsRootProjectNode::update()
projectBuildSystemFiles.append(f); projectBuildSystemFiles.append(f);
} }
QbsGroupNode::setupFiles(m_buildSystemFiles, qbs::GroupData(), projectBuildSystemFiles, QbsGroupNode::setupFiles(m_buildSystemFiles, qbs::GroupData(), projectBuildSystemFiles,
base.toString(), false); base.toString(), false, false);
update(m_project->qbsProject(), m_project->qbsProjectData()); update(m_project->qbsProject(), m_project->qbsProjectData());
} }

View File

@@ -55,10 +55,14 @@ class QbsFolderNode : public ProjectExplorer::FolderNode
{ {
public: public:
QbsFolderNode(const Utils::FileName &folderPath, ProjectExplorer::NodeType nodeType, QbsFolderNode(const Utils::FileName &folderPath, ProjectExplorer::NodeType nodeType,
const QString &displayName); const QString &displayName, bool isGeneratedFilesFolder);
bool isGeneratedFilesFolder() const { return m_isGeneratedFilesFolder; }
private: private:
QList<ProjectExplorer::ProjectAction> supportedActions(ProjectExplorer::Node *node) const override; QList<ProjectExplorer::ProjectAction> supportedActions(ProjectExplorer::Node *node) const override;
const bool m_isGeneratedFilesFolder;
}; };
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@@ -102,13 +106,13 @@ public:
// group can be invalid // group can be invalid
static void setupFiles(FolderNode *root, const qbs::GroupData &group, const QStringList &files, static void setupFiles(FolderNode *root, const qbs::GroupData &group, const QStringList &files,
const QString &productPath, bool updateExisting); const QString &productPath, bool updateExisting, bool generated);
private: private:
static void setupFolder(ProjectExplorer::FolderNode *folder, static void setupFolder(ProjectExplorer::FolderNode *folder,
const QHash<QString, ProjectExplorer::FileType> &fileTypeHash, const QHash<QString, ProjectExplorer::FileType> &fileTypeHash,
const FileTreeNode *subFileTree, const QString &baseDir, const FileTreeNode *subFileTree, const QString &baseDir,
bool updateExisting); bool updateExisting, bool generated);
static ProjectExplorer::FileType fileType(const qbs::ArtifactData &artifact); static ProjectExplorer::FileType fileType(const qbs::ArtifactData &artifact);
qbs::GroupData m_qbsGroupData; qbs::GroupData m_qbsGroupData;
@@ -142,6 +146,7 @@ private:
QbsGroupNode *findGroupNode(const QString &name); QbsGroupNode *findGroupNode(const QString &name);
qbs::ProductData m_qbsProductData; qbs::ProductData m_qbsProductData;
ProjectExplorer::FolderNode * const m_generatedFilesNode;
static QIcon m_productIcon; static QIcon m_productIcon;
}; };

View File

@@ -289,7 +289,7 @@ bool QbsProject::addFilesToProduct(QbsBaseProjectNode *node, const QStringList &
if (notAdded->count() != filePaths.count()) { if (notAdded->count() != filePaths.count()) {
m_projectData = m_qbsProject.projectData(); m_projectData = m_qbsProject.projectData();
QbsGroupNode::setupFiles(node, reRetrieveGroupData(productData, groupData), QbsGroupNode::setupFiles(node, reRetrieveGroupData(productData, groupData),
allPaths, QFileInfo(productFilePath).absolutePath(), true); allPaths, QFileInfo(productFilePath).absolutePath(), true, false);
rootProjectNode()->update(); rootProjectNode()->update();
emit fileListChanged(); emit fileListChanged();
} }
@@ -318,7 +318,7 @@ bool QbsProject::removeFilesFromProduct(QbsBaseProjectNode *node, const QStringL
if (notRemoved->count() != filePaths.count()) { if (notRemoved->count() != filePaths.count()) {
m_projectData = m_qbsProject.projectData(); m_projectData = m_qbsProject.projectData();
QbsGroupNode::setupFiles(node, reRetrieveGroupData(productData, groupData), allPaths, QbsGroupNode::setupFiles(node, reRetrieveGroupData(productData, groupData), allPaths,
QFileInfo(productFilePath).absolutePath(), true); QFileInfo(productFilePath).absolutePath(), true, false);
rootProjectNode()->update(); rootProjectNode()->update();
emit fileListChanged(); emit fileListChanged();
} }