From cef50e4166a72f0b9f5a87327a9285e6b4280e49 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 20 Apr 2018 11:31:58 +0200 Subject: [PATCH] Fix removal of projects from file system view The destruction of a project can still trigger file list changes, so just check if the project is actually still registered before updating anything. Task-number: QTCREATORBUG-20314 Change-Id: I0d634ca8986d1f09e84c310ae732c0bcdc675534 Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/session.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp index 9ce5f32a59f..3f446f282e4 100644 --- a/src/plugins/projectexplorer/session.cpp +++ b/src/plugins/projectexplorer/session.cpp @@ -384,20 +384,23 @@ void SessionManager::addProject(Project *pro) emit m_instance->projectAdded(pro); const auto updateFolderNavigation = [pro] { - const QIcon icon = pro->rootProjectNode() ? pro->rootProjectNode()->icon() : QIcon(); - FolderNavigationWidgetFactory::insertRootDirectory({projectFolderId(pro), - PROJECT_SORT_VALUE, - pro->displayName(), - pro->projectFilePath().parentDir(), - icon}); + // destructing projects might trigger changes, so check if the project is actually there + if (QTC_GUARD(d->m_projects.contains(pro))) { + const QIcon icon = pro->rootProjectNode() ? pro->rootProjectNode()->icon() : QIcon(); + FolderNavigationWidgetFactory::insertRootDirectory({projectFolderId(pro), + PROJECT_SORT_VALUE, + pro->displayName(), + pro->projectFilePath().parentDir(), + icon}); + } }; updateFolderNavigation(); configureEditors(pro); - connect(pro, &Project::fileListChanged, [pro, updateFolderNavigation]() { + connect(pro, &Project::fileListChanged, m_instance, [pro, updateFolderNavigation]() { configureEditors(pro); updateFolderNavigation(); // update icon }); - connect(pro, &Project::displayNameChanged, pro, updateFolderNavigation); + connect(pro, &Project::displayNameChanged, m_instance, updateFolderNavigation); if (!startupProject()) setStartupProject(pro); @@ -696,8 +699,9 @@ void SessionManager::removeProjects(const QList &remove) if (pro == d->m_startupProject) changeStartupProject = true; - emit m_instance->projectRemoved(pro); FolderNavigationWidgetFactory::removeRootDirectory(projectFolderId(pro)); + disconnect(pro, nullptr, m_instance, nullptr); + emit m_instance->projectRemoved(pro); } if (changeStartupProject)