diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 0d1837596e8c41dac8028521ef50cb32059f0189..77112737a5719003f769d6720bab8c99f2c03d07 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -1789,37 +1789,62 @@ void ProjectExplorerPlugin::startupProjectChanged() d->m_projectsMode->setEnabled(project); if (previousStartupProject) { - disconnect(previousStartupProject->activeTarget(), SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), - this, SLOT(updateRunActions())); - disconnect(previousStartupProject, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)), - this, SLOT(updateDeployActions())); - disconnect(previousStartupProject->activeTarget()->activeRunConfiguration(), - SIGNAL(isEnabledChanged(bool)), this, SLOT(updateRunActions())); - - foreach (Target *t, previousStartupProject->targets()) - disconnect(t, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), - this, SLOT(updateActions())); + this, SLOT(activeTargetChanged())); } previousStartupProject = project; if (project) { connect(project, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)), - this, SLOT(updateDeployActions())); + this, SLOT(activeTargetChanged())); + } - connect(project->activeTarget(), SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), - this, SLOT(updateRunActions())); + activeTargetChanged(); - if (project->activeTarget()->activeRunConfiguration()) { - connect(project->activeTarget()->activeRunConfiguration(), SIGNAL(isEnabledChanged(bool)), - this, SLOT(updateRunActions())); - foreach (Target *t, project->targets()) - connect(t, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), - this, SLOT(updateActions())); - } + updateRunActions(); +} + +void ProjectExplorerPlugin::activeTargetChanged() +{ + static QPointer<Target> previousTarget = 0; + Target *target = 0; + if (startupProject()) + target = startupProject()->activeTarget(); + if (target == previousTarget) + return; + + if (previousTarget) { + disconnect(previousTarget, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), + this, SLOT(activeRunConfigurationChanged())); + } + previousTarget = target; + if (target) { + connect(target, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), + this, SLOT(activeRunConfigurationChanged())); } + updateDeployActions(); + activeRunConfigurationChanged(); +} + +void ProjectExplorerPlugin::activeRunConfigurationChanged() +{ + static QPointer<RunConfiguration> previousRunConfiguration = 0; + RunConfiguration *rc = 0; + if (startupProject() && startupProject()->activeTarget()) + rc = startupProject()->activeTarget()->activeRunConfiguration(); + if (rc == previousRunConfiguration) + return; + if (previousRunConfiguration) { + disconnect(previousRunConfiguration, SIGNAL(isEnabledChanged(bool)), + this, SLOT(updateRunActions())); + } + previousRunConfiguration = rc; + if (rc) { + connect(rc, SIGNAL(isEnabledChanged(bool)), + this, SLOT(updateRunActions())); + } updateRunActions(); } diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index 1a76e2cf43421e2793dbb8745d32a84a812dbdf1..292735c9f15fc336cca31f260fcf4ec20c2464e2 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -190,6 +190,9 @@ private slots: void runControlFinished(); void startupProjectChanged(); // Calls updateRunAction + void activeTargetChanged(); + void activeRunConfigurationChanged(); + void updateDeployActions(); void updateRunActions();