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,
|
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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user