aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/projectexplorer/subscription.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/projectexplorer/subscription.cpp')
-rw-r--r--src/plugins/projectexplorer/subscription.cpp63
1 files changed, 33 insertions, 30 deletions
diff --git a/src/plugins/projectexplorer/subscription.cpp b/src/plugins/projectexplorer/subscription.cpp
index 891a60adcbe..3a842351327 100644
--- a/src/plugins/projectexplorer/subscription.cpp
+++ b/src/plugins/projectexplorer/subscription.cpp
@@ -27,6 +27,7 @@
#include "project.h"
#include "projectconfiguration.h"
+#include "session.h"
#include "target.h"
#include <utils/qtcassert.h>
@@ -37,13 +38,8 @@ namespace Internal {
Subscription::Subscription(const Subscription::Connector &s, const QObject *receiver, QObject *parent) :
QObject(parent), m_subscriber(s)
{
- if (receiver != parent) {
- connect(receiver, &QObject::destroyed, this, [this]() {
- unsubscribeAll();
- m_subscriber = Connector(); // Reset subscriber
- deleteLater();
- });
- }
+ if (receiver != parent)
+ connect(receiver, &QObject::destroyed, this, &Subscription::destroy);
}
Subscription::~Subscription()
@@ -58,12 +54,7 @@ void Subscription::subscribe(ProjectConfiguration *pc)
connectTo(pc);
- if (auto p = qobject_cast<Project *>(pc)) {
- for (Target *t : p->targets()) {
- for (ProjectConfiguration *pc : t->projectConfigurations())
- connectTo(pc);
- }
- } else if (auto t = qobject_cast<Target *>(pc)) {
+ if (auto t = qobject_cast<Target *>(pc)) {
for (ProjectConfiguration *pc : t->projectConfigurations())
connectTo(pc);
}
@@ -73,14 +64,9 @@ void Subscription::unsubscribe(ProjectConfiguration *pc)
{
disconnectFrom(pc);
- if (auto p = qobject_cast<Project *>(pc)) {
- for (Target *t : p->targets()) {
- for (ProjectConfiguration *pc : t->projectConfigurations())
- unsubscribe(pc);
- }
- } else if (auto t = qobject_cast<Target *>(pc)) {
+ if (auto t = qobject_cast<Target *>(pc)) {
for (ProjectConfiguration *pc : t->projectConfigurations())
- unsubscribe(pc);
+ disconnectFrom(pc);
}
}
@@ -93,6 +79,9 @@ void Subscription::unsubscribeAll()
void Subscription::connectTo(ProjectConfiguration *pc)
{
+ if (!m_subscriber)
+ return; // May happen during shutdown of a subscription
+
QTC_ASSERT(!m_connections.contains(pc), return);
QMetaObject::Connection conn = m_subscriber(pc);
@@ -110,18 +99,27 @@ void Subscription::disconnectFrom(ProjectConfiguration *pc)
m_connections.remove(pc);
}
+void Subscription::destroy()
+{
+ unsubscribeAll();
+ m_subscriber = Connector(); // Reset subscriber
+ deleteLater();
+}
+
ProjectSubscription::ProjectSubscription(const Subscription::Connector &s, const QObject *r,
Project *p) :
Subscription(s, r, p)
{
- if (m_subscriber) {
- for (const Target *t : p->targets()) {
- for (ProjectConfiguration *pc : t->projectConfigurations())
- m_subscriber(pc);
- }
- connect(p, &Project::addedProjectConfiguration, this, &ProjectSubscription::subscribe);
- connect(p, &Project::removedProjectConfiguration, this, &ProjectSubscription::unsubscribe);
- }
+ QTC_ASSERT(m_subscriber, return);
+
+ for (Target *t : p->targets())
+ subscribe(t);
+
+ // Disconnect on removal of a project, to make it save to remove/add a project:
+ connect(SessionManager::instance(), &SessionManager::projectRemoved,
+ this, [this, p](Project *reported) { if (p == reported) { destroy(); } });
+ connect(p, &Project::addedProjectConfiguration, this, &ProjectSubscription::subscribe);
+ connect(p, &Project::removedProjectConfiguration, this, &ProjectSubscription::unsubscribe);
}
ProjectSubscription::~ProjectSubscription() = default;
@@ -130,8 +128,13 @@ TargetSubscription::TargetSubscription(const Subscription::Connector &s, const Q
Target *t) :
Subscription(s, r, t)
{
- for (ProjectConfiguration *pc : t->projectConfigurations())
- m_subscriber(pc);
+ QTC_ASSERT(m_subscriber, return);
+
+ subscribe(t);
+
+ // Disconnect on removal of a target, to make it save to remove/add a target:
+ connect(t->project(), &Project::removedTarget, this,
+ [t, this](const Target *reportedTarget) { if (t == reportedTarget) { destroy(); } });
connect(t, &Target::addedProjectConfiguration, this, &TargetSubscription::subscribe);
connect(t, &Target::removedProjectConfiguration, this, &TargetSubscription::unsubscribe);
}