From 3d863b211a74daa23d555dd8da6956748d371d97 Mon Sep 17 00:00:00 2001 From: dt <qtc-committer@nokia.com> Date: Tue, 7 Apr 2009 13:52:28 +0200 Subject: [PATCH] Show progress for building cmake projects. Parse percent output of cmake, report via QtConcurrent and modify the BuildManager to also report the progress to the ProgressManager. --- src/plugins/cmakeprojectmanager/makestep.cpp | 10 +++++++ src/plugins/cmakeprojectmanager/makestep.h | 2 ++ src/plugins/projectexplorer/buildmanager.cpp | 31 +++++++++++++++----- src/plugins/projectexplorer/buildmanager.h | 1 + 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/makestep.cpp b/src/plugins/cmakeprojectmanager/makestep.cpp index 8417e842af8..83e433c0ca6 100644 --- a/src/plugins/cmakeprojectmanager/makestep.cpp +++ b/src/plugins/cmakeprojectmanager/makestep.cpp @@ -50,6 +50,7 @@ using namespace CMakeProjectManager::Internal; MakeStep::MakeStep(CMakeProject *pro) : AbstractProcessStep(pro), m_pro(pro), m_buildParser(0) { + m_percentProgress = QRegExp("^\\[\\s*(\\d*)%\\]"); } MakeStep::~MakeStep() @@ -107,7 +108,10 @@ bool MakeStep::init(const QString &buildConfiguration) void MakeStep::run(QFutureInterface<bool> &fi) { + m_futureInterface = &fi; + m_futureInterface->setProgressRange(0, 100); AbstractProcessStep::run(fi); + m_futureInterface = 0; } QString MakeStep::name() @@ -134,6 +138,12 @@ void MakeStep::stdOut(const QString &line) { if (m_buildParser) m_buildParser->stdOutput(line); + if (m_percentProgress.indexIn(line) != -1) { + bool ok = false; + int percent = m_percentProgress.cap(1).toInt(&ok);; + if (ok) + m_futureInterface->setProgressValue(percent); + } AbstractProcessStep::stdOut(line); } diff --git a/src/plugins/cmakeprojectmanager/makestep.h b/src/plugins/cmakeprojectmanager/makestep.h index 8df65e8bd0b..f43977820ae 100644 --- a/src/plugins/cmakeprojectmanager/makestep.h +++ b/src/plugins/cmakeprojectmanager/makestep.h @@ -73,6 +73,8 @@ private: CMakeProject *m_pro; ProjectExplorer::BuildParserInterface *m_buildParser; QSet<QString> m_openDirectories; + QRegExp m_percentProgress; + QFutureInterface<bool> *m_futureInterface; }; class MakeStepConfigWidget :public ProjectExplorer::BuildStepConfigWidget diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp index e527b5cde55..285214728c0 100644 --- a/src/plugins/projectexplorer/buildmanager.cpp +++ b/src/plugins/projectexplorer/buildmanager.cpp @@ -65,6 +65,11 @@ BuildManager::BuildManager(ProjectExplorerPlugin *parent) connect(&m_watcher, SIGNAL(finished()), this, SLOT(nextBuildQueue())); + connect(&m_watcher, SIGNAL(progressValueChanged(int)), + this, SLOT(progressChanged())); + connect(&m_watcher, SIGNAL(progressRangeChanged(int, int)), + this, SLOT(progressChanged())); + m_outputWindow = new CompileOutputWindow(this); pm->addObject(m_outputWindow); @@ -115,7 +120,7 @@ void BuildManager::cancel() this, SLOT(addToOutputWindow(QString))); decrementActiveBuildSteps(m_currentBuildStep->project()); - m_progressFutureInterface->setProgressValueAndText(m_progress, "Build canceled"); //TODO NBS fix in qtconcurrent + m_progressFutureInterface->setProgressValueAndText(m_progress*100, "Build canceled"); //TODO NBS fix in qtconcurrent clearBuildQueue(); } return; @@ -184,7 +189,7 @@ void BuildManager::startBuildQueue() connect(progress, SIGNAL(clicked()), this, SLOT(showBuildResults())); progress->setWidget(new BuildProgress(m_taskWindow)); m_progress = 0; - m_progressFutureInterface->setProgressRange(0, m_maxProgress); + m_progressFutureInterface->setProgressRange(0, m_maxProgress * 100); m_running = true; m_canceling = false; @@ -194,9 +199,9 @@ void BuildManager::startBuildQueue() nextStep(); } else { // Already running - m_progressFutureInterface->setProgressRange(0, m_maxProgress); + m_progressFutureInterface->setProgressRange(0, m_maxProgress * 100); const QString &progressText = tr("Finished %1 of %2 build steps").arg(m_progress).arg(m_maxProgress); - m_progressFutureInterface->setProgressValueAndText(m_progress, progressText); + m_progressFutureInterface->setProgressValueAndText(m_progress*100, progressText); } } @@ -231,7 +236,7 @@ void BuildManager::nextBuildQueue() ++m_progress; const QString &progressText = tr("Finished %1 of %2 build steps").arg(m_progress).arg(m_maxProgress); - m_progressFutureInterface->setProgressValueAndText(m_progress, progressText); + m_progressFutureInterface->setProgressValueAndText(m_progress*100, progressText); bool result = m_watcher.result(); if (!result) { @@ -239,7 +244,7 @@ void BuildManager::nextBuildQueue() addToOutputWindow(tr("<font color=\"#ff0000\">Error while building project %1</font>").arg(m_currentBuildStep->project()->name())); addToOutputWindow(tr("<font color=\"#ff0000\">When executing build step '%1'</font>").arg(m_currentBuildStep->displayName())); // NBS TODO fix in qtconcurrent - m_progressFutureInterface->setProgressValueAndText(m_progress, tr("Error while building project %1").arg(m_currentBuildStep->project()->name())); + m_progressFutureInterface->setProgressValueAndText(m_progress*100, tr("Error while building project %1").arg(m_currentBuildStep->project()->name())); } decrementActiveBuildSteps(m_currentBuildStep->project()); @@ -249,6 +254,17 @@ void BuildManager::nextBuildQueue() clearBuildQueue(); } +void BuildManager::progressChanged() +{ + if (!m_progressFutureInterface) + return; + int range = m_watcher.progressMaximum() - m_watcher.progressMinimum(); + if (range != 0) { + int percent = (m_watcher.progressValue() - m_watcher.progressMinimum()) * 100 / range; + m_progressFutureInterface->setProgressValue(m_progress * 100 + percent); + } +} + void BuildManager::nextStep() { if (!m_buildQueue.empty()) { @@ -279,8 +295,9 @@ void BuildManager::nextStep() m_watcher.setFuture(QtConcurrent::run(&BuildStep::run, m_currentBuildStep)); } else { m_running = false; - m_previousBuildStepProject = 0; + m_previousBuildStepProject = 0; m_progressFutureInterface->reportFinished(); + m_progressWatcher.setFuture(QFuture<void>()); delete m_progressFutureInterface; m_progressFutureInterface = 0; m_maxProgress = 0; diff --git a/src/plugins/projectexplorer/buildmanager.h b/src/plugins/projectexplorer/buildmanager.h index 6a57046164a..51292694338 100644 --- a/src/plugins/projectexplorer/buildmanager.h +++ b/src/plugins/projectexplorer/buildmanager.h @@ -97,6 +97,7 @@ private slots: void addToOutputWindow(const QString &string); void nextBuildQueue(); + void progressChanged(); void emitCancelMessage(); void showBuildResults(); -- GitLab