forked from qt-creator/qt-creator
ProjectExplorer: Make the FlatModel a Utils::TreeModel
The FlatModel is essentially a proxy model keeping expansion and
filter state per ProjectTree(View). Using a Utils::TreeModel makes
it fast enough to allow recreation of the proxy structure on
structural changes simplifying the parent/child logic significantly.
The {Session,Project,Folder,File}Node hierarchy still is still primary
information and shared by all views.
Change-Id: Ic08180a19bda37908280ff30e0737d188ed93e92
Reviewed-by: Robert Loehning <robert.loehning@qt.io>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
@@ -258,167 +258,14 @@ void ProjectTree::updateContext()
|
||||
|
||||
void ProjectTree::emitNodeUpdated(Node *node)
|
||||
{
|
||||
if (!isInNodeHierarchy(node))
|
||||
if (!s_instance->isInNodeHierarchy(node))
|
||||
return;
|
||||
emit nodeUpdated(node);
|
||||
emit s_instance->nodeUpdated(node);
|
||||
}
|
||||
|
||||
void ProjectTree::emitAboutToChangeShowInSimpleTree(FolderNode *node)
|
||||
void ProjectTree::emitDataChanged()
|
||||
{
|
||||
if (!isInNodeHierarchy(node))
|
||||
return;
|
||||
emit aboutToChangeShowInSimpleTree(node);
|
||||
}
|
||||
|
||||
void ProjectTree::emitShowInSimpleTreeChanged(FolderNode *node)
|
||||
{
|
||||
if (!isInNodeHierarchy(node))
|
||||
return;
|
||||
emit showInSimpleTreeChanged(node);
|
||||
}
|
||||
|
||||
void ProjectTree::emitFoldersAboutToBeAdded(FolderNode *parentFolder, const QList<FolderNode *> &newFolders)
|
||||
{
|
||||
if (!isInNodeHierarchy(parentFolder))
|
||||
return;
|
||||
|
||||
m_foldersAdded = newFolders;
|
||||
|
||||
emit foldersAboutToBeAdded(parentFolder, newFolders);
|
||||
}
|
||||
|
||||
void ProjectTree::emitFoldersAdded(FolderNode *folder)
|
||||
{
|
||||
if (!isInNodeHierarchy(folder))
|
||||
return;
|
||||
|
||||
emit foldersAdded();
|
||||
|
||||
if (Utils::anyOf(m_projectTreeWidgets, &ProjectTreeWidget::hasFocus))
|
||||
return;
|
||||
|
||||
if (!m_currentNode) {
|
||||
Core::IDocument *document = Core::EditorManager::currentDocument();
|
||||
const FileName fileName = document ? document->filePath() : FileName();
|
||||
|
||||
|
||||
FindNodesForFileVisitor findNodes(fileName);
|
||||
foreach (FolderNode *fn, m_foldersAdded)
|
||||
fn->accept(&findNodes);
|
||||
|
||||
Node *bestNode = ProjectTreeWidget::mostExpandedNode(findNodes.nodes());
|
||||
if (!bestNode)
|
||||
return;
|
||||
|
||||
updateFromNode(bestNode);
|
||||
}
|
||||
m_foldersAdded.clear();
|
||||
}
|
||||
|
||||
void ProjectTree::emitFoldersAboutToBeRemoved(FolderNode *parentFolder, const QList<FolderNode *> &staleFolders)
|
||||
{
|
||||
if (!isInNodeHierarchy(parentFolder))
|
||||
return;
|
||||
|
||||
Node *n = ProjectTree::currentNode();
|
||||
while (n) {
|
||||
if (FolderNode *fn = n->asFolderNode()) {
|
||||
if (staleFolders.contains(fn)) {
|
||||
ProjectNode *pn = n->parentProjectNode();
|
||||
// Make sure the node we are switching too isn't going to be removed also
|
||||
while (staleFolders.contains(pn))
|
||||
pn = pn->parentFolderNode()->parentProjectNode();
|
||||
m_resetCurrentNodeFolder = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
n = n->parentFolderNode();
|
||||
}
|
||||
emit foldersAboutToBeRemoved(parentFolder, staleFolders);
|
||||
}
|
||||
|
||||
void ProjectTree::emitFoldersRemoved(FolderNode *folder)
|
||||
{
|
||||
if (!isInNodeHierarchy(folder))
|
||||
return;
|
||||
|
||||
emit foldersRemoved();
|
||||
|
||||
if (m_resetCurrentNodeFolder) {
|
||||
updateFromFocus(true);
|
||||
m_resetCurrentNodeFolder = false;
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectTree::emitFilesAboutToBeAdded(FolderNode *folder, const QList<FileNode *> &newFiles)
|
||||
{
|
||||
if (!isInNodeHierarchy(folder))
|
||||
return;
|
||||
m_filesAdded = newFiles;
|
||||
emit filesAboutToBeAdded(folder, newFiles);
|
||||
}
|
||||
|
||||
void ProjectTree::emitFilesAdded(FolderNode *folder)
|
||||
{
|
||||
if (!isInNodeHierarchy(folder))
|
||||
return;
|
||||
|
||||
emit filesAdded();
|
||||
|
||||
if (Utils::anyOf(m_projectTreeWidgets, &ProjectTreeWidget::hasFocus))
|
||||
return;
|
||||
|
||||
if (!m_currentNode) {
|
||||
Core::IDocument *document = Core::EditorManager::currentDocument();
|
||||
const FileName fileName = document ? document->filePath() : FileName();
|
||||
|
||||
int index = Utils::indexOf(m_filesAdded, Utils::equal(&FileNode::filePath, fileName));
|
||||
|
||||
if (index == -1)
|
||||
return;
|
||||
|
||||
updateFromNode(m_filesAdded.at(index));
|
||||
}
|
||||
m_filesAdded.clear();
|
||||
}
|
||||
|
||||
void ProjectTree::emitFilesAboutToBeRemoved(FolderNode *folder, const QList<FileNode *> &staleFiles)
|
||||
{
|
||||
if (!isInNodeHierarchy(folder))
|
||||
return;
|
||||
|
||||
if (m_currentNode)
|
||||
if (FileNode *fileNode = m_currentNode->asFileNode())
|
||||
if (staleFiles.contains(fileNode))
|
||||
m_resetCurrentNodeFile = true;
|
||||
|
||||
emit filesAboutToBeRemoved(folder, staleFiles);
|
||||
}
|
||||
|
||||
void ProjectTree::emitFilesRemoved(FolderNode *folder)
|
||||
{
|
||||
if (!isInNodeHierarchy(folder))
|
||||
return;
|
||||
emit filesRemoved();
|
||||
|
||||
if (m_resetCurrentNodeFile) {
|
||||
updateFromFocus(true);
|
||||
m_resetCurrentNodeFile = false;
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectTree::emitNodeSortKeyAboutToChange(Node *node)
|
||||
{
|
||||
if (!isInNodeHierarchy(node))
|
||||
return;
|
||||
emit nodeSortKeyAboutToChange(node);
|
||||
}
|
||||
|
||||
void ProjectTree::emitNodeSortKeyChanged(Node *node)
|
||||
{
|
||||
if (!isInNodeHierarchy(node))
|
||||
return;
|
||||
emit nodeSortKeyChanged();
|
||||
instance()->dataChanged();
|
||||
}
|
||||
|
||||
void ProjectTree::collapseAll()
|
||||
|
||||
Reference in New Issue
Block a user