diff options
| author | Tobias Hunger <tobias.hunger@qt.io> | 2016-11-02 12:10:18 +0100 |
|---|---|---|
| committer | Tobias Hunger <tobias.hunger@qt.io> | 2016-11-09 10:15:05 +0000 |
| commit | 0f1f595a12fad0d88633677a79c1fe4ac2cd68be (patch) | |
| tree | 34ff0d8fdc3e4f7e44d1446da09446b77318c8ec | |
| parent | 4ed00a348b55bb64332315ebdca2c7c8ec198a7c (diff) | |
| download | qt-creator-0f1f595a12fad0d88633677a79c1fe4ac2cd68be.tar.gz | |
QmakeProjectManager: Improve signalling of parser state
Correctly signal when parsing of a qmake project starts and stops via
the build- and runconfigurations.
The buildconfigurations are in the picture since they disable the run buttons
when the user has selected to build before deploy and deploy before run.
Task-number: QTCREATORBUG-16172
Task-number: QTCREATORBUG-15583
Change-Id: I44b5f5ce8e145cb93dc0022f66e1edcc202875e4
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
7 files changed, 54 insertions, 32 deletions
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 6c9d6ab557..fb4f32c01d 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<BuildConfiguration> 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 ed3dfec658..3c6e6bd828 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 2f534ca888..120a375806 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 27c7c9866b..8c22a0139e 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 7dd1956d17..3df8d04f5a 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 4a06be86ad..8be3ff5c5a 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<QmakeBuildConfiguration *>(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<QmakeBuildConfiguration *>(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 9a2ecb8aad..c109dd8e2c 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(); |
