summaryrefslogtreecommitdiff
path: root/src/plugins/coreplugin/progressmanager
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@digia.com>2013-04-08 15:02:30 +0200
committerEike Ziller <eike.ziller@digia.com>2013-04-10 14:21:25 +0200
commit920e7ca1f113f1f4ecc204adff51e7254e87a56b (patch)
tree2aeef98ad892193112675a83287fde71ec223990 /src/plugins/coreplugin/progressmanager
parent9e714006eece70447679ed740958ecf5290deb4b (diff)
downloadqt-creator-920e7ca1f113f1f4ecc204adff51e7254e87a56b.tar.gz
Show build and search progress detail also in status bar.
A widget specifically layouted for the status bar can now be registered with the progress information. The newest one is made visible next to the summary progress bar. If a newer one vanishes, the older becomes visible again. Change-Id: Iedf0e88a542ea442ae86fa51c792c68fbc6eef3c Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com> Reviewed-by: Eike Ziller <eike.ziller@digia.com>
Diffstat (limited to 'src/plugins/coreplugin/progressmanager')
-rw-r--r--src/plugins/coreplugin/progressmanager/futureprogress.cpp16
-rw-r--r--src/plugins/coreplugin/progressmanager/futureprogress.h5
-rw-r--r--src/plugins/coreplugin/progressmanager/progressmanager.cpp55
-rw-r--r--src/plugins/coreplugin/progressmanager/progressmanager_p.h5
4 files changed, 75 insertions, 6 deletions
diff --git a/src/plugins/coreplugin/progressmanager/futureprogress.cpp b/src/plugins/coreplugin/progressmanager/futureprogress.cpp
index a064402173..917c3b3ec5 100644
--- a/src/plugins/coreplugin/progressmanager/futureprogress.cpp
+++ b/src/plugins/coreplugin/progressmanager/futureprogress.cpp
@@ -65,6 +65,7 @@ public:
Internal::ProgressBar *m_progress;
QWidget *m_widget;
QHBoxLayout *m_widgetLayout;
+ QWidget *m_statusBarWidget;
QString m_type;
FutureProgress::KeepOnFinishType m_keep;
bool m_waitingForUserInteraction;
@@ -75,6 +76,7 @@ public:
FutureProgressPrivate::FutureProgressPrivate(FutureProgress *q) :
m_progress(new Internal::ProgressBar), m_widget(0), m_widgetLayout(new QHBoxLayout),
+ m_statusBarWidget(0),
m_keep(FutureProgress::HideOnFinish), m_waitingForUserInteraction(false),
m_q(q), m_fadeStarting(false), m_isFading(false)
{
@@ -341,6 +343,20 @@ QWidget *FutureProgress::widget() const
return d->m_widget;
}
+void FutureProgress::setStatusBarWidget(QWidget *widget)
+{
+ if (widget == d->m_statusBarWidget)
+ return;
+ delete d->m_statusBarWidget;
+ d->m_statusBarWidget = widget;
+ emit statusBarWidgetChanged();
+}
+
+QWidget *FutureProgress::statusBarWidget() const
+{
+ return d->m_statusBarWidget;
+}
+
bool FutureProgress::isFading() const
{
return d->m_isFading;
diff --git a/src/plugins/coreplugin/progressmanager/futureprogress.h b/src/plugins/coreplugin/progressmanager/futureprogress.h
index cbc3a25ba3..4cf58b203a 100644
--- a/src/plugins/coreplugin/progressmanager/futureprogress.h
+++ b/src/plugins/coreplugin/progressmanager/futureprogress.h
@@ -71,6 +71,9 @@ public:
void setWidget(QWidget *widget);
QWidget *widget() const;
+ void setStatusBarWidget(QWidget *widget);
+ QWidget *statusBarWidget() const;
+
bool isFading() const;
QSize sizeHint() const;
@@ -83,6 +86,8 @@ signals:
void hasErrorChanged();
void fadeStarted();
+ void statusBarWidgetChanged();
+
protected:
void mousePressEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *);
diff --git a/src/plugins/coreplugin/progressmanager/progressmanager.cpp b/src/plugins/coreplugin/progressmanager/progressmanager.cpp
index 578e3cb00d..f5e401b05f 100644
--- a/src/plugins/coreplugin/progressmanager/progressmanager.cpp
+++ b/src/plugins/coreplugin/progressmanager/progressmanager.cpp
@@ -263,6 +263,7 @@ using namespace Core::Internal;
ProgressManagerPrivate::ProgressManagerPrivate(QObject *parent)
: ProgressManager(parent),
m_applicationTask(0),
+ m_currentStatusDetailsWidget(0),
m_opacityEffect(new QGraphicsOpacityEffect(this)),
m_progressViewPinned(false),
m_hovered(false)
@@ -290,14 +291,20 @@ void ProgressManagerPrivate::init()
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
m_statusBarWidget->setLayout(layout);
- m_summaryProgressBar = new ProgressBar(m_statusBarWidget);
+ m_summaryProgressWidget = new QWidget(m_statusBarWidget);
+ m_summaryProgressWidget->setVisible(!m_progressViewPinned);
+ m_summaryProgressWidget->setGraphicsEffect(m_opacityEffect);
+ m_summaryProgressLayout = new QHBoxLayout(m_summaryProgressWidget);
+ m_summaryProgressLayout->setContentsMargins(0, 0, 0, 0);
+ m_summaryProgressLayout->setSpacing(0);
+ m_summaryProgressWidget->setLayout(m_summaryProgressLayout);
+ m_summaryProgressBar = new ProgressBar(m_summaryProgressWidget);
m_summaryProgressBar->setMinimumWidth(70);
m_summaryProgressBar->setTitleVisible(false);
m_summaryProgressBar->setSeparatorVisible(false);
m_summaryProgressBar->setCancelEnabled(false);
- m_summaryProgressBar->setGraphicsEffect(m_opacityEffect);
- m_summaryProgressBar->setVisible(!m_progressViewPinned);
- layout->addWidget(m_summaryProgressBar);
+ m_summaryProgressLayout->addWidget(m_summaryProgressBar);
+ layout->addWidget(m_summaryProgressWidget);
ToggleButton *toggleButton = new ToggleButton(m_statusBarWidget);
layout->addWidget(toggleButton);
m_statusBarWidgetContainer->setWidget(m_statusBarWidget);
@@ -420,6 +427,8 @@ FutureProgress *ProgressManagerPrivate::addTask(const QFuture<void> &future, con
connect(progress, SIGNAL(hasErrorChanged()), this, SLOT(updateSummaryProgressBar()));
connect(progress, SIGNAL(removeMe()), this, SLOT(slotRemoveTask()));
connect(progress, SIGNAL(fadeStarted()), this, SLOT(updateSummaryProgressBar()));
+ connect(progress, SIGNAL(statusBarWidgetChanged()), this, SLOT(updateStatusDetailsWidget()));
+ updateStatusDetailsWidget();
emit taskStarted(type);
return progress;
@@ -545,6 +554,8 @@ void ProgressManagerPrivate::removeOldTasks(const QString &type, bool keepOne)
firstFound = true;
}
}
+ updateSummaryProgressBar();
+ updateStatusDetailsWidget();
}
void ProgressManagerPrivate::removeOneOldTask()
@@ -578,12 +589,16 @@ void ProgressManagerPrivate::removeOneOldTask()
// no ended process, no type with multiple processes, just remove the oldest task
FutureProgress *task = m_taskList.takeFirst();
deleteTask(task);
+ updateSummaryProgressBar();
+ updateStatusDetailsWidget();
}
void ProgressManagerPrivate::removeTask(FutureProgress *task)
{
m_taskList.removeAll(task);
deleteTask(task);
+ updateSummaryProgressBar();
+ updateStatusDetailsWidget();
}
void ProgressManagerPrivate::deleteTask(FutureProgress *progress)
@@ -596,7 +611,7 @@ void ProgressManagerPrivate::deleteTask(FutureProgress *progress)
void ProgressManagerPrivate::updateVisibility()
{
m_progressView->setVisible(m_progressViewPinned || m_hovered || m_progressView->isHovered());
- m_summaryProgressBar->setVisible((!m_runningTasks.isEmpty() || !m_taskList.isEmpty())
+ m_summaryProgressWidget->setVisible((!m_runningTasks.isEmpty() || !m_taskList.isEmpty())
&& !m_progressViewPinned);
}
@@ -605,9 +620,37 @@ void ProgressManagerPrivate::updateVisibilityWithDelay()
QTimer::singleShot(150, this, SLOT(updateVisibility()));
}
+void ProgressManagerPrivate::updateStatusDetailsWidget()
+{
+ QWidget *candidateWidget = 0;
+ // get newest progress with a status bar widget
+ QList<FutureProgress *>::iterator i = m_taskList.end();
+ while (i != m_taskList.begin()) {
+ --i;
+ candidateWidget = (*i)->statusBarWidget();
+ if (candidateWidget)
+ break;
+ }
+
+ if (candidateWidget == m_currentStatusDetailsWidget)
+ return;
+
+ if (m_currentStatusDetailsWidget) {
+ m_currentStatusDetailsWidget->hide();
+ m_summaryProgressLayout->removeWidget(m_currentStatusDetailsWidget);
+ }
+
+ if (candidateWidget) {
+ m_summaryProgressLayout->insertWidget(0, candidateWidget);
+ candidateWidget->show();
+ }
+
+ m_currentStatusDetailsWidget = candidateWidget;
+}
+
void ProgressManagerPrivate::summaryProgressFinishedFading()
{
- m_summaryProgressBar->setVisible(false);
+ m_summaryProgressWidget->setVisible(false);
m_opacityEffect->setOpacity(1.);
}
diff --git a/src/plugins/coreplugin/progressmanager/progressmanager_p.h b/src/plugins/coreplugin/progressmanager/progressmanager_p.h
index 8c8de807f3..44b572d0f2 100644
--- a/src/plugins/coreplugin/progressmanager/progressmanager_p.h
+++ b/src/plugins/coreplugin/progressmanager/progressmanager_p.h
@@ -35,6 +35,7 @@
#include <QFutureWatcher>
#include <QList>
#include <QGraphicsOpacityEffect>
+#include <QHBoxLayout>
#include <QPointer>
#include <QPropertyAnimation>
#include <QToolButton>
@@ -82,6 +83,7 @@ private slots:
void progressDetailsToggled(bool checked);
void updateVisibility();
void updateVisibilityWithDelay();
+ void updateStatusDetailsWidget();
void slotRemoveTask();
private:
@@ -102,6 +104,9 @@ private:
QFutureWatcher<void> *m_applicationTask;
Core::StatusBarWidget *m_statusBarWidgetContainer;
QWidget *m_statusBarWidget;
+ QWidget *m_summaryProgressWidget;
+ QHBoxLayout *m_summaryProgressLayout;
+ QWidget *m_currentStatusDetailsWidget;
ProgressBar *m_summaryProgressBar;
QGraphicsOpacityEffect *m_opacityEffect;
QPointer<QPropertyAnimation> m_opacityAnimation;