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,
const QString &displayName)
: ProjectExplorer::FolderNode(folderPath, nodeType, displayName)
const QString &displayName, bool isGeneratedFilesFolder)
: 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()),
grp.location().line());
setupFiles(this, grp, grp.allFilePaths(), productPath, updateExisting);
setupFiles(this, grp, grp.allFilePaths(), productPath, updateExisting, false);
if (updateExisting)
emitNodeUpdated();
}
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:
FileTreeNode tree;
@@ -457,14 +458,15 @@ void QbsGroupNode::setupFiles(ProjectExplorer::FolderNode *root, const qbs::Grou
foreach (const qbs::ArtifactData &sa, group.allSourceArtifacts())
fileTypeHash[sa.filePath()] = fileType(sa);
setupFolder(root, fileTypeHash, &tree, productPath, updateExisting);
setupFolder(root, fileTypeHash, &tree, productPath, updateExisting, generated);
}
void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root,
const QHash<QString, ProjectExplorer::FileType> &fileTypeHash,
const FileTreeNode *fileTree,
const QString &baseDir,
bool updateExisting)
bool updateExisting,
bool generated)
{
// We only need to care about FileNodes and FolderNodes here. Everything else is
// handled elsewhere.
@@ -482,6 +484,9 @@ void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root,
foreach (ProjectExplorer::FolderNode *fn, root->subFolderNodes()) {
if (fn->nodeType() == ProjectExplorer::ProjectNodeType)
continue; // Skip ProjectNodes mixed into the folders...
const auto * const qbsFolder = dynamic_cast<QbsFolderNode *>(fn);
if (qbsFolder && qbsFolder->isGeneratedFilesFolder())
continue;
foldersToRemove.append(fn);
}
@@ -506,7 +511,7 @@ void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root,
if (updateExisting)
fn->emitNodeUpdated();
} else {
fn = new ProjectExplorer::FileNode(path, newFileType, false);
fn = new ProjectExplorer::FileNode(path, newFileType, generated);
filesToAdd.append(fn);
}
continue;
@@ -526,7 +531,7 @@ void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root,
} else {
fn = new QbsFolderNode(Utils::FileName::fromString(c->path()),
ProjectExplorer::FolderNodeType,
displayNameFromPath(c->path(), baseDir));
displayNameFromPath(c->path(), baseDir), false);
}
root->addFolderNodes(QList<FolderNode *>() << fn);
} else {
@@ -539,7 +544,7 @@ void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root,
if (isQrcFile)
static_cast<ResourceTopLevelNode *>(fn)->update();
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) :
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())
m_productIcon = generateIcon(QString::fromLatin1(Constants::QBS_PRODUCT_OVERLAY_ICON));
setIcon(m_productIcon);
addFolderNodes(QList<ProjectExplorer::FolderNode *>() << m_generatedFilesNode);
auto idx = new QbsFileNode(Utils::FileName::fromString(prd.location().filePath()),
ProjectExplorer::ProjectFileType, false,
prd.location().line());
@@ -687,7 +696,8 @@ 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, grp.allFilePaths(), productPath, updateExisting);
QbsGroupNode::setupFiles(this, grp, grp.allFilePaths(), productPath, updateExisting,
false);
continue;
}
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);
removeProjectNodes(toRemove);
@@ -859,7 +874,7 @@ void QbsRootProjectNode::update()
projectBuildSystemFiles.append(f);
}
QbsGroupNode::setupFiles(m_buildSystemFiles, qbs::GroupData(), projectBuildSystemFiles,
base.toString(), false);
base.toString(), false, false);
update(m_project->qbsProject(), m_project->qbsProjectData());
}