summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Hunger <tobias.hunger@qt.io>2016-11-02 12:10:18 +0100
committerTobias Hunger <tobias.hunger@qt.io>2016-11-09 10:15:05 +0000
commit0f1f595a12fad0d88633677a79c1fe4ac2cd68be (patch)
tree34ff0d8fdc3e4f7e44d1446da09446b77318c8ec
parent4ed00a348b55bb64332315ebdca2c7c8ec198a7c (diff)
downloadqt-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>
-rw-r--r--src/plugins/projectexplorer/projectexplorer.cpp27
-rw-r--r--src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp4
-rw-r--r--src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h2
-rw-r--r--src/plugins/qmakeprojectmanager/qmakenodes.cpp2
-rw-r--r--src/plugins/qmakeprojectmanager/qmakenodes.h2
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeproject.cpp47
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeproject.h2
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();