diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 6c9d6ab557e..fb4f32c01d2 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -267,6 +267,7 @@ public: void startupProjectChanged(); // Calls updateRunAction void activeTargetChanged(); void activeRunConfigurationChanged(); + void activeBuildConfigurationChanged(); void slotUpdateRunActions(); @@ -2617,13 +2618,18 @@ void ProjectExplorerPluginPrivate::activeTargetChanged() if (previousTarget) { disconnect(previousTarget.data(), &Target::activeRunConfigurationChanged, this, &ProjectExplorerPluginPrivate::activeRunConfigurationChanged); + disconnect(previousTarget.data(), &Target::activeBuildConfigurationChanged, + this, &ProjectExplorerPluginPrivate::activeBuildConfigurationChanged); } previousTarget = target; if (target) { connect(target, &Target::activeRunConfigurationChanged, this, &ProjectExplorerPluginPrivate::activeRunConfigurationChanged); + connect(previousTarget.data(), &Target::activeBuildConfigurationChanged, + this, &ProjectExplorerPluginPrivate::activeBuildConfigurationChanged); } + activeBuildConfigurationChanged(); activeRunConfigurationChanged(); updateDeployActions(); } @@ -2649,6 +2655,27 @@ void ProjectExplorerPluginPrivate::activeRunConfigurationChanged() emit m_instance->updateRunActions(); } +void ProjectExplorerPluginPrivate::activeBuildConfigurationChanged() +{ + static QPointer previousBuildConfiguration = nullptr; + BuildConfiguration *bc = nullptr; + Project *startupProject = SessionManager::startupProject(); + if (startupProject && startupProject->activeTarget()) + bc = startupProject->activeTarget()->activeBuildConfiguration(); + if (bc == previousBuildConfiguration) + return; + if (previousBuildConfiguration) { + disconnect(previousBuildConfiguration.data(), &BuildConfiguration::enabledChanged, + m_instance, &ProjectExplorerPlugin::updateRunActions); + } + previousBuildConfiguration = bc; + if (bc) { + connect(bc, &BuildConfiguration::enabledChanged, + m_instance, &ProjectExplorerPlugin::updateRunActions); + } + emit m_instance->updateRunActions(); +} + void ProjectExplorerPluginPrivate::updateDeployActions() { Project *project = SessionManager::startupProject(); diff --git a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp index ed3dfec6589..3c6e6bd828b 100644 --- a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp @@ -125,8 +125,8 @@ void DesktopQmakeRunConfiguration::proFileUpdated(QmakeProFileNode *pro, bool su { if (m_proFilePath != pro->filePath()) return; - bool enabled = isEnabled(); - QString reason = disabledReason(); + const bool enabled = isEnabled(); + const QString reason = disabledReason(); m_parseSuccess = success; m_parseInProgress = parseInProgress; if (enabled != isEnabled() || reason != disabledReason()) diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h index 2f534ca8887..120a375806d 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h +++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h @@ -137,7 +137,7 @@ private: LastKitState m_lastKitState; bool m_shadowBuild = true; - bool m_isEnabled = false; + bool m_isEnabled = true; QtSupport::BaseQtVersion::QmakeBuildConfigs m_qmakeBuildConfiguration = 0; QmakeProjectManager::QmakeProFileNode *m_subNodeBuild = nullptr; ProjectExplorer::FileNode *m_fileNodeBuild = nullptr; diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index 27c7c9866b9..8c22a0139ec 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -1322,8 +1322,6 @@ void QmakePriFileNode::save(const QStringList &lines) FileSaver saver(m_projectFilePath.toString(), QIODevice::Text); saver.write(lines.join(QLatin1Char('\n')).toLocal8Bit()); saver.finalize(Core::ICore::mainWindow()); - - m_project->projectManager()->notifyChanged(m_projectFilePath); } // This is a hack. diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.h b/src/plugins/qmakeprojectmanager/qmakenodes.h index 7dd1956d172..3df8d04f5a2 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.h +++ b/src/plugins/qmakeprojectmanager/qmakenodes.h @@ -400,7 +400,7 @@ private: static InstallsList installsList(const QtSupport::ProFileReader *reader, const QString &projectFilePath, const QString &projectDir, const QString &buildDir); bool m_validParse = false; - bool m_parseInProgress = true; + bool m_parseInProgress = false; QmakeProjectType m_projectType = InvalidProject; QmakeVariablesHash m_varValues; diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index 4a06be86ade..8be3ff5c5a9 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -71,25 +71,6 @@ using namespace Utils; enum { debug = 0 }; -// ----------------------------------------------------------------------- -// Helpers: -// ----------------------------------------------------------------------- - -namespace { - -QmakeBuildConfiguration *enableActiveQmakeBuildConfiguration(Target *t, bool enabled) -{ - if (!t) - return 0; - QmakeBuildConfiguration *bc = static_cast(t->activeBuildConfiguration()); - if (!bc) - return 0; - bc->setEnabled(enabled); - return bc; -} - -} // namespace - namespace QmakeProjectManager { namespace Internal { @@ -603,7 +584,8 @@ void QmakeProject::scheduleAsyncUpdate(QmakeProFileNode *node, QmakeProFileNode: return; } - enableActiveQmakeBuildConfiguration(activeTarget(), false); + node->setParseInProgressRecursive(true); + setAllBuildConfigurationsEnabled(false); if (m_asyncUpdateState == AsyncFullUpdatePending) { // Just postpone @@ -643,7 +625,6 @@ void QmakeProject::scheduleAsyncUpdate(QmakeProFileNode *node, QmakeProFileNode: m_codeModelFuture.cancel(); startAsyncTimer(delay); - } else if (m_asyncUpdateState == AsyncUpdateInProgress) { // A update is in progress // And this slot only gets called if a file changed on disc @@ -671,21 +652,21 @@ void QmakeProject::scheduleAsyncUpdate(QmakeProFileNode::AsyncUpdateDelay delay) qDebug()<<" canceling is in progress, doing nothing"; return; } + + rootProjectNode()->setParseInProgressRecursive(true); + setAllBuildConfigurationsEnabled(false); + if (m_asyncUpdateState == AsyncUpdateInProgress) { if (debug) qDebug()<<" update in progress, canceling and setting state to full update pending"; m_cancelEvaluate = true; m_asyncUpdateState = AsyncFullUpdatePending; - enableActiveQmakeBuildConfiguration(activeTarget(), false); - rootProjectNode()->setParseInProgressRecursive(true); return; } if (debug) qDebug()<<" starting timer for full update, setting state to full update pending"; m_partialEvaluate.clear(); - enableActiveQmakeBuildConfiguration(activeTarget(), false); - rootProjectNode()->setParseInProgressRecursive(true); m_asyncUpdateState = AsyncFullUpdatePending; // Cancel running code model update @@ -734,11 +715,14 @@ void QmakeProject::decrementPendingEvaluateFutures() if (m_asyncUpdateState == AsyncFullUpdatePending || m_asyncUpdateState == AsyncPartialUpdatePending) { if (debug) qDebug()<<" Oh update is pending start the timer"; + rootProjectNode()->setParseInProgressRecursive(true); + setAllBuildConfigurationsEnabled(false); startAsyncTimer(QmakeProFileNode::ParseLater); } else if (m_asyncUpdateState != ShuttingDown){ // After being done, we need to call: + setAllBuildConfigurationsEnabled(true); + m_asyncUpdateState = Base; - enableActiveQmakeBuildConfiguration(activeTarget(), true); updateFileList(); updateCodeModels(); updateBuildSystemData(); @@ -1071,6 +1055,17 @@ void QmakeProject::activeTargetWasChanged() scheduleAsyncUpdate(); } +void QmakeProject::setAllBuildConfigurationsEnabled(bool enabled) +{ + foreach (Target *t, targets()) { + foreach (BuildConfiguration *bc, t->buildConfigurations()) { + auto qmakeBc = qobject_cast(bc); + if (qmakeBc) + qmakeBc->setEnabled(enabled); + } + } +} + bool QmakeProject::hasSubNode(QmakePriFileNode *root, const FileName &path) { if (root->filePath() == path) diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.h b/src/plugins/qmakeprojectmanager/qmakeproject.h index 9a2ecb8aad3..c109dd8e2c3 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.h +++ b/src/plugins/qmakeprojectmanager/qmakeproject.h @@ -153,6 +153,8 @@ private: void buildFinished(bool success); void activeTargetWasChanged(); + void setAllBuildConfigurationsEnabled(bool enabled); + QString executableFor(const QmakeProFileNode *node); void updateRunConfigurations();