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>
This commit is contained in:
Tobias Hunger
2016-11-02 12:10:18 +01:00
parent 4ed00a348b
commit 0f1f595a12
7 changed files with 54 additions and 32 deletions

View File

@@ -267,6 +267,7 @@ public:
void startupProjectChanged(); // Calls updateRunAction void startupProjectChanged(); // Calls updateRunAction
void activeTargetChanged(); void activeTargetChanged();
void activeRunConfigurationChanged(); void activeRunConfigurationChanged();
void activeBuildConfigurationChanged();
void slotUpdateRunActions(); void slotUpdateRunActions();
@@ -2617,13 +2618,18 @@ void ProjectExplorerPluginPrivate::activeTargetChanged()
if (previousTarget) { if (previousTarget) {
disconnect(previousTarget.data(), &Target::activeRunConfigurationChanged, disconnect(previousTarget.data(), &Target::activeRunConfigurationChanged,
this, &ProjectExplorerPluginPrivate::activeRunConfigurationChanged); this, &ProjectExplorerPluginPrivate::activeRunConfigurationChanged);
disconnect(previousTarget.data(), &Target::activeBuildConfigurationChanged,
this, &ProjectExplorerPluginPrivate::activeBuildConfigurationChanged);
} }
previousTarget = target; previousTarget = target;
if (target) { if (target) {
connect(target, &Target::activeRunConfigurationChanged, connect(target, &Target::activeRunConfigurationChanged,
this, &ProjectExplorerPluginPrivate::activeRunConfigurationChanged); this, &ProjectExplorerPluginPrivate::activeRunConfigurationChanged);
connect(previousTarget.data(), &Target::activeBuildConfigurationChanged,
this, &ProjectExplorerPluginPrivate::activeBuildConfigurationChanged);
} }
activeBuildConfigurationChanged();
activeRunConfigurationChanged(); activeRunConfigurationChanged();
updateDeployActions(); updateDeployActions();
} }
@@ -2649,6 +2655,27 @@ void ProjectExplorerPluginPrivate::activeRunConfigurationChanged()
emit m_instance->updateRunActions(); 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() void ProjectExplorerPluginPrivate::updateDeployActions()
{ {
Project *project = SessionManager::startupProject(); Project *project = SessionManager::startupProject();

View File

@@ -125,8 +125,8 @@ void DesktopQmakeRunConfiguration::proFileUpdated(QmakeProFileNode *pro, bool su
{ {
if (m_proFilePath != pro->filePath()) if (m_proFilePath != pro->filePath())
return; return;
bool enabled = isEnabled(); const bool enabled = isEnabled();
QString reason = disabledReason(); const QString reason = disabledReason();
m_parseSuccess = success; m_parseSuccess = success;
m_parseInProgress = parseInProgress; m_parseInProgress = parseInProgress;
if (enabled != isEnabled() || reason != disabledReason()) if (enabled != isEnabled() || reason != disabledReason())

View File

@@ -137,7 +137,7 @@ private:
LastKitState m_lastKitState; LastKitState m_lastKitState;
bool m_shadowBuild = true; bool m_shadowBuild = true;
bool m_isEnabled = false; bool m_isEnabled = true;
QtSupport::BaseQtVersion::QmakeBuildConfigs m_qmakeBuildConfiguration = 0; QtSupport::BaseQtVersion::QmakeBuildConfigs m_qmakeBuildConfiguration = 0;
QmakeProjectManager::QmakeProFileNode *m_subNodeBuild = nullptr; QmakeProjectManager::QmakeProFileNode *m_subNodeBuild = nullptr;
ProjectExplorer::FileNode *m_fileNodeBuild = nullptr; ProjectExplorer::FileNode *m_fileNodeBuild = nullptr;

View File

@@ -1322,8 +1322,6 @@ void QmakePriFileNode::save(const QStringList &lines)
FileSaver saver(m_projectFilePath.toString(), QIODevice::Text); FileSaver saver(m_projectFilePath.toString(), QIODevice::Text);
saver.write(lines.join(QLatin1Char('\n')).toLocal8Bit()); saver.write(lines.join(QLatin1Char('\n')).toLocal8Bit());
saver.finalize(Core::ICore::mainWindow()); saver.finalize(Core::ICore::mainWindow());
m_project->projectManager()->notifyChanged(m_projectFilePath);
} }
// This is a hack. // This is a hack.

View File

@@ -400,7 +400,7 @@ private:
static InstallsList installsList(const QtSupport::ProFileReader *reader, const QString &projectFilePath, const QString &projectDir, const QString &buildDir); static InstallsList installsList(const QtSupport::ProFileReader *reader, const QString &projectFilePath, const QString &projectDir, const QString &buildDir);
bool m_validParse = false; bool m_validParse = false;
bool m_parseInProgress = true; bool m_parseInProgress = false;
QmakeProjectType m_projectType = InvalidProject; QmakeProjectType m_projectType = InvalidProject;
QmakeVariablesHash m_varValues; QmakeVariablesHash m_varValues;

View File

@@ -71,25 +71,6 @@ using namespace Utils;
enum { debug = 0 }; 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 QmakeProjectManager {
namespace Internal { namespace Internal {
@@ -603,7 +584,8 @@ void QmakeProject::scheduleAsyncUpdate(QmakeProFileNode *node, QmakeProFileNode:
return; return;
} }
enableActiveQmakeBuildConfiguration(activeTarget(), false); node->setParseInProgressRecursive(true);
setAllBuildConfigurationsEnabled(false);
if (m_asyncUpdateState == AsyncFullUpdatePending) { if (m_asyncUpdateState == AsyncFullUpdatePending) {
// Just postpone // Just postpone
@@ -643,7 +625,6 @@ void QmakeProject::scheduleAsyncUpdate(QmakeProFileNode *node, QmakeProFileNode:
m_codeModelFuture.cancel(); m_codeModelFuture.cancel();
startAsyncTimer(delay); startAsyncTimer(delay);
} else if (m_asyncUpdateState == AsyncUpdateInProgress) { } else if (m_asyncUpdateState == AsyncUpdateInProgress) {
// A update is in progress // A update is in progress
// And this slot only gets called if a file changed on disc // 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"; qDebug()<<" canceling is in progress, doing nothing";
return; return;
} }
rootProjectNode()->setParseInProgressRecursive(true);
setAllBuildConfigurationsEnabled(false);
if (m_asyncUpdateState == AsyncUpdateInProgress) { if (m_asyncUpdateState == AsyncUpdateInProgress) {
if (debug) if (debug)
qDebug()<<" update in progress, canceling and setting state to full update pending"; qDebug()<<" update in progress, canceling and setting state to full update pending";
m_cancelEvaluate = true; m_cancelEvaluate = true;
m_asyncUpdateState = AsyncFullUpdatePending; m_asyncUpdateState = AsyncFullUpdatePending;
enableActiveQmakeBuildConfiguration(activeTarget(), false);
rootProjectNode()->setParseInProgressRecursive(true);
return; return;
} }
if (debug) if (debug)
qDebug()<<" starting timer for full update, setting state to full update pending"; qDebug()<<" starting timer for full update, setting state to full update pending";
m_partialEvaluate.clear(); m_partialEvaluate.clear();
enableActiveQmakeBuildConfiguration(activeTarget(), false);
rootProjectNode()->setParseInProgressRecursive(true);
m_asyncUpdateState = AsyncFullUpdatePending; m_asyncUpdateState = AsyncFullUpdatePending;
// Cancel running code model update // Cancel running code model update
@@ -734,11 +715,14 @@ void QmakeProject::decrementPendingEvaluateFutures()
if (m_asyncUpdateState == AsyncFullUpdatePending || m_asyncUpdateState == AsyncPartialUpdatePending) { if (m_asyncUpdateState == AsyncFullUpdatePending || m_asyncUpdateState == AsyncPartialUpdatePending) {
if (debug) if (debug)
qDebug()<<" Oh update is pending start the timer"; qDebug()<<" Oh update is pending start the timer";
rootProjectNode()->setParseInProgressRecursive(true);
setAllBuildConfigurationsEnabled(false);
startAsyncTimer(QmakeProFileNode::ParseLater); startAsyncTimer(QmakeProFileNode::ParseLater);
} else if (m_asyncUpdateState != ShuttingDown){ } else if (m_asyncUpdateState != ShuttingDown){
// After being done, we need to call: // After being done, we need to call:
setAllBuildConfigurationsEnabled(true);
m_asyncUpdateState = Base; m_asyncUpdateState = Base;
enableActiveQmakeBuildConfiguration(activeTarget(), true);
updateFileList(); updateFileList();
updateCodeModels(); updateCodeModels();
updateBuildSystemData(); updateBuildSystemData();
@@ -1071,6 +1055,17 @@ void QmakeProject::activeTargetWasChanged()
scheduleAsyncUpdate(); 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) bool QmakeProject::hasSubNode(QmakePriFileNode *root, const FileName &path)
{ {
if (root->filePath() == path) if (root->filePath() == path)

View File

@@ -153,6 +153,8 @@ private:
void buildFinished(bool success); void buildFinished(bool success);
void activeTargetWasChanged(); void activeTargetWasChanged();
void setAllBuildConfigurationsEnabled(bool enabled);
QString executableFor(const QmakeProFileNode *node); QString executableFor(const QmakeProFileNode *node);
void updateRunConfigurations(); void updateRunConfigurations();