ProjectManager: Add function to set a list of files in folder nodes

... instead of having to remove/add. Use it in some places
in QmakeProjectManager and the ResourceEditor where the
(sub)tree is rebuild anyway.

Change-Id: I46b3c078c576b72dba6e87432570d030b7572026
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
hjk
2017-01-19 11:32:53 +01:00
parent 4012611aab
commit e20549d295
5 changed files with 33 additions and 120 deletions

View File

@@ -598,6 +598,15 @@ void FolderNode::removeFileNodes(const QList<FileNode *> &files)
ProjectTree::emitDataChanged(); ProjectTree::emitDataChanged();
} }
void FolderNode::setFileNodes(const QList<FileNode *> &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 folder nodes specified by \a subFolders to the node hierarchy below
\a parentFolder and emits the corresponding signals. \a parentFolder and emits the corresponding signals.
@@ -666,6 +675,15 @@ void FolderNode::removeFolderNodes(const QList<FolderNode*> &subFolders)
ProjectTree::emitDataChanged(); ProjectTree::emitDataChanged();
} }
void FolderNode::setFolderNodes(const QList<FolderNode *> &folders)
{
qDeleteAll(m_folderNodes);
m_folderNodes = folders;
for (FolderNode *node : m_folderNodes)
node->setParentFolderNode(this);
ProjectTree::emitDataChanged();
}
bool FolderNode::showInSimpleTree() const bool FolderNode::showInSimpleTree() const
{ {
return false; return false;

View File

@@ -251,9 +251,11 @@ public:
void addFileNodes(const QList<FileNode*> &files); void addFileNodes(const QList<FileNode*> &files);
void removeFileNodes(const QList<FileNode*> &files); void removeFileNodes(const QList<FileNode*> &files);
void setFileNodes(const QList<FileNode*> &files);
void addFolderNodes(const QList<FolderNode*> &subFolders); void addFolderNodes(const QList<FolderNode*> &subFolders);
void removeFolderNodes(const QList<FolderNode*> &subFolders); void removeFolderNodes(const QList<FolderNode*> &subFolders);
void setFolderNodes(const QList<FolderNode*> &folders);
FolderNode *asFolderNode() override { return this; } FolderNode *asFolderNode() override { return this; }
const FolderNode *asFolderNode() const override { return this; } const FolderNode *asFolderNode() const override { return this; }

View File

@@ -534,27 +534,12 @@ struct InternalNode
// Makes the folder's files match this internal node's file list // Makes the folder's files match this internal node's file list
void updateFiles(FolderNode *folder, FileType type) void updateFiles(FolderNode *folder, FileType type)
{ {
QList<FileNode*> existingFileNodes;
foreach (FileNode *fileNode, folder->fileNodes()) {
if (fileNode->fileType() == type && !fileNode->isGenerated())
existingFileNodes << fileNode;
}
QList<FileNode*> filesToRemove;
FileNameList filesToAdd;
SortByPath sortByPath; SortByPath sortByPath;
Utils::sort(files, sortByPath); Utils::sort(files, sortByPath);
Utils::sort(existingFileNodes, sortByPath); QList<FileNode *> nodes;
foreach (const FileName &file, files)
ProjectExplorer::compareSortedLists(existingFileNodes, files, filesToRemove, filesToAdd, sortByPath); nodes << new FileNode(file, type, false);
folder->setFileNodes(nodes);
QList<FileNode *> nodesToAdd;
foreach (const FileName &file, filesToAdd)
nodesToAdd << new FileNode(file, type, false);
folder->removeFileNodes(filesToRemove);
folder->addFileNodes(nodesToAdd);
} }
// Makes the folder's files match this internal node's file list // Makes the folder's files match this internal node's file list
@@ -2057,9 +2042,9 @@ void QmakeProFileNode::applyEvaluate(EvalResult *evalResult)
return; return;
// delete files && folders && projects // delete files && folders && projects
removeFileNodes(fileNodes()); setFileNodes({});
removeProjectNodes(projectNodes()); removeProjectNodes(projectNodes());
removeFolderNodes(folderNodes()); setFolderNodes({});
m_projectType = InvalidProject; m_projectType = InvalidProject;
} }
@@ -2079,9 +2064,9 @@ void QmakeProFileNode::applyEvaluate(EvalResult *evalResult)
} }
} }
removeFileNodes(fileNodes()); setFileNodes({});
removeProjectNodes(projectNodes()); removeProjectNodes(projectNodes());
removeFolderNodes(folderNodes()); setFolderNodes({});
m_projectType = result->projectType; m_projectType = result->projectType;
} }

View File

