Fix crash in ProjectTree on restoring a session

On adding nodes to the node structure, both the FlatModel::nodesAdded
and ProjectTree::nodesAdded code is run. We need to ensure that
FlatModel::nodesAdded is run first though, as we need that information
in the ProjectTree.

Task-number: QTCREATORBUG-13667
Change-Id: I0b4b41ed6036cfdef668c16689d25611633ab0c9
Reviewed-by: Eike Ziller <eike.ziller@theqtcompany.com>
This commit is contained in:
Daniel Teske
2014-12-15 18:24:25 +01:00
committed by Eike Ziller
parent beb0797008
commit 5d2d37b794
4 changed files with 61 additions and 26 deletions

View File

@@ -43,6 +43,7 @@
#include <coreplugin/vcsmanager.h>
#include <QApplication>
#include <QTimer>
namespace {
const char EXTERNAL_FILE_WARNING[] = "ExternalFile";
@@ -73,28 +74,50 @@ ProjectTree::ProjectTree(QObject *parent)
this, &ProjectTree::projectRemoved);
NodesWatcher *watcher = new NodesWatcher(this);
SessionManager::sessionNode()->registerWatcher(watcher);
m_watcher = new NodesWatcher(this);
SessionManager::sessionNode()->registerWatcher(m_watcher);
connect(watcher, &NodesWatcher::foldersAboutToBeRemoved,
connect(m_watcher, &NodesWatcher::foldersAboutToBeRemoved,
this, &ProjectTree::foldersAboutToBeRemoved);
connect(watcher, &NodesWatcher::foldersRemoved,
connect(m_watcher, &NodesWatcher::foldersRemoved,
this, &ProjectTree::foldersRemoved);
connect(watcher, &NodesWatcher::filesAboutToBeRemoved,
connect(m_watcher, &NodesWatcher::filesAboutToBeRemoved,
this, &ProjectTree::filesAboutToBeRemoved);
connect(watcher, &NodesWatcher::filesRemoved,
connect(m_watcher, &NodesWatcher::filesRemoved,
this, &ProjectTree::filesRemoved);
connect(watcher, &NodesWatcher::foldersAdded,
connect(m_watcher, &NodesWatcher::foldersAdded,
this, &ProjectTree::nodesAdded);
connect(watcher, &NodesWatcher::filesAdded,
connect(m_watcher, &NodesWatcher::filesAdded,
this, &ProjectTree::nodesAdded);
connect(qApp, &QApplication::focusChanged,
this, &ProjectTree::focusChanged);
}
void ProjectTree::aboutToShutDown()
{
disconnect(s_instance->m_watcher, &NodesWatcher::foldersAboutToBeRemoved,
s_instance, &ProjectTree::foldersAboutToBeRemoved);
disconnect(s_instance->m_watcher, &NodesWatcher::foldersRemoved,
s_instance, &ProjectTree::foldersRemoved);
disconnect(s_instance->m_watcher, &NodesWatcher::filesAboutToBeRemoved,
s_instance, &ProjectTree::filesAboutToBeRemoved);
disconnect(s_instance->m_watcher, &NodesWatcher::filesRemoved,
s_instance, &ProjectTree::filesRemoved);
disconnect(s_instance->m_watcher, &NodesWatcher::foldersAdded,
s_instance, &ProjectTree::nodesAdded);
disconnect(s_instance->m_watcher, &NodesWatcher::filesAdded,
s_instance, &ProjectTree::nodesAdded);
disconnect(qApp, &QApplication::focusChanged,
s_instance, &ProjectTree::focusChanged);
s_instance->update(0, 0);
}
ProjectTree *ProjectTree::instance()
{
return s_instance;
@@ -266,10 +289,12 @@ void ProjectTree::foldersAboutToBeRemoved(FolderNode *, const QList<FolderNode*>
void ProjectTree::foldersRemoved()
{
if (m_resetCurrentNodeFolder) {
updateFromFocus(true);
m_resetCurrentNodeFolder = false;
}
QTimer::singleShot(0, [this]() {
if (m_resetCurrentNodeFolder) {
updateFromFocus(true);
m_resetCurrentNodeFolder = false;
}
});
}
void ProjectTree::filesAboutToBeRemoved(FolderNode *, const QList<FileNode*> &list)
@@ -281,10 +306,12 @@ void ProjectTree::filesAboutToBeRemoved(FolderNode *, const QList<FileNode*> &li
void ProjectTree::filesRemoved()
{
if (m_resetCurrentNodeFile) {
updateFromFocus(true);
m_resetCurrentNodeFile = false;
}
QTimer::singleShot(0, [this]() {
if (m_resetCurrentNodeFile) {
updateFromFocus(true);
m_resetCurrentNodeFile = false;
}
});
}
void ProjectTree::aboutToRemoveProject(Project *project)
@@ -295,16 +322,20 @@ void ProjectTree::aboutToRemoveProject(Project *project)
void ProjectTree::projectRemoved()
{
updateFromFocus(true);
m_resetCurrentNodeProject = false;
QTimer::singleShot(0, [this]() {
updateFromFocus(true);
m_resetCurrentNodeProject = false;
});
}
void ProjectTree::nodesAdded()
{
if (Utils::anyOf(m_projectTreeWidgets, &ProjectTreeWidget::hasFocus))
return;
QTimer::singleShot(0, [this]() {
if (Utils::anyOf(m_projectTreeWidgets, &ProjectTreeWidget::hasFocus))
return;
updateFromDocumentManager();
updateFromDocumentManager();
});
}
void ProjectTree::updateExternalFileWarning()