diff options
| author | Christian Kandeler <christian.kandeler@digia.com> | 2013-03-26 15:28:25 +0100 |
|---|---|---|
| committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-03-28 16:52:50 +0100 |
| commit | 02502cc90ecfb38d519b6b0a3e105fc7a5815a00 (patch) | |
| tree | 9baf485695593f1922b0f6d3ddadb7a707dba50d | |
| parent | 3db01b23d59e80ee8bd399c8673cedad12e8f141 (diff) | |
| download | qbs-02502cc90ecfb38d519b6b0a3e105fc7a5815a00.tar.gz | |
Show more fine-grained progress information for project loading.
Since we have no sensible heuristic before at least some parsing has
been done, we delay setting the actual total effort until we can make an
educated guess. While this leads to the progress bar staying at 0% for a
little too long, at least the user gets the information about what is
happening right away. Note that this improvment is independent of
whether or not progress information was actually requested.
Change-Id: I0d4b454e99eb02c66c3c7a1fddddc6650be0ece4
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
| -rw-r--r-- | src/app/qbs/commandlinefrontend.cpp | 9 | ||||
| -rw-r--r-- | src/app/qbs/commandlinefrontend.h | 1 | ||||
| -rw-r--r-- | src/app/qbs/consoleprogressobserver.cpp | 8 | ||||
| -rw-r--r-- | src/app/qbs/consoleprogressobserver.h | 1 | ||||
| -rw-r--r-- | src/lib/api/internaljobs.cpp | 14 | ||||
| -rw-r--r-- | src/lib/api/internaljobs.h | 1 | ||||
| -rw-r--r-- | src/lib/api/jobs.cpp | 7 | ||||
| -rw-r--r-- | src/lib/api/jobs.h | 2 | ||||
| -rw-r--r-- | src/lib/language/loader.cpp | 12 | ||||
| -rw-r--r-- | src/lib/language/projectresolver.cpp | 11 | ||||
| -rw-r--r-- | src/lib/tools/progressobserver.h | 1 |
11 files changed, 58 insertions, 9 deletions
diff --git a/src/app/qbs/commandlinefrontend.cpp b/src/app/qbs/commandlinefrontend.cpp index 12842d388..8ac89d0b2 100644 --- a/src/app/qbs/commandlinefrontend.cpp +++ b/src/app/qbs/commandlinefrontend.cpp @@ -209,6 +209,13 @@ void CommandLineFrontend::handleNewTaskStarted(const QString &description, int t } } +void CommandLineFrontend::handleTotalEffortChanged(int totalEffort) +{ + // Can only happen when resolving. + if (m_parser.showProgress() && !isBuilding() && !resolvingMultipleProjects()) + m_observer->setMaximum(totalEffort); +} + void CommandLineFrontend::handleTaskProgress(int value, AbstractJob *job) { if (isBuilding()) { @@ -438,6 +445,8 @@ void CommandLineFrontend::connectJob(AbstractJob *job) SLOT(handleJobFinished(bool, qbs::AbstractJob*))); connect(job, SIGNAL(taskStarted(QString,int,qbs::AbstractJob*)), SLOT(handleNewTaskStarted(QString,int))); + connect(job, SIGNAL(totalEffortChanged(int,qbs::AbstractJob*)), + SLOT(handleTotalEffortChanged(int))); if (m_parser.showProgress()) { connect(job, SIGNAL(taskProgress(int,qbs::AbstractJob*)), SLOT(handleTaskProgress(int,qbs::AbstractJob*))); diff --git a/src/app/qbs/commandlinefrontend.h b/src/app/qbs/commandlinefrontend.h index 10ca65c63..563b2bc68 100644 --- a/src/app/qbs/commandlinefrontend.h +++ b/src/app/qbs/commandlinefrontend.h @@ -58,6 +58,7 @@ private slots: void handleCommandDescriptionReport(const QString &highlight, const QString &message); void handleJobFinished(bool success, qbs::AbstractJob *job); void handleNewTaskStarted(const QString &description, int totalEffort); + void handleTotalEffortChanged(int totalEffort); void handleTaskProgress(int value, qbs::AbstractJob *job); void handleWarningReport(const qbs::Error &warning); void handleProcessResultReport(const qbs::ProcessResult &result); diff --git a/src/app/qbs/consoleprogressobserver.cpp b/src/app/qbs/consoleprogressobserver.cpp index eb56be447..31161f550 100644 --- a/src/app/qbs/consoleprogressobserver.cpp +++ b/src/app/qbs/consoleprogressobserver.cpp @@ -42,7 +42,13 @@ void ConsoleProgressObserver::initialize(const QString &task, int max) m_percentage = 0; m_hashesPrinted = 0; std::cout << task.toLocal8Bit().constData() << ": 0%" << std::flush; - if (max == 0) { + setMaximum(max); +} + +void ConsoleProgressObserver::setMaximum(int maximum) +{ + m_maximum = maximum; + if (maximum == 0) { m_percentage = 100; updateProgressBarIfNecessary(); writePercentageString(); diff --git a/src/app/qbs/consoleprogressobserver.h b/src/app/qbs/consoleprogressobserver.h index f86d461e8..63e4b689a 100644 --- a/src/app/qbs/consoleprogressobserver.h +++ b/src/app/qbs/consoleprogressobserver.h @@ -41,6 +41,7 @@ class ConsoleProgressObserver { public: void initialize(const QString &task, int max); + void setMaximum(int maximum); void setProgressValue(int value); void incrementProgressValue() { setProgressValue(m_value + 1); } diff --git a/src/lib/api/internaljobs.cpp b/src/lib/api/internaljobs.cpp index 003316598..26e0f2ed4 100644 --- a/src/lib/api/internaljobs.cpp +++ b/src/lib/api/internaljobs.cpp @@ -65,7 +65,8 @@ public: void cancel() { m_canceled = true; } private: - void initialize(const QString &task, int maximum) { + void initialize(const QString &task, int maximum) + { QBS_ASSERT(!m_timedLogger, delete m_timedLogger); m_timedLogger = new TimedActivityLogger(m_job->logger(), task, QString(), m_job->timed() ? LoggerInfo : LoggerDebug, m_job->timed()); @@ -74,7 +75,15 @@ private: m_canceled = false; emit m_job->newTaskStarted(task, maximum, m_job); } - void setProgressValue(int value) { + + void setMaximum(int maximum) + { + m_maximum = maximum; + emit m_job->totalEffortChanged(maximum, m_job); + } + + void setProgressValue(int value) + { //QBS_ASSERT(value >= m_value, qDebug("old value = %d, new value = %d", m_value, value)); //QBS_ASSERT(value <= m_maximum, qDebug("value = %d, maximum = %d", value, m_maximum)); m_value = value; @@ -84,6 +93,7 @@ private: } emit m_job->taskProgress(value, m_job); } + int progressValue() { return m_value; } int maximum() const { return m_maximum; } bool canceled() const { return m_canceled; } diff --git a/src/lib/api/internaljobs.h b/src/lib/api/internaljobs.h index f72f1853a..953977799 100644 --- a/src/lib/api/internaljobs.h +++ b/src/lib/api/internaljobs.h @@ -78,6 +78,7 @@ protected: signals: void finished(Internal::InternalJob *job); void newTaskStarted(const QString &description, int totalEffort, Internal::InternalJob *job); + void totalEffortChanged(int totalEffort, Internal::InternalJob *job); void taskProgress(int value, Internal::InternalJob *job); private: diff --git a/src/lib/api/jobs.cpp b/src/lib/api/jobs.cpp index 27bf9ac29..a7b8f87c9 100644 --- a/src/lib/api/jobs.cpp +++ b/src/lib/api/jobs.cpp @@ -109,6 +109,8 @@ AbstractJob::AbstractJob(InternalJob *internalJob, QObject *parent) m_internalJob->setParent(this); connect(m_internalJob, SIGNAL(newTaskStarted(QString,int,Internal::InternalJob*)), SLOT(handleTaskStarted(QString,int)), Qt::QueuedConnection); + connect(m_internalJob, SIGNAL(totalEffortChanged(int,Internal::InternalJob*)), + SLOT(handleTotalEffortChanged(int))); connect(m_internalJob, SIGNAL(taskProgress(int,Internal::InternalJob*)), SLOT(handleTaskProgress(int)), Qt::QueuedConnection); connect(m_internalJob, SIGNAL(finished(Internal::InternalJob *)), SLOT(handleFinished())); @@ -151,6 +153,11 @@ void AbstractJob::handleTaskStarted(const QString &description, int maximumProgr emit taskStarted(description, maximumProgressValue, this); } +void AbstractJob::handleTotalEffortChanged(int totalEffort) +{ + emit totalEffortChanged(totalEffort, this); +} + void AbstractJob::handleTaskProgress(int newProgressValue) { emit taskProgress(newProgressValue, this); diff --git a/src/lib/api/jobs.h b/src/lib/api/jobs.h index a3f457929..35ce502bd 100644 --- a/src/lib/api/jobs.h +++ b/src/lib/api/jobs.h @@ -72,11 +72,13 @@ protected: signals: void taskStarted(const QString &description, int maximumProgressValue, qbs::AbstractJob *job); + void totalEffortChanged(int totalEffort, qbs::AbstractJob *job); void taskProgress(int newProgressValue, qbs::AbstractJob *job); void finished(bool success, qbs::AbstractJob *job); private slots: void handleTaskStarted(const QString &description, int maximumProgressValue); + void handleTotalEffortChanged(int totalEffort); void handleTaskProgress(int newProgressValue); void handleFinished(); diff --git a/src/lib/language/loader.cpp b/src/lib/language/loader.cpp index 36fbb939d..0caab78e0 100644 --- a/src/lib/language/loader.cpp +++ b/src/lib/language/loader.cpp @@ -85,17 +85,19 @@ void Loader::setSearchPaths(const QStringList &_searchPaths) ResolvedProjectPtr Loader::loadProject(const SetupProjectParameters ¶meters) { QBS_CHECK(QFileInfo(parameters.projectFilePath).isAbsolute()); + + // At this point, we cannot set a sensible total effort, because we know nothing about + // the project yet. That's why we use a placeholder here, so the user at least + // sees that an operation is starting. The real total effort will be set later when + // we have enough information. if (m_progressObserver) - m_progressObserver->initialize(Tr::tr("Loading project"), 1); // TODO: Make more fine-grained. + m_progressObserver->initialize(Tr::tr("Loading project"), 1); ModuleLoaderResult loadResult = m_moduleLoader->load(parameters.projectFilePath, parameters.buildConfiguration, true); - const ResolvedProjectPtr &p = m_projectResolver->resolve(loadResult, parameters.buildRoot, + return m_projectResolver->resolve(loadResult, parameters.buildRoot, parameters.buildConfiguration); - if (m_progressObserver) - m_progressObserver->setFinished(); - return p; } QByteArray Loader::qmlTypeInfo() diff --git a/src/lib/language/projectresolver.cpp b/src/lib/language/projectresolver.cpp index 51c2c0474..43bfa9bd0 100644 --- a/src/lib/language/projectresolver.cpp +++ b/src/lib/language/projectresolver.cpp @@ -176,13 +176,22 @@ void ProjectResolver::resolveProject(const ItemPtr &item) mapping["FileTagger"] = &ProjectResolver::resolveFileTagger; mapping["Rule"] = &ProjectResolver::resolveRule; - foreach (const ItemPtr &child, item->children()) + if (m_progressObserver) + m_progressObserver->setMaximum(item->children().count() + 2); + foreach (const ItemPtr &child, item->children()) { callItemFunction(mapping, child); + if (m_progressObserver) + m_progressObserver->incrementProgressValue(); + } foreach (const ResolvedProductPtr &product, project->products) postProcess(product); + if (m_progressObserver) + m_progressObserver->incrementProgressValue(); resolveProductDependencies(); + if (m_progressObserver) + m_progressObserver->incrementProgressValue(); } void ProjectResolver::resolveProduct(const ItemPtr &item) diff --git a/src/lib/tools/progressobserver.h b/src/lib/tools/progressobserver.h index c09da3693..3a2ccc444 100644 --- a/src/lib/tools/progressobserver.h +++ b/src/lib/tools/progressobserver.h @@ -47,6 +47,7 @@ public: virtual void setProgressValue(int value) = 0; virtual int progressValue() = 0; virtual bool canceled() const = 0; + virtual void setMaximum(int maximum) = 0; virtual int maximum() const = 0; void incrementProgressValue(int increment = 1); |
