From 551114de27bc86e9ee708020e49363833a7d598f Mon Sep 17 00:00:00 2001 From: dt Date: Tue, 13 Apr 2010 15:04:21 +0200 Subject: [PATCH] Prevent removing buildsteps if the buildsteps are queued for building. Task-Nr: QTCREATORBUG-1044 --- .../projectexplorer/buildconfiguration.cpp | 11 +++++++- .../projectexplorer/buildconfiguration.h | 2 +- src/plugins/projectexplorer/buildmanager.cpp | 5 ++++ src/plugins/projectexplorer/buildmanager.h | 1 + .../projectexplorer/buildstepspage.cpp | 25 +++++++++++++------ 5 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index 62ff6475235..167a452d930 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -32,6 +32,8 @@ #include #include #include +#include +#include #include @@ -187,11 +189,18 @@ void BuildConfiguration::insertStep(StepType type, int position, BuildStep *step m_steps[type].insert(position, step); } -void BuildConfiguration::removeStep(StepType type, int position) +bool BuildConfiguration::removeStep(StepType type, int position) { Q_ASSERT(type >= 0 && type < LastStepType); + + ProjectExplorer::BuildManager *bm = + ProjectExplorer::ProjectExplorerPlugin::instance()->buildManager(); + if (bm->isBuilding(m_steps[type].at(position))) + return false; + delete m_steps[type].at(position); m_steps[type].removeAt(position); + return true; } void BuildConfiguration::moveStepUp(StepType type, int position) diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h index c0bc765771c..65a0064418a 100644 --- a/src/plugins/projectexplorer/buildconfiguration.h +++ b/src/plugins/projectexplorer/buildconfiguration.h @@ -55,7 +55,7 @@ public: QList steps(StepType type) const; void insertStep(StepType type, int position, BuildStep *step); - void removeStep(StepType type, int position); + bool removeStep(StepType type, int position); void moveStepUp(StepType type, int position); virtual QString buildDirectory() const = 0; diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp index 6b0301243e5..26aa6313236 100644 --- a/src/plugins/projectexplorer/buildmanager.cpp +++ b/src/plugins/projectexplorer/buildmanager.cpp @@ -465,6 +465,11 @@ bool BuildManager::isBuilding(Project *pro) return true; } +bool BuildManager::isBuilding(BuildStep *step) +{ + return (m_currentBuildStep == step) || m_buildQueue.contains(step); +} + void BuildManager::incrementActiveBuildSteps(Project *pro) { QHash::iterator it = m_activeBuildSteps.find(pro); diff --git a/src/plugins/projectexplorer/buildmanager.h b/src/plugins/projectexplorer/buildmanager.h index 3a77e5f6cf1..dda5c10c313 100644 --- a/src/plugins/projectexplorer/buildmanager.h +++ b/src/plugins/projectexplorer/buildmanager.h @@ -75,6 +75,7 @@ public: void cleanProject(BuildConfiguration *configuration); void cleanProjects(const QList &configurations); bool isBuilding(Project *p); + bool isBuilding(BuildStep *step); // Append any build step to the list of build steps (currently only used to add the QMakeStep) void appendStep(BuildStep *step); diff --git a/src/plugins/projectexplorer/buildstepspage.cpp b/src/plugins/projectexplorer/buildstepspage.cpp index 02dc875ee80..21d00e303c6 100644 --- a/src/plugins/projectexplorer/buildstepspage.cpp +++ b/src/plugins/projectexplorer/buildstepspage.cpp @@ -31,6 +31,7 @@ #include "buildconfiguration.h" #include +#include #include #include @@ -42,6 +43,8 @@ #include #include #include +#include +#include using namespace ProjectExplorer; using namespace ProjectExplorer::Internal; @@ -241,16 +244,22 @@ void BuildStepsPage::stepMoveDown(int pos) void BuildStepsPage::stepRemove(int pos) { - BuildStepsWidgetStruct s = m_buildSteps.at(pos); - delete s.widget; - delete s.detailsWidget; - m_buildSteps.removeAt(pos); - m_configuration->removeStep(m_type, pos); + if (m_configuration->removeStep(m_type, pos)) { + BuildStepsWidgetStruct s = m_buildSteps.at(pos); + delete s.widget; + delete s.detailsWidget; + m_buildSteps.removeAt(pos); - updateBuildStepButtonsState(); + updateBuildStepButtonsState(); - bool hasSteps = m_configuration->steps(m_type).isEmpty(); - m_noStepsLabel->setVisible(hasSteps); + bool hasSteps = m_configuration->steps(m_type).isEmpty(); + m_noStepsLabel->setVisible(hasSteps); + } else { + QMessageBox::warning(Core::ICore::instance()->mainWindow(), + tr("Removing Step failed"), + tr("Can't remove build step while building"), + QMessageBox::Ok, QMessageBox::Ok); + } } void BuildStepsPage::setupUi()