ProjectNodes: Move (add|remove)(File|Folder)Node to FolderNode

The reason they were on ProjectNode is that the signals are emitted
on the projectnode, but since I moved addFiles and others to FolderNode,
this makes more sense.

Change-Id: I918ca4d93dab78c8bb93dff03f53d1a6fbe21340
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
This commit is contained in:
Daniel Teske
2014-02-18 19:49:55 +01:00
parent a6b6a99d62
commit d809037302
8 changed files with 210 additions and 221 deletions

View File

@@ -357,6 +357,168 @@ bool FolderNode::renameFile(const QString &filePath, const QString &newFilePath)
return false;
}
/*!
Adds file nodes specified by \a files 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
addFiles.
*/
void FolderNode::addFileNodes(const QList<FileNode *> &files)
{
Q_ASSERT(projectNode());
ProjectNode *pn = projectNode();
if (files.isEmpty())
return;
foreach (NodesWatcher *watcher, pn->watchers())
emit watcher->filesAboutToBeAdded(this, files);
foreach (FileNode *file, files) {
QTC_ASSERT(!file->parentFolderNode(),
qDebug("File node has already a parent folder"));
file->setParentFolderNode(this);
file->setProjectNode(pn);
// 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 {
QList<FileNode *>::iterator it
= qLowerBound(m_fileNodes.begin(),
m_fileNodes.end(),
file);
m_fileNodes.insert(it, file);
}
}
foreach (NodesWatcher *watcher, pn->watchers())
emit watcher->filesAdded();
}
/*!
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.
*/
void FolderNode::removeFileNodes(const QList<FileNode *> &files)
{
Q_ASSERT(projectNode());
ProjectNode *pn = projectNode();
if (files.isEmpty())
return;
QList<FileNode*> toRemove = files;
qSort(toRemove.begin(), toRemove.end());
foreach (NodesWatcher *watcher, pn->watchers())
emit watcher->filesAboutToBeRemoved(this, toRemove);
QList<FileNode*>::const_iterator toRemoveIter = toRemove.constBegin();
QList<FileNode*>::iterator filesIter = m_fileNodes.begin();
for (; toRemoveIter != toRemove.constEnd(); ++toRemoveIter) {
while (*filesIter != *toRemoveIter) {
++filesIter;
QTC_ASSERT(filesIter != m_fileNodes.end(),
qDebug("File to remove is not part of specified folder!"));
}
delete *filesIter;
filesIter = m_fileNodes.erase(filesIter);
}
foreach (NodesWatcher *watcher, pn->watchers())
emit watcher->filesRemoved();
}
/*!
Adds folder nodes specified by \a subFolders to the node hierarchy below
\a parentFolder and emits the corresponding signals.
*/
void FolderNode::addFolderNodes(const QList<FolderNode*> &subFolders)
{
Q_ASSERT(projectNode());
ProjectNode *pn = projectNode();
if (subFolders.isEmpty())
return;
foreach (NodesWatcher *watcher, pn->watchers())
watcher->foldersAboutToBeAdded(this, subFolders);
foreach (FolderNode *folder, subFolders) {
QTC_ASSERT(!folder->parentFolderNode(),
qDebug("Project node has already a parent folder"));
folder->setParentFolderNode(this);
folder->setProjectNode(pn);
// Find the correct place to insert
if (m_subFolderNodes.count() == 0
|| m_subFolderNodes.last() < folder) {
// empty list or greater then last node
m_subFolderNodes.append(folder);
} else {
// Binary Search for insertion point
QList<FolderNode*>::iterator it
= qLowerBound(m_subFolderNodes.begin(),
m_subFolderNodes.end(),
folder);
m_subFolderNodes.insert(it, folder);
}
// project nodes have to be added via addProjectNodes
QTC_ASSERT(folder->nodeType() != ProjectNodeType,
qDebug("project nodes have to be added via addProjectNodes"));
}
foreach (NodesWatcher *watcher, pn->watchers())
emit watcher->foldersAdded();
}
/*!
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(const QList<FolderNode*> &subFolders)
{
Q_ASSERT(projectNode());
ProjectNode *pn = projectNode();
if (subFolders.isEmpty())
return;
QList<FolderNode*> toRemove = subFolders;
qSort(toRemove.begin(), toRemove.end());
foreach (NodesWatcher *watcher, pn->watchers())
emit watcher->foldersAboutToBeRemoved(this, toRemove);
QList<FolderNode*>::const_iterator toRemoveIter = toRemove.constBegin();
QList<FolderNode*>::iterator folderIter = m_subFolderNodes.begin();
for (; toRemoveIter != toRemove.constEnd(); ++toRemoveIter) {
QTC_ASSERT((*toRemoveIter)->nodeType() != ProjectNodeType,
qDebug("project nodes have to be removed via removeProjectNodes"));
while (*folderIter != *toRemoveIter) {
++folderIter;
QTC_ASSERT(folderIter != m_subFolderNodes.end(),
qDebug("Folder to remove is not part of specified folder!"));
}
delete *folderIter;
folderIter = m_subFolderNodes.erase(folderIter);
}
foreach (NodesWatcher *watcher, pn->watchers())
emit watcher->foldersRemoved();
}
/*!
\class ProjectExplorer::VirtualFolderNode
@@ -573,178 +735,6 @@ void ProjectNode::removeProjectNodes(const QList<ProjectNode*> &subProjects)
}
}
/*!
Adds folder nodes specified by \a subFolders to the node hierarchy below
\a parentFolder and emits the corresponding signals.
*/
void ProjectNode::addFolderNodes(const QList<FolderNode*> &subFolders, FolderNode *parentFolder)
{
Q_ASSERT(parentFolder);
if (!subFolders.isEmpty()) {
const bool emitSignals = (parentFolder->projectNode() == this);
if (emitSignals)
foreach (NodesWatcher *watcher, m_watchers)
watcher->foldersAboutToBeAdded(parentFolder, subFolders);
foreach (FolderNode *folder, subFolders) {
QTC_ASSERT(!folder->parentFolderNode(),
qDebug("Project node has already a parent folder"));
folder->setParentFolderNode(parentFolder);
folder->setProjectNode(this);
// Find the correct place to insert
if (parentFolder->m_subFolderNodes.count() == 0
|| parentFolder->m_subFolderNodes.last() < folder) {
// empty list or greater then last node
parentFolder->m_subFolderNodes.append(folder);
} else {
// Binary Search for insertion point
QList<FolderNode*>::iterator it
= qLowerBound(parentFolder->m_subFolderNodes.begin(),
parentFolder->m_subFolderNodes.end(),
folder);
parentFolder->m_subFolderNodes.insert(it, folder);
}
// project nodes have to be added via addProjectNodes
QTC_ASSERT(folder->nodeType() != ProjectNodeType,
qDebug("project nodes have to be added via addProjectNodes"));
}
if (emitSignals)
foreach (NodesWatcher *watcher, m_watchers)
emit watcher->foldersAdded();
}
}
/*!
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 ProjectNode::removeFolderNodes(const QList<FolderNode*> &subFolders,
FolderNode *parentFolder)
{
Q_ASSERT(parentFolder);
if (!subFolders.isEmpty()) {
const bool emitSignals = (parentFolder->projectNode() == this);
QList<FolderNode*> toRemove = subFolders;
qSort(toRemove.begin(), toRemove.end());
if (emitSignals)
foreach (NodesWatcher *watcher, m_watchers)
emit watcher->foldersAboutToBeRemoved(parentFolder, toRemove);
QList<FolderNode*>::const_iterator toRemoveIter = toRemove.constBegin();
QList<FolderNode*>::iterator folderIter = parentFolder->m_subFolderNodes.begin();
for (; toRemoveIter != toRemove.constEnd(); ++toRemoveIter) {
QTC_ASSERT((*toRemoveIter)->nodeType() != ProjectNodeType,
qDebug("project nodes have to be removed via removeProjectNodes"));
while (*folderIter != *toRemoveIter) {
++folderIter;
QTC_ASSERT(folderIter != parentFolder->m_subFolderNodes.end(),
qDebug("Folder to remove is not part of specified folder!"));
}
delete *folderIter;
folderIter = parentFolder->m_subFolderNodes.erase(folderIter);
}
if (emitSignals)
foreach (NodesWatcher *watcher, m_watchers)
emit watcher->foldersRemoved();
}
}
/*!
Adds file nodes specified by \a files to the internal list in the location
specified by \a folder and emits the corresponding signals.
This function should be called within an implementation of the public function
addFiles.
*/
void ProjectNode::addFileNodes(const QList<FileNode*> &files, FolderNode *folder)
{
Q_ASSERT(folder);
if (!files.isEmpty()) {
const bool emitSignals = (folder->projectNode() == this);
if (emitSignals)
foreach (NodesWatcher *watcher, m_watchers)
emit watcher->filesAboutToBeAdded(folder, files);
foreach (FileNode *file, files) {
QTC_ASSERT(!file->parentFolderNode(),
qDebug("File node has already a parent folder"));
file->setParentFolderNode(folder);
file->setProjectNode(this);
// Now find the correct place to insert file
if (folder->m_fileNodes.count() == 0
|| folder->m_fileNodes.last() < file) {
// empty list or greater then last node
folder->m_fileNodes.append(file);
} else {
QList<FileNode *>::iterator it
= qLowerBound(folder->m_fileNodes.begin(),
folder->m_fileNodes.end(),
file);
folder->m_fileNodes.insert(it, file);
}
}
if (emitSignals)
foreach (NodesWatcher *watcher, m_watchers)
emit watcher->filesAdded();
}
}
/*!
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.
*/
void ProjectNode::removeFileNodes(const QList<FileNode*> &files, FolderNode *folder)
{
Q_ASSERT(folder);
if (!files.isEmpty()) {
const bool emitSignals = (folder->projectNode() == this);
QList<FileNode*> toRemove = files;
qSort(toRemove.begin(), toRemove.end());
if (emitSignals)
foreach (NodesWatcher *watcher, m_watchers)
emit watcher->filesAboutToBeRemoved(folder, toRemove);
QList<FileNode*>::const_iterator toRemoveIter = toRemove.constBegin();
QList<FileNode*>::iterator filesIter = folder->m_fileNodes.begin();
for (; toRemoveIter != toRemove.constEnd(); ++toRemoveIter) {
while (*filesIter != *toRemoveIter) {
++filesIter;
QTC_ASSERT(filesIter != folder->m_fileNodes.end(),
qDebug("File to remove is not part of specified folder!"));
}
delete *filesIter;
filesIter = folder->m_fileNodes.erase(filesIter);
}
if (emitSignals)
foreach (NodesWatcher *watcher, m_watchers)
emit watcher->filesRemoved();
}
}
void ProjectNode::watcherDestroyed(QObject *watcher)
{
// cannot use qobject_cast here