diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index a2657a02b00..77d2e8d36f9 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -598,6 +598,15 @@ void FolderNode::removeFileNodes(const QList &files) ProjectTree::emitDataChanged(); } +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 \a parentFolder and emits the corresponding signals. @@ -666,6 +675,15 @@ void FolderNode::removeFolderNodes(const QList &subFolders) ProjectTree::emitDataChanged(); } +void FolderNode::setFolderNodes(const QList &folders) +{ + qDeleteAll(m_folderNodes); + m_folderNodes = folders; + for (FolderNode *node : m_folderNodes) + node->setParentFolderNode(this); + ProjectTree::emitDataChanged(); +} + bool FolderNode::showInSimpleTree() const { return false; diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index a9f6498a02b..fc8aa6cdc8c 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -251,9 +251,11 @@ public: void addFileNodes(const QList &files); void removeFileNodes(const QList &files); + void setFileNodes(const QList &files); void addFolderNodes(const QList &subFolders); void removeFolderNodes(const QList &subFolders); + void setFolderNodes(const QList &folders); FolderNode *asFolderNode() override { return this; } const FolderNode *asFolderNode() const override { return this; } diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index dd3b055db95..13d91af08f4 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -534,27 +534,12 @@ struct InternalNode // Makes the folder's files match this internal node's file list void updateFiles(FolderNode *folder, FileType type) { - QList existingFileNodes; - foreach (FileNode *fileNode, folder->fileNodes()) { - if (fileNode->fileType() == type && !fileNode->isGenerated()) - existingFileNodes << fileNode; - } - - QList filesToRemove; - FileNameList filesToAdd; - SortByPath sortByPath; Utils::sort(files, sortByPath); - Utils::sort(existingFileNodes, sortByPath); - - ProjectExplorer::compareSortedLists(existingFileNodes, files, filesToRemove, filesToAdd, sortByPath); - - QList nodesToAdd; - foreach (const FileName &file, filesToAdd) - nodesToAdd << new FileNode(file, type, false); - - folder->removeFileNodes(filesToRemove); - folder->addFileNodes(nodesToAdd); + 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 @@ -2057,9 +2042,9 @@ void QmakeProFileNode::applyEvaluate(EvalResult *evalResult) return; // delete files && folders && projects - removeFileNodes(fileNodes()); + setFileNodes({}); removeProjectNodes(projectNodes()); - removeFolderNodes(folderNodes()); + setFolderNodes({}); m_projectType = InvalidProject; } @@ -2079,9 +2064,9 @@ void QmakeProFileNode::applyEvaluate(EvalResult *evalResult) } } - removeFileNodes(fileNodes()); + setFileNodes({}); removeProjectNodes(projectNodes()); - removeFolderNodes(folderNodes()); + setFolderNodes({}); m_projectType = result->projectType; } diff --git a/src/plugins/resourceeditor/resourcenode.cpp b/src/plugins/resourceeditor/resourcenode.cpp index 1bb7b8c0ed7..7603dd6d41e 100644 --- a/src/plugins/resourceeditor/resourcenode.cpp +++ b/src/plugins/resourceeditor/resourcenode.cpp @@ -103,11 +103,6 @@ static bool sortByPrefixAndLang(ProjectExplorer::FolderNode *a, ProjectExplorer: return aa->lang() < bb->lang(); } -static bool sortNodesByPath(ProjectExplorer::Node *a, ProjectExplorer::Node *b) -{ - return a->filePath() < b->filePath(); -} - ResourceTopLevelNode::ResourceTopLevelNode( const Utils::FileName &filePath, const QString &contents, ProjectExplorer::FolderNode *parent) @@ -226,27 +221,13 @@ void ResourceTopLevelNode::update() } - QList oldPrefixList = folderNodes(); - QList prefixesToAdd; - QList prefixesToRemove; - - Utils::sort(oldPrefixList, sortByPrefixAndLang); - Utils::sort(newPrefixList, sortByPrefixAndLang); - - ProjectExplorer::compareSortedLists(oldPrefixList, newPrefixList, - prefixesToRemove, prefixesToAdd, sortByPrefixAndLang); - - removeFolderNodes(prefixesToRemove); - addFolderNodes(prefixesToAdd); - - // delete nodes that weren't added - qDeleteAll(ProjectExplorer::subtractSortedList(newPrefixList, prefixesToAdd, sortByPrefixAndLang)); + addFolderNodes(newPrefixList); foreach (FolderNode *sfn, folderNodes()) { ResourceFolderNode *srn = static_cast(sfn); PrefixFolderLang folderId(srn->prefix(), QString(), srn->lang()); - srn->updateFiles(filesToAdd[folderId]); - srn->updateFolders(foldersToAddToPrefix[folderId]); + srn->setFileNodes(filesToAdd[folderId]); + srn->setFolderNodes(foldersToAddToPrefix[folderId]); foreach (FolderNode* ssfn, sfn->folderNodes()) { SimpleResourceFolderNode *sssn = static_cast(ssfn); sssn->addFilesAndSubfolders(filesToAdd, foldersToAddToFolders, srn->prefix(), srn->lang()); @@ -533,40 +514,6 @@ ResourceTopLevelNode *ResourceFolderNode::resourceNode() const return m_topLevelNode; } -void ResourceFolderNode::updateFiles(QList newList) -{ - QList oldList = fileNodes(); - QList filesToAdd; - QList filesToRemove; - - Utils::sort(oldList, sortNodesByPath); - Utils::sort(newList, sortNodesByPath); - - ProjectExplorer::compareSortedLists(oldList, newList, filesToRemove, filesToAdd, sortNodesByPath); - - removeFileNodes(filesToRemove); - addFileNodes(filesToAdd); - - qDeleteAll(ProjectExplorer::subtractSortedList(newList, filesToAdd, sortNodesByPath)); -} - -void ResourceFolderNode::updateFolders(QList newList) -{ - QList oldList = folderNodes(); - QList foldersToAdd; - QList foldersToRemove; - - Utils::sort(oldList, sortNodesByPath); - Utils::sort(newList, sortNodesByPath); - - ProjectExplorer::compareSortedLists(oldList, newList, foldersToRemove, foldersToAdd, sortNodesByPath); - - removeFolderNodes(foldersToRemove); - addFolderNodes(foldersToAdd); - - qDeleteAll(ProjectExplorer::subtractSortedList(newList, foldersToAdd, sortNodesByPath)); -} - ResourceFileWatcher::ResourceFileWatcher(ResourceTopLevelNode *node) : IDocument(0), m_node(node) { @@ -718,49 +665,14 @@ ResourceFolderNode *SimpleResourceFolderNode::prefixNode() const return m_prefixNode; } -void SimpleResourceFolderNode::updateFiles(QList newList) -{ - QList oldList = fileNodes(); - QList filesToAdd; - QList filesToRemove; - - Utils::sort(oldList, sortNodesByPath); - Utils::sort(newList, sortNodesByPath); - - ProjectExplorer::compareSortedLists(oldList, newList, filesToRemove, filesToAdd, sortNodesByPath); - - removeFileNodes(filesToRemove); - addFileNodes(filesToAdd); - - qDeleteAll(ProjectExplorer::subtractSortedList(newList, filesToAdd, sortNodesByPath)); -} - -void SimpleResourceFolderNode::updateFolders(QList newList) -{ - QList oldList = folderNodes(); - QList foldersToAdd; - QList foldersToRemove; - - Utils::sort(oldList, sortNodesByPath); - Utils::sort(newList, sortNodesByPath); - - ProjectExplorer::compareSortedLists(oldList, newList, foldersToRemove, foldersToAdd, sortNodesByPath); - - removeFolderNodes(foldersToRemove); - addFolderNodes(foldersToAdd); - - qDeleteAll(ProjectExplorer::subtractSortedList(newList, foldersToAdd, sortNodesByPath)); -} - - void SimpleResourceFolderNode::addFilesAndSubfolders(QMap> filesToAdd, QMap > foldersToAdd, const QString &prefix, const QString &lang) { - updateFiles(filesToAdd.value(PrefixFolderLang(prefix, m_folderName, lang))); - updateFolders(foldersToAdd.value(PrefixFolderLang(prefix, m_folderName, lang))); + setFileNodes(filesToAdd.value(PrefixFolderLang(prefix, m_folderName, lang))); + setFolderNodes(foldersToAdd.value(PrefixFolderLang(prefix, m_folderName, lang))); foreach (FolderNode* subNode, folderNodes()) { SimpleResourceFolderNode* sn = static_cast(subNode); sn->addFilesAndSubfolders(filesToAdd, foldersToAdd, prefix, lang); diff --git a/src/plugins/resourceeditor/resourcenode.h b/src/plugins/resourceeditor/resourcenode.h index 2b9f4ab237e..1ea628e3939 100644 --- a/src/plugins/resourceeditor/resourcenode.h +++ b/src/plugins/resourceeditor/resourcenode.h @@ -112,8 +112,6 @@ public: QString lang() const; ResourceTopLevelNode *resourceNode() const; private: - void updateFolders(QList newList); - void updateFiles(QList newList); ResourceTopLevelNode *m_topLevelNode; QString m_prefix; QString m_lang; @@ -140,8 +138,6 @@ public: ResourceFolderNode *prefixNode() const; private: - void updateFiles(QList newList); - void updateFolders(QList newList); QString m_folderName; QString m_displayName; QString m_prefix;