diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index dfb3994b098..3160c732b56 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -217,7 +217,7 @@ CMakeConfig ServerModeReader::takeParsedConfiguration() return config; } -void addCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, int priority, +static void addCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, int priority, const QString &displayName, QList &files) { if (files.isEmpty()) @@ -228,39 +228,25 @@ void addCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, int prio folder->buildTree(files); } -static ProjectNode *addCMakeInputs(CMakeListsNode *root, - const Utils::FileName &sourceDir, - const Utils::FileName &buildDir, - QList &sourceInputs, - QList &buildInputs, - QList &rootInputs) +static void addCMakeInputs(CMakeListsNode *root, + const Utils::FileName &sourceDir, + const Utils::FileName &buildDir, + QList &sourceInputs, + QList &buildInputs, + QList &rootInputs) { - const bool hasInputs = !sourceInputs.isEmpty() || !buildInputs.isEmpty() || !rootInputs.isEmpty(); - ProjectNode *cmakeVFolder - = root->projectNode(CMakeInputsNode::inputsPathFromCMakeListsPath(root->filePath())); - if (!cmakeVFolder) { - if (hasInputs) { - cmakeVFolder = new CMakeInputsNode(root->filePath()); - root->addProjectNode(cmakeVFolder); - } - } else { - if (!hasInputs) - root->removeProjectNode(cmakeVFolder); - } - if (!hasInputs) - return nullptr; + ProjectNode *cmakeVFolder = new CMakeInputsNode(root->filePath()); + root->addProjectNode(cmakeVFolder); addCMakeVFolder(cmakeVFolder, sourceDir, 1000, - QCoreApplication::translate("CMakeProjectManager::Internal", ""), - sourceInputs); + QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", ""), + sourceInputs); addCMakeVFolder(cmakeVFolder, buildDir, 100, - QCoreApplication::translate("CMakeProjectManager::Internal", ""), - buildInputs); + QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", ""), + buildInputs); addCMakeVFolder(cmakeVFolder, Utils::FileName(), 10, - QCoreApplication::translate("CMakeProjectManager::Internal", ""), - rootInputs); - - return cmakeVFolder; + QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", ""), + rootInputs); } void ServerModeReader::generateProjectTree(CMakeListsNode *root, @@ -288,8 +274,9 @@ void ServerModeReader::generateProjectTree(CMakeListsNode *root, if (!m_projects.isEmpty()) root->setDisplayName(m_projects.at(0)->name); - addCMakeInputs(root, m_parameters.sourceDirectory, m_parameters.buildDirectory, - cmakeFilesSource, cmakeFilesBuild, cmakeFilesOther); + if (!cmakeFilesSource.isEmpty() || !cmakeFilesBuild.isEmpty() || !cmakeFilesOther.isEmpty()) + addCMakeInputs(root, m_parameters.sourceDirectory, m_parameters.buildDirectory, + cmakeFilesSource, cmakeFilesBuild, cmakeFilesOther); addCMakeLists(root, cmakeLists); addProjects(root, m_projects, allFiles); @@ -721,7 +708,6 @@ void ServerModeReader::addFileGroups(ProjectNode *targetRoot, otherFileNodes.append(fn); } - targetRoot->removeFolderNodes(); addCMakeVFolder(targetRoot, sourceDirectory, 1000, tr(""), sourceFileNodes); addCMakeVFolder(targetRoot, buildDirectory, 100, tr(""), buildFileNodes); addCMakeVFolder(targetRoot, Utils::FileName(), 10, tr(""), otherFileNodes); diff --git a/src/plugins/cmakeprojectmanager/tealeafreader.cpp b/src/plugins/cmakeprojectmanager/tealeafreader.cpp index 497f2828756..40b2f8f623b 100644 --- a/src/plugins/cmakeprojectmanager/tealeafreader.cpp +++ b/src/plugins/cmakeprojectmanager/tealeafreader.cpp @@ -270,10 +270,6 @@ void TeaLeafReader::generateProjectTree(CMakeListsNode *root, const QList added; - QList deleted; // Unused! - ProjectExplorer::compareSortedLists(m_files, allFiles, deleted, added, Node::sortByPath); - QSet allIncludePathSet; for (const CMakeBuildTarget &bt : m_buildTargets) { const QList targetIncludePaths @@ -285,7 +281,7 @@ void TeaLeafReader::generateProjectTree(CMakeListsNode *root, const QList allIncludePaths = allIncludePathSet.toList(); const QList missingHeaders - = Utils::filtered(added, [&allIncludePaths](const FileNode *fn) -> bool { + = Utils::filtered(allFiles, [&allIncludePaths](const FileNode *fn) -> bool { if (fn->fileType() != FileType::Header) return false; diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 189669b0abc..2cdb03208c4 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -507,7 +507,7 @@ FolderNode::AddNewInformation FolderNode::addNewInformation(const QStringList &f } /*! - Adds file nodes specified by \a files to the internal list of the folder + Adds a file node specified by \a file to the internal list of the folder and emits the corresponding signals from the projectNode. This function should be called within an implementation of the public function @@ -522,62 +522,24 @@ void FolderNode::addFileNode(FileNode *file) qDebug("File node has already a parent folder")); file->setParentFolderNode(this); - // Now find the correct place to insert file - if (m_fileNodes.count() == 0 - || m_fileNodes.last() < file) { - // empty list or greater then last node - m_fileNodes.append(file); - } else { - auto it = std::lower_bound(m_fileNodes.begin(), m_fileNodes.end(), file); - m_fileNodes.insert(it, file); - } -} - -void FolderNode::addFileNodes(const QList &files) -{ - foreach (FileNode *file, files) - addFileNode(file); + m_fileNodes.append(file); } /*! - Removes \a files from the internal list and emits the corresponding signals. - - All objects in the \a files list are deleted. - This function should be called within an implementation of the public function - removeFiles. + Sets file nodes specified by \a files to the internal list of the folder + and emits the corresponding signals from the projectNode. */ -void FolderNode::removeFileNodes() -{ - qDeleteAll(m_fileNodes); - m_fileNodes.clear(); - ProjectTree::emitDataChanged(); -} - -void FolderNode::removeFileNodes(const QList &files) -{ - for (FileNode *file : files) - removeFileNode(file); - } - -void FolderNode::removeFileNode(FileNode *file) -{ - Q_ASSERT(managingProject()); - m_fileNodes.removeAll(file); - delete file; -} - void FolderNode::setFileNodes(const QList &files) { qDeleteAll(m_fileNodes); m_fileNodes = files; for (FileNode *node : m_fileNodes) node->setParentFolderNode(this); - ProjectTree::emitDataChanged(); } /*! - Adds folder nodes specified by \a subFolders to the node hierarchy below + Adds a folder node specified by \a folder to the node hierarchy below \a parentFolder and emits the corresponding signals. */ void FolderNode::addFolderNode(FolderNode *folder) @@ -587,51 +549,7 @@ void FolderNode::addFolderNode(FolderNode *folder) QTC_ASSERT(!folder->parentFolderNode(), qDebug("Project node has already a parent folder")); folder->setParentFolderNode(this); - - // Find the correct place to insert - if (m_folderNodes.count() == 0 - || m_folderNodes.last() < folder) { - // empty list or greater then last node - m_folderNodes.append(folder); - } else { - // Binary Search for insertion point - auto it = std::lower_bound(m_folderNodes.begin(), m_folderNodes.end(), folder); - m_folderNodes.insert(it, folder); - } -} - -void FolderNode::addFolderNodes(const QList &subFolders) -{ - for (FolderNode *folder : subFolders) - addFolderNode(folder); -} - -/*! - Removes file nodes specified by \a subFolders from the node hierarchy and emits - the corresponding signals. - - All objects in the \a subFolders list are deleted. -*/ -void FolderNode::removeFolderNodes() -{ - qDeleteAll(m_folderNodes); - m_folderNodes.clear(); - ProjectTree::emitDataChanged(); -} - -void FolderNode::removeFolderNodes(const QList &subFolders) -{ - Q_ASSERT(managingProject()); - for (FolderNode *folder : subFolders) - removeFolderNode(folder); -} - -void FolderNode::removeFolderNode(FolderNode *folder) -{ - Q_ASSERT(managingProject()); - m_folderNodes.removeAll(folder); - delete folder; - ProjectTree::emitDataChanged(); + m_folderNodes.append(folder); } void FolderNode::setFolderNodes(const QList &folders) @@ -640,7 +558,6 @@ void FolderNode::setFolderNodes(const QList &folders) m_folderNodes = folders; for (FolderNode *node : m_folderNodes) node->setParentFolderNode(this); - ProjectTree::emitDataChanged(); } bool FolderNode::showInSimpleTree() const @@ -803,21 +720,11 @@ void ProjectNode::addProjectNode(ProjectNode *subProject) /*! - Removes project nodes specified by \a subProjects from the node hierarchy - and emits the corresponding signals. + Remove the project node specified by \a subProject from the node hierarchy. All objects in the \a subProjects list are deleted. */ -void ProjectNode::removeProjectNodes() -{ - foreach (ProjectNode *subProject, m_projectNodes) - m_folderNodes.removeAll(subProject); - - qDeleteAll(m_projectNodes); - m_projectNodes.clear(); -} - void ProjectNode::removeProjectNode(ProjectNode *subProject) { m_projectNodes.removeOne(subProject); @@ -827,7 +734,12 @@ void ProjectNode::removeProjectNode(ProjectNode *subProject) void ProjectNode::makeEmpty() { - removeProjectNodes(); + foreach (ProjectNode *subProject, m_projectNodes) + m_folderNodes.removeAll(subProject); + + qDeleteAll(m_projectNodes); + m_projectNodes.clear(); + setFolderNodes({}); setFileNodes({}); } diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index 32fb27705ed..16f6701b815 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -246,17 +246,9 @@ public: virtual bool showInSimpleTree() const; void addFileNode(FileNode *file); - void removeFileNodes(); - void removeFileNode(FileNode *file); - void addFileNodes(const QList &files); - void removeFileNodes(const QList &files); void setFileNodes(const QList &files); void addFolderNode(FolderNode *subFolder); - void removeFolderNodes(); - void removeFolderNode(FolderNode *subFolder); - void addFolderNodes(const QList &subFolders); - void removeFolderNodes(const QList &subFolders); void setFolderNodes(const QList &folders); void makeEmpty(); @@ -310,7 +302,6 @@ public: // all subFolders that are projects QList projectNodes() const; void addProjectNode(ProjectNode *subProject); - void removeProjectNodes(); void removeProjectNode(ProjectNode *subProject); void makeEmpty(); @@ -356,102 +347,6 @@ private: QList m_projectNodes; }; -template -bool isSorted(const T1 &list, T3 sorter) -{ - typename T1::const_iterator it, iit, end; - end = list.constEnd(); - it = list.constBegin(); - if (it == end) - return true; - - iit = list.constBegin(); - ++iit; - - while (iit != end) { - if (!sorter(*it, *iit)) - return false; - it = iit++; - } - return true; -} - -template -void compareSortedLists(T1 oldList, T2 newList, T1 &removedList, T2 &addedList, T3 sorter) -{ - Q_ASSERT(isSorted(oldList, sorter)); - Q_ASSERT(isSorted(newList, sorter)); - - typename T1::const_iterator oldIt, oldEnd; - typename T2::const_iterator newIt, newEnd; - - oldIt = oldList.constBegin(); - oldEnd = oldList.constEnd(); - - newIt = newList.constBegin(); - newEnd = newList.constEnd(); - - while (oldIt != oldEnd && newIt != newEnd) { - if (sorter(*oldIt, *newIt)) { - removedList.append(*oldIt); - ++oldIt; - } else if (sorter(*newIt, *oldIt)) { - addedList.append(*newIt); - ++newIt; - } else { - ++oldIt; - ++newIt; - } - } - - while (oldIt != oldEnd) { - removedList.append(*oldIt); - ++oldIt; - } - - while (newIt != newEnd) { - addedList.append(*newIt); - ++newIt; - } -} - -template -T1 subtractSortedList(T1 list1, T1 list2, T3 sorter) -{ - Q_ASSERT(isSorted(list1, sorter)); - Q_ASSERT(isSorted(list2, sorter)); - - typename T1::const_iterator list1It, list1End; - typename T1::const_iterator list2It, list2End; - - list1It = list1.constBegin(); - list1End = list1.constEnd(); - - list2It = list2.constBegin(); - list2End = list2.constEnd(); - - T1 result; - - while (list1It != list1End && list2It != list2End) { - if (sorter(*list1It, *list2It)) { - result.append(*list1It); - ++list1It; - } else if (sorter(*list2It, *list1It)) { - qWarning() << "subtractSortedList: subtracting value that isn't in set"; - } else { - ++list1It; - ++list2It; - } - } - - while (list1It != list1End) { - result.append(*list1It); - ++list1It; - } - - return result; -} - } // namespace ProjectExplorer Q_DECLARE_METATYPE(ProjectExplorer::Node *) diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp index f33ab3c9d42..e7b0678bcd0 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.cpp +++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp @@ -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 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 &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 filesToRemove; - foreach (ProjectExplorer::FileNode *fn, root->fileNodes()) { - if (!dynamic_cast(fn)) - filesToRemove << fn; - } - QList filesToAdd; - - QList 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(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() << fn); + root->addFolderNode(fn); } else { - foldersToRemove.removeOne(fn); - if (updateExisting) - fn->emitNodeUpdated(); fn->setDisplayName(displayNameFromPath(c->path(), baseDir)); } if (isQrcFile) static_cast(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 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 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()); } diff --git a/src/plugins/qbsprojectmanager/qbsnodes.h b/src/plugins/qbsprojectmanager/qbsnodes.h index 846b93f8ff1..1ea8edbef26 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.h +++ b/src/plugins/qbsprojectmanager/qbsnodes.h @@ -96,8 +96,7 @@ public: bool addFiles(const QStringList &filePaths, QStringList *notAdded = 0) override; bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = 0) override; bool renameFile(const QString &filePath, const QString &newFilePath) override; - void updateQbsGroupData(const qbs::GroupData &grp, const QString &productPath, - bool productWasEnabled, bool productIsEnabled); + void updateQbsGroupData(const qbs::GroupData &grp, const QString &productPath, bool productIsEnabled); qbs::GroupData qbsGroupData() const { return m_qbsGroupData; } @@ -105,13 +104,13 @@ public: // group can be invalid static void setupFiles(FolderNode *root, const qbs::GroupData &group, const QStringList &files, - const QString &productPath, bool updateExisting, bool generated); + const QString &productPath, bool generated); private: static void setupFolder(ProjectExplorer::FolderNode *folder, const QHash &fileTypeHash, const FileTreeNode *subFileTree, const QString &baseDir, - bool updateExisting, bool generated); + bool generated); static ProjectExplorer::FileType fileType(const qbs::ArtifactData &artifact); qbs::GroupData m_qbsGroupData; diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 85df4ec2f69..b36895c955f 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -320,7 +320,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, false); + allPaths, QFileInfo(productFilePath).absolutePath(), false); rootProjectNode()->update(); emit fileListChanged(); } @@ -349,7 +349,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, false); + QFileInfo(productFilePath).absolutePath(), false); rootProjectNode()->update(); emit fileListChanged(); } diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index 4cadf522e9a..d3b00a8b5ff 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -439,144 +439,43 @@ struct InternalNode } // Makes the projectNode's subtree below the given folder match this internal node's subtree - void updateSubFolders(FolderNode *folder) + void addSubFolderContents(FolderNode *folder) { - if (type == FileType::Resource) - updateResourceFiles(folder); - else - updateFiles(folder, type); + if (type == FileType::Resource) { + for (const FileName &file : files) { + auto vfs = static_cast(folder->parentProjectNode())->m_project->qmakeVfs(); + QString contents; + // Prefer the cumulative file if it's non-empty, based on the assumption + // that it contains more "stuff". + vfs->readVirtualFile(file.toString(), QMakeVfs::VfsCumulative, &contents); + // If the cumulative evaluation botched the file too much, try the exact one. + if (contents.isEmpty()) + vfs->readVirtualFile(file.toString(), QMakeVfs::VfsExact, &contents); + folder->addFolderNode(new ResourceEditor::ResourceTopLevelNode(file, contents, folder)); + } + } else { + for (const FileName &file : files) + folder->addFileNode(new FileNode(file, type, false)); + } - // updateFolders - QMultiMap existingFolderNodes; - foreach (FolderNode *node, folder->folderNodes()) - if (node->nodeType() != NodeType::Project && !dynamic_cast(node)) - existingFolderNodes.insert(node->filePath().toString(), node); - - QList foldersToRemove; - typedef QPair NodePair; - QList nodesToUpdate; - - // Check virtual + // Virtual { - QList::const_iterator it = virtualfolders.constBegin(); - QList::const_iterator end = virtualfolders.constEnd(); - for ( ; it != end; ++it) { - bool found = false; - QString path = (*it)->fullPath; - QMultiMap::const_iterator oldit - = existingFolderNodes.constFind(path); - while (oldit != existingFolderNodes.constEnd() && oldit.key() == path) { - if (oldit.value()->nodeType() == NodeType::VirtualFolder) { - VirtualFolderNode *vfn = dynamic_cast(oldit.value()); - if (vfn->priority() == (*it)->priority) { - found = true; - break; - } - } - ++oldit; - } - if (found) { - nodesToUpdate << NodePair(*it, *oldit); - } else { - FolderNode *newNode = createFolderNode(*it); - folder->addFolderNode(newNode); - nodesToUpdate << NodePair(*it, newNode); - } + for (InternalNode *node : virtualfolders) { + FolderNode *newNode = createFolderNode(node); + folder->addFolderNode(newNode); + node->addSubFolderContents(newNode); } } - // Check subnodes + // Subnodes { QMap::const_iterator it = subnodes.constBegin(); QMap::const_iterator end = subnodes.constEnd(); - for ( ; it != end; ++it) { - bool found = false; - QString path = it.value()->fullPath; - QMultiMap::const_iterator oldit - = existingFolderNodes.constFind(path); - while (oldit != existingFolderNodes.constEnd() && oldit.key() == path) { - if (oldit.value()->nodeType() == NodeType::Folder) { - found = true; - break; - } - ++oldit; - } - if (found) { - nodesToUpdate << NodePair(it.value(), *oldit); - } else { - FolderNode *newNode = createFolderNode(it.value()); - folder->addFolderNode(newNode); - nodesToUpdate << NodePair(it.value(), newNode); - } + FolderNode *newNode = createFolderNode(it.value()); + folder->addFolderNode(newNode); + it.value()->addSubFolderContents(newNode); } } - - QSet toKeep; - foreach (const NodePair &np, nodesToUpdate) - toKeep << np.second; - - QMultiMap::const_iterator jit = existingFolderNodes.constBegin(); - QMultiMap::const_iterator jend = existingFolderNodes.constEnd(); - for ( ; jit != jend; ++jit) - if (!toKeep.contains(jit.value())) - foldersToRemove << jit.value(); - - if (!foldersToRemove.isEmpty()) - folder->removeFolderNodes(foldersToRemove); - - foreach (const NodePair &np, nodesToUpdate) - np.first->updateSubFolders(np.second); - } - - // Makes the folder's files match this internal node's file list - void updateFiles(FolderNode *folder, FileType type) - { - SortByPath sortByPath; - Utils::sort(files, sortByPath); - QList nodes; - foreach (const FileName &file, files) - nodes << new FileNode(file, type, false); - folder->setFileNodes(nodes); - } - - // Makes the folder's files match this internal node's file list - void updateResourceFiles(FolderNode *folder) - { - QList existingResourceNodes; // for resource special handling - foreach (FolderNode *folderNode, folder->folderNodes()) { - if (ResourceEditor::ResourceTopLevelNode *rn = dynamic_cast(folderNode)) - existingResourceNodes << rn; - } - - QList resourcesToRemove; - FileNameList resourcesToAdd; - - SortByPath sortByPath; - Utils::sort(files, sortByPath); - Utils::sort(existingResourceNodes, sortByPath); - - ProjectExplorer::compareSortedLists(existingResourceNodes, files, resourcesToRemove, resourcesToAdd, sortByPath); - - QList nodesToAdd; - nodesToAdd.reserve(resourcesToAdd.size()); - - foreach (const FileName &file, resourcesToAdd) { - auto vfs = static_cast(folder->parentProjectNode())->m_project->qmakeVfs(); - QString contents; - // Prefer the cumulative file if it's non-empty, based on the assumption - // that it contains more "stuff". - vfs->readVirtualFile(file.toString(), QMakeVfs::VfsCumulative, &contents); - // If the cumulative evaluation botched the file too much, try the exact one. - if (contents.isEmpty()) - vfs->readVirtualFile(file.toString(), QMakeVfs::VfsExact, &contents); - nodesToAdd.append(new ResourceEditor::ResourceTopLevelNode(file, contents, folder)); - } - - folder->removeFolderNodes(resourcesToRemove); - folder->addFolderNodes(nodesToAdd); - - foreach (FolderNode *fn, nodesToAdd) - dynamic_cast(fn)->update(); } }; } // Internal @@ -730,7 +629,7 @@ void QmakePriFileNode::update(const Internal::PriFileEvalResult &result) } } - contents.updateSubFolders(this); + contents.addSubFolderContents(this); } void QmakePriFileNode::watchFolders(const QSet &folders) @@ -807,7 +706,7 @@ bool QmakePriFileNode::folderChanged(const QString &changedFolder, const QSetprojectType; }