@@ -103,11 +103,6 @@ static bool sortByPrefixAndLang(ProjectExplorer::FolderNode *a, ProjectExplorer:
return aa->lang() < bb->lang(); return aa->lang() < bb->lang();
} }
static bool sortNodesByPath(ProjectExplorer::Node *a, ProjectExplorer::Node *b)
{
return a->filePath() < b->filePath();
}
ResourceTopLevelNode::ResourceTopLevelNode( ResourceTopLevelNode::ResourceTopLevelNode(
const Utils::FileName &filePath, const QString &contents, const Utils::FileName &filePath, const QString &contents,
ProjectExplorer::FolderNode *parent) ProjectExplorer::FolderNode *parent)
@@ -226,27 +221,13 @@ void ResourceTopLevelNode::update()
} }
QList<ProjectExplorer::FolderNode *> oldPrefixList = folderNodes(); addFolderNodes(newPrefixList);
QList<ProjectExplorer::FolderNode *> prefixesToAdd;
QList<ProjectExplorer::FolderNode *> 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));
foreach (FolderNode *sfn, folderNodes()) { foreach (FolderNode *sfn, folderNodes()) {
ResourceFolderNode *srn = static_cast<ResourceFolderNode *>(sfn); ResourceFolderNode *srn = static_cast<ResourceFolderNode *>(sfn);
PrefixFolderLang folderId(srn->prefix(), QString(), srn->lang()); PrefixFolderLang folderId(srn->prefix(), QString(), srn->lang());
srn->updateFiles(filesToAdd[folderId]); srn->setFileNodes(filesToAdd[folderId]);
srn->updateFolders(foldersToAddToPrefix[folderId]); srn->setFolderNodes(foldersToAddToPrefix[folderId]);
foreach (FolderNode* ssfn, sfn->folderNodes()) { foreach (FolderNode* ssfn, sfn->folderNodes()) {
SimpleResourceFolderNode *sssn = static_cast<SimpleResourceFolderNode *>(ssfn); SimpleResourceFolderNode *sssn = static_cast<SimpleResourceFolderNode *>(ssfn);
sssn->addFilesAndSubfolders(filesToAdd, foldersToAddToFolders, srn->prefix(), srn->lang()); sssn->addFilesAndSubfolders(filesToAdd, foldersToAddToFolders, srn->prefix(), srn->lang());
@@ -533,40 +514,6 @@ ResourceTopLevelNode *ResourceFolderNode::resourceNode() const
return m_topLevelNode; return m_topLevelNode;
} }
void ResourceFolderNode::updateFiles(QList<ProjectExplorer::FileNode *> newList)
{
QList<ProjectExplorer::FileNode *> oldList = fileNodes();
QList<ProjectExplorer::FileNode *> filesToAdd;
QList<ProjectExplorer::FileNode *> 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<ProjectExplorer::FolderNode *> newList)
{
QList<ProjectExplorer::FolderNode *> oldList = folderNodes();
QList<ProjectExplorer::FolderNode *> foldersToAdd;
QList<ProjectExplorer::FolderNode *> 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) ResourceFileWatcher::ResourceFileWatcher(ResourceTopLevelNode *node)
: IDocument(0), m_node(node) : IDocument(0), m_node(node)
{ {
@@ -718,49 +665,14 @@ ResourceFolderNode *SimpleResourceFolderNode::prefixNode() const
return m_prefixNode; return m_prefixNode;
} }
void SimpleResourceFolderNode::updateFiles(QList<ProjectExplorer::FileNode *> newList)
{
QList<ProjectExplorer::FileNode *> oldList = fileNodes();
QList<ProjectExplorer::FileNode *> filesToAdd;
QList<ProjectExplorer::FileNode *> 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<ProjectExplorer::FolderNode *> newList)
{
QList<ProjectExplorer::FolderNode *> oldList = folderNodes();
QList<ProjectExplorer::FolderNode *> foldersToAdd;
QList<ProjectExplorer::FolderNode *> 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<PrefixFolderLang, void SimpleResourceFolderNode::addFilesAndSubfolders(QMap<PrefixFolderLang,
QList<ProjectExplorer::FileNode *>> filesToAdd, QList<ProjectExplorer::FileNode *>> filesToAdd,
QMap<PrefixFolderLang, QMap<PrefixFolderLang,
QList<ProjectExplorer::FolderNode*> > foldersToAdd, QList<ProjectExplorer::FolderNode*> > foldersToAdd,
const QString &prefix, const QString &lang) const QString &prefix, const QString &lang)
{ {
updateFiles(filesToAdd.value(PrefixFolderLang(prefix, m_folderName, lang))); setFileNodes(filesToAdd.value(PrefixFolderLang(prefix, m_folderName, lang)));
updateFolders(foldersToAdd.value(PrefixFolderLang(prefix, m_folderName, lang))); setFolderNodes(foldersToAdd.value(PrefixFolderLang(prefix, m_folderName, lang)));
foreach (FolderNode* subNode, folderNodes()) { foreach (FolderNode* subNode, folderNodes()) {
SimpleResourceFolderNode* sn = static_cast<SimpleResourceFolderNode*>(subNode); SimpleResourceFolderNode* sn = static_cast<SimpleResourceFolderNode*>(subNode);
sn->addFilesAndSubfolders(filesToAdd, foldersToAdd, prefix, lang); sn->addFilesAndSubfolders(filesToAdd, foldersToAdd, prefix, lang);

View File

@@ -112,8 +112,6 @@ public:
QString lang() const; QString lang() const;
ResourceTopLevelNode *resourceNode() const; ResourceTopLevelNode *resourceNode() const;
private: private:
void updateFolders(QList<ProjectExplorer::FolderNode *> newList);
void updateFiles(QList<ProjectExplorer::FileNode *> newList);
ResourceTopLevelNode *m_topLevelNode; ResourceTopLevelNode *m_topLevelNode;
QString m_prefix; QString m_prefix;
QString m_lang; QString m_lang;
@@ -140,8 +138,6 @@ public:
ResourceFolderNode *prefixNode() const; ResourceFolderNode *prefixNode() const;
private: private:
void updateFiles(QList<ProjectExplorer::FileNode *> newList);
void updateFolders(QList<ProjectExplorer::FolderNode *> newList);
QString m_folderName; QString m_folderName;
QString m_displayName; QString m_displayName;
QString m_prefix; QString m_prefix;