forked from qt-creator/qt-creator
ProjectExplorer: Further tree node related simplification
Drop the list sorting and difference generation which is not needed in the "build from scratch" setup. This also removes some of the intermediately introduced convienience functions and fixes a regression that led to missing project files. Change-Id: I39d1966324917f466fb347da3a52552393ca4a01 Reviewed-by: Tobias Hunger <tobias.hunger@qt.io> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -326,7 +326,7 @@ QbsGroupNode::QbsGroupNode(const qbs::GroupData &grp, const QString &productPath
|
||||
ProjectExplorer::FileType::Project, false,
|
||||
grp.location().line()));
|
||||
|
||||
updateQbsGroupData(grp, productPath, true, true);
|
||||
updateQbsGroupData(grp, productPath, true);
|
||||
}
|
||||
|
||||
QList<ProjectExplorer::ProjectAction> QbsGroupNode::supportedActions(ProjectExplorer::Node *node) const
|
||||
@@ -392,19 +392,11 @@ bool QbsGroupNode::renameFile(const QString &filePath, const QString &newFilePat
|
||||
}
|
||||
|
||||
void QbsGroupNode::updateQbsGroupData(const qbs::GroupData &grp, const QString &productPath,
|
||||
bool productWasEnabled, bool productIsEnabled)
|
||||
bool productIsEnabled)
|
||||
{
|
||||
QTC_ASSERT(grp.isValid(), return);
|
||||
|
||||
if (grp == m_qbsGroupData && productPath == m_productPath)
|
||||
return;
|
||||
|
||||
bool groupWasEnabled = productWasEnabled && m_qbsGroupData.isValid()
|
||||
&& m_qbsGroupData.isEnabled();
|
||||
bool groupIsEnabled = productIsEnabled && grp.isEnabled();
|
||||
bool updateExisting = groupWasEnabled != groupIsEnabled;
|
||||
|
||||
setEnabled(groupIsEnabled);
|
||||
setEnabled(productIsEnabled && grp.isEnabled());
|
||||
|
||||
m_productPath = productPath;
|
||||
m_qbsGroupData = grp;
|
||||
@@ -422,14 +414,11 @@ 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, false);
|
||||
|
||||
if (updateExisting)
|
||||
emitNodeUpdated();
|
||||
setupFiles(this, grp, grp.allFilePaths(), productPath, false);
|
||||
}
|
||||
|
||||
void QbsGroupNode::setupFiles(ProjectExplorer::FolderNode *root, const qbs::GroupData &group,
|
||||
const QStringList &files, const QString &productPath, bool updateExisting, bool generated)
|
||||
const QStringList &files, const QString &productPath, bool generated)
|
||||
{
|
||||
// Build up a tree of nodes:
|
||||
FileTreeNode tree;
|
||||
@@ -451,14 +440,13 @@ 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, generated);
|
||||
setupFolder(root, fileTypeHash, &tree, productPath, generated);
|
||||
}
|
||||
|
||||
void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root,
|
||||
const QHash<QString, ProjectExplorer::FileType> &fileTypeHash,
|
||||
const FileTreeNode *fileTree,
|
||||
const QString &baseDir,
|
||||
bool updateExisting,
|
||||
bool generated)
|
||||
{
|
||||
// We only need to care about FileNodes and FolderNodes here. Everything else is
|
||||
@@ -466,23 +454,6 @@ void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root,
|
||||
// QbsGroupNodes are managed by the QbsProductNode.
|
||||
// The buildsystem file is either managed by QbsProductNode or by updateQbsGroupData(...).
|
||||
|
||||
QList<ProjectExplorer::FileNode *> filesToRemove;
|
||||
foreach (ProjectExplorer::FileNode *fn, root->fileNodes()) {
|
||||
if (!dynamic_cast<QbsFileNode *>(fn))
|
||||
filesToRemove << fn;
|
||||
}
|
||||
QList<ProjectExplorer::FileNode *> filesToAdd;
|
||||
|
||||
QList<ProjectExplorer::FolderNode *> foldersToRemove;
|
||||
foreach (ProjectExplorer::FolderNode *fn, root->folderNodes()) {
|
||||
if (fn->nodeType() == ProjectExplorer::NodeType::Project)
|
||||
continue; // Skip ProjectNodes mixed into the folders...
|
||||
const auto * const qbsFolder = dynamic_cast<QbsFolderNode *>(fn);
|
||||
if (qbsFolder && qbsFolder->isGeneratedFilesFolder())
|
||||
continue;
|
||||
foldersToRemove.append(fn);
|
||||
}
|
||||
|
||||
foreach (FileTreeNode *c, fileTree->children) {
|
||||
Utils::FileName path = Utils::FileName::fromString(c->path());
|
||||
const ProjectExplorer::FileType newFileType =
|
||||
@@ -499,13 +470,9 @@ void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root,
|
||||
fn = f;
|
||||
break;
|
||||
}
|
||||
if (fn) {
|
||||
filesToRemove.removeOne(fn);
|
||||
if (updateExisting)
|
||||
fn->emitNodeUpdated();
|
||||
} else {
|
||||
if (!fn) {
|
||||
fn = new ProjectExplorer::FileNode(path, newFileType, generated);
|
||||
filesToAdd.append(fn);
|
||||
root->addFileNode(fn);
|
||||
}
|
||||
continue;
|
||||
} else {
|
||||
@@ -526,24 +493,17 @@ void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root,
|
||||
ProjectExplorer::NodeType::Folder,
|
||||
displayNameFromPath(c->path(), baseDir), false);
|
||||
}
|
||||
root->addFolderNodes(QList<FolderNode *>() << fn);
|
||||
root->addFolderNode(fn);
|
||||
} else {
|
||||
foldersToRemove.removeOne(fn);
|
||||
if (updateExisting)
|
||||
fn->emitNodeUpdated();
|
||||
fn->setDisplayName(displayNameFromPath(c->path(), baseDir));
|
||||
}
|
||||
|
||||
if (isQrcFile)
|
||||
static_cast<ResourceTopLevelNode *>(fn)->update();
|
||||
else
|
||||
setupFolder(fn, fileTypeHash, c, c->path(), updateExisting, generated);
|
||||
|
||||
setupFolder(fn, fileTypeHash, c, c->path(), generated);
|
||||
}
|
||||
}
|
||||
root->removeFileNodes(filesToRemove);
|
||||
root->removeFolderNodes(foldersToRemove);
|
||||
root->addFileNodes(filesToAdd);
|
||||
}
|
||||
|
||||
ProjectExplorer::FileType QbsGroupNode::fileType(const qbs::ArtifactData &artifact)
|
||||
@@ -658,10 +618,6 @@ void QbsProductNode::setQbsProductData(const qbs::Project &project, const qbs::P
|
||||
if (m_qbsProductData == prd)
|
||||
return;
|
||||
|
||||
bool productWasEnabled = m_qbsProductData.isValid() && m_qbsProductData.isEnabled();
|
||||
bool productIsEnabled = prd.isEnabled();
|
||||
bool updateExisting = productWasEnabled != productIsEnabled;
|
||||
|
||||
setEnabled(prd.isEnabled());
|
||||
|
||||
setDisplayName(QbsProject::productDisplayName(project, prd));
|
||||
@@ -679,38 +635,23 @@ void QbsProductNode::setQbsProductData(const qbs::Project &project, const qbs::P
|
||||
idx->setAbsoluteFilePathAndLine(Utils::FileName::fromString(prd.location().filePath()),
|
||||
prd.location().line());
|
||||
|
||||
QList<ProjectExplorer::ProjectNode *> toRemove = projectNodes();
|
||||
|
||||
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,
|
||||
false);
|
||||
QbsGroupNode::setupFiles(this, grp, grp.allFilePaths(), productPath, false);
|
||||
continue;
|
||||
}
|
||||
QbsGroupNode *gn = findGroupNode(grp.name());
|
||||
if (gn) {
|
||||
toRemove.removeOne(gn);
|
||||
gn->updateQbsGroupData(grp, productPath, productWasEnabled, productIsEnabled);
|
||||
} else {
|
||||
gn = new QbsGroupNode(grp, productPath);
|
||||
addProjectNode(gn);
|
||||
}
|
||||
addProjectNode(new QbsGroupNode(grp, productPath));
|
||||
}
|
||||
|
||||
if (prd.isEnabled()) {
|
||||
const QStringList generatedFiles
|
||||
= Utils::transform(prd.generatedArtifacts(), &qbs::ArtifactData::filePath);
|
||||
QbsGroupNode::setupFiles(m_generatedFilesNode, qbs::GroupData(), generatedFiles,
|
||||
prd.buildDirectory(), true, true);
|
||||
prd.buildDirectory(), true);
|
||||
}
|
||||
|
||||
for (ProjectNode *node : toRemove)
|
||||
removeProjectNode(node);
|
||||
|
||||
m_qbsProductData = prd;
|
||||
if (updateExisting)
|
||||
emitNodeUpdated();
|
||||
}
|
||||
|
||||
QList<ProjectExplorer::RunConfiguration *> QbsProductNode::runConfigurations() const
|
||||
@@ -758,8 +699,6 @@ QbsProjectNode::~QbsProjectNode()
|
||||
|
||||
void QbsProjectNode::update(const qbs::Project &qbsProject, const qbs::ProjectData &prjData)
|
||||
{
|
||||
QTC_ASSERT(isEmpty(), makeEmpty());
|
||||
|
||||
foreach (const qbs::ProjectData &subData, prjData.subProjects()) {
|
||||
auto subProject =
|
||||
new QbsProjectNode(Utils::FileName::fromString(subData.location().filePath()));
|
||||
@@ -847,7 +786,7 @@ void QbsRootProjectNode::update()
|
||||
projectBuildSystemFiles.append(f);
|
||||
}
|
||||
QbsGroupNode::setupFiles(m_buildSystemFiles, qbs::GroupData(), projectBuildSystemFiles,
|
||||
base.toString(), false, false);
|
||||
base.toString(), false);
|
||||
|
||||
update(m_project->qbsProject(), m_project->qbsProjectData());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user