forked from qt-creator/qt-creator
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:
committed by
Christian Kandeler
parent
f06a5db22b
commit
bfd0827811
@@ -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());
|
||||
}
|
||||
|
||||
@@ -55,10 +55,14 @@ class QbsFolderNode : public ProjectExplorer::FolderNode
|
||||
{
|
||||
public:
|
||||
QbsFolderNode(const Utils::FileName &folderPath, ProjectExplorer::NodeType nodeType,
|
||||
const QString &displayName);
|
||||
const QString &displayName, bool isGeneratedFilesFolder);
|
||||
|
||||
bool isGeneratedFilesFolder() const { return m_isGeneratedFilesFolder; }
|
||||
|
||||
private:
|
||||
QList<ProjectExplorer::ProjectAction> supportedActions(ProjectExplorer::Node *node) const override;
|
||||
|
||||
const bool m_isGeneratedFilesFolder;
|
||||
};
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
@@ -102,13 +106,13 @@ public:
|
||||
|
||||
// group can be invalid
|
||||
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:
|
||||
static void setupFolder(ProjectExplorer::FolderNode *folder,
|
||||
const QHash<QString, ProjectExplorer::FileType> &fileTypeHash,
|
||||
const FileTreeNode *subFileTree, const QString &baseDir,
|
||||
bool updateExisting);
|
||||
bool updateExisting, bool generated);
|
||||
static ProjectExplorer::FileType fileType(const qbs::ArtifactData &artifact);
|
||||
|
||||
qbs::GroupData m_qbsGroupData;
|
||||
@@ -142,6 +146,7 @@ private:
|
||||
QbsGroupNode *findGroupNode(const QString &name);
|
||||
|
||||
qbs::ProductData m_qbsProductData;
|
||||
ProjectExplorer::FolderNode * const m_generatedFilesNode;
|
||||
static QIcon m_productIcon;
|
||||
};
|
||||
|
||||
|
||||
@@ -289,7 +289,7 @@ bool QbsProject::addFilesToProduct(QbsBaseProjectNode *node, const QStringList &
|
||||
if (notAdded->count() != filePaths.count()) {
|
||||
m_projectData = m_qbsProject.projectData();
|
||||
QbsGroupNode::setupFiles(node, reRetrieveGroupData(productData, groupData),
|
||||
allPaths, QFileInfo(productFilePath).absolutePath(), true);
|
||||
allPaths, QFileInfo(productFilePath).absolutePath(), true, false);
|
||||
rootProjectNode()->update();
|
||||
emit fileListChanged();
|
||||
}
|
||||
@@ -318,7 +318,7 @@ bool QbsProject::removeFilesFromProduct(QbsBaseProjectNode *node, const QStringL
|
||||
if (notRemoved->count() != filePaths.count()) {
|
||||
m_projectData = m_qbsProject.projectData();
|
||||
QbsGroupNode::setupFiles(node, reRetrieveGroupData(productData, groupData), allPaths,
|
||||
QFileInfo(productFilePath).absolutePath(), true);
|
||||
QFileInfo(productFilePath).absolutePath(), true, false);
|
||||
rootProjectNode()->update();
|
||||
emit fileListChanged();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user