aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/coreplugin/progressmanager
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/coreplugin/progressmanager')
-rw-r--r--src/plugins/coreplugin/progressmanager/futureprogress.cpp28
-rw-r--r--src/plugins/coreplugin/progressmanager/futureprogress.h7
-rw-r--r--src/plugins/coreplugin/progressmanager/progressbar.cpp60
-rw-r--r--src/plugins/coreplugin/progressmanager/progressbar.h5
-rw-r--r--src/plugins/coreplugin/progressmanager/progressmanager.cpp56
-rw-r--r--src/plugins/coreplugin/progressmanager/progressmanager_p.h11
6 files changed, 104 insertions, 63 deletions
diff --git a/src/plugins/coreplugin/progressmanager/futureprogress.cpp b/src/plugins/coreplugin/progressmanager/futureprogress.cpp
index d7eeec9ff4..32193fd08b 100644
--- a/src/plugins/coreplugin/progressmanager/futureprogress.cpp
+++ b/src/plugins/coreplugin/progressmanager/futureprogress.cpp
@@ -71,6 +71,7 @@ public:
FutureProgress *m_q;
bool m_fadeStarting;
bool m_isFading;
+ bool m_isSubtitleVisibleInStatusBar = false;
};
FutureProgressPrivate::FutureProgressPrivate(FutureProgress *q) :
@@ -188,6 +189,33 @@ QString FutureProgress::title() const
return d->m_progress->title();
}
+void FutureProgress::setSubtitle(const QString &subtitle)
+{
+ if (subtitle != d->m_progress->subtitle()) {
+ d->m_progress->setSubtitle(subtitle);
+ if (d->m_isSubtitleVisibleInStatusBar)
+ emit subtitleInStatusBarChanged();
+ }
+}
+
+QString FutureProgress::subtitle() const
+{
+ return d->m_progress->subtitle();
+}
+
+void FutureProgress::setSubtitleVisibleInStatusBar(bool visible)
+{
+ if (visible != d->m_isSubtitleVisibleInStatusBar) {
+ d->m_isSubtitleVisibleInStatusBar = visible;
+ emit subtitleInStatusBarChanged();
+ }
+}
+
+bool FutureProgress::isSubtitleVisibleInStatusBar() const
+{
+ return d->m_isSubtitleVisibleInStatusBar;
+}
+
void FutureProgress::cancel()
{
d->m_watcher.future().cancel();
diff --git a/src/plugins/coreplugin/progressmanager/futureprogress.h b/src/plugins/coreplugin/progressmanager/futureprogress.h
index 3f591b2b94..09b178dff2 100644
--- a/src/plugins/coreplugin/progressmanager/futureprogress.h
+++ b/src/plugins/coreplugin/progressmanager/futureprogress.h
@@ -56,6 +56,12 @@ public:
void setTitle(const QString &title);
QString title() const;
+ void setSubtitle(const QString &subtitle);
+ QString subtitle() const;
+
+ void setSubtitleVisibleInStatusBar(bool visible);
+ bool isSubtitleVisibleInStatusBar() const;
+
void setType(Id type);
Id type() const;
@@ -83,6 +89,7 @@ signals:
void fadeStarted();
void statusBarWidgetChanged();
+ void subtitleInStatusBarChanged();
protected:
void mousePressEvent(QMouseEvent *event) override;
diff --git a/src/plugins/coreplugin/progressmanager/progressbar.cpp b/src/plugins/coreplugin/progressmanager/progressbar.cpp
index 2dd28712e9..bf6f7d8e19 100644
--- a/src/plugins/coreplugin/progressmanager/progressbar.cpp
+++ b/src/plugins/coreplugin/progressmanager/progressbar.cpp
@@ -139,6 +139,18 @@ bool ProgressBar::isTitleVisible() const
return m_titleVisible;
}
+void ProgressBar::setSubtitle(const QString &subtitle)
+{
+ m_subtitle = subtitle;
+ updateGeometry();
+ update();
+}
+
+QString ProgressBar::subtitle() const
+{
+ return m_subtitle;
+}
+
void ProgressBar::setSeparatorVisible(bool visible)
{
if (m_separatorVisible == visible)
@@ -176,9 +188,13 @@ QSize ProgressBar::sizeHint() const
int width = 50;
int height = PROGRESSBAR_HEIGHT + 5;
if (m_titleVisible) {
- QFontMetrics fm(titleFont());
- width = qMax(width, fm.width(m_title) + 16);
+ const QFontMetrics fm(titleFont());
+ width = qMax(width, fm.horizontalAdvance(m_title) + 16);
height += fm.height() + 5;
+ if (!m_subtitle.isEmpty()) {
+ width = qMax(width, fm.horizontalAdvance(m_subtitle) + 16);
+ height += fm.height() + 5;
+ }
}
if (m_separatorVisible)
height += SEPARATOR_HEIGHT;
@@ -227,14 +243,13 @@ void ProgressBar::paintEvent(QPaintEvent *)
percent = 1;
QPainter p(this);
- QFont fnt(titleFont());
- p.setFont(fnt);
- QFontMetrics fm(fnt);
+ const QFont fnt(titleFont());
+ const QFontMetrics fm(fnt);
- int titleHeight = m_titleVisible ? fm.height() : 0;
+ const int titleHeight = m_titleVisible ? fm.height() + 5 : 4;
// Draw separator
- int separatorHeight = m_separatorVisible ? SEPARATOR_HEIGHT : 0;
+ const int separatorHeight = m_separatorVisible ? SEPARATOR_HEIGHT : 0;
if (m_separatorVisible) {
QRectF innerRect = QRectF(this->rect()).adjusted(0.5, 0.5, -0.5, -0.5);
p.setPen(StyleHelper::sidebarShadow());
@@ -246,28 +261,37 @@ void ProgressBar::paintEvent(QPaintEvent *)
}
}
- if (m_titleVisible) {
- QRect textBounds = fm.boundingRect(m_title);
- textBounds.moveCenter(rect().center());
- int alignment = Qt::AlignHCenter;
+ const int progressHeight = PROGRESSBAR_HEIGHT + ((PROGRESSBAR_HEIGHT % 2) + 1) % 2; // make odd
+ const int progressY = titleHeight + separatorHeight;
- int textSpace = rect().width() - 8;
+ if (m_titleVisible) {
+ const int alignment = Qt::AlignHCenter;
+ const int textSpace = rect().width() - 8;
// If there is not enough room when centered, we left align and
// elide the text
- QString elidedtitle = fm.elidedText(m_title, Qt::ElideRight, textSpace);
+ const QString elidedtitle = fm.elidedText(m_title, Qt::ElideRight, textSpace);
QRect textRect = rect().adjusted(3, separatorHeight - 1, -3, 0);
- textRect.setHeight(titleHeight + 4);
+ textRect.setHeight(fm.height() + 4);
+ p.setFont(fnt);
p.setPen(creatorTheme()->color(Theme::ProgressBarTitleColor));
p.drawText(textRect, alignment | Qt::AlignBottom, elidedtitle);
+
+ if (!m_subtitle.isEmpty()) {
+ const QString elidedsubtitle = fm.elidedText(m_subtitle, Qt::ElideRight, textSpace);
+
+ QRect subtextRect = textRect;
+ subtextRect.moveTop(progressY + progressHeight);
+
+ p.setFont(fnt);
+ p.setPen(creatorTheme()->color(Theme::ProgressBarTitleColor));
+ p.drawText(subtextRect, alignment | Qt::AlignBottom, elidedsubtitle);
+ }
}
- m_progressHeight = PROGRESSBAR_HEIGHT;
- m_progressHeight += ((m_progressHeight % 2) + 1) % 2; // make odd
// draw outer rect
- const QRect rect(INDENT - 1, titleHeight + separatorHeight + (m_titleVisible ? 5 : 4),
- size().width() - 2 * INDENT + 1, m_progressHeight);
+ const QRect rect(INDENT - 1, progressY, size().width() - 2 * INDENT + 1, progressHeight);
QRectF inner = rect.adjusted(2, 2, -2, -2);
inner.adjust(0, 0, qRound((percent - 1) * inner.width()), 0);
diff --git a/src/plugins/coreplugin/progressmanager/progressbar.h b/src/plugins/coreplugin/progressmanager/progressbar.h
index 9ff599adbb..108181f54b 100644
--- a/src/plugins/coreplugin/progressmanager/progressbar.h
+++ b/src/plugins/coreplugin/progressmanager/progressbar.h
@@ -44,6 +44,8 @@ public:
void setTitle(const QString &title);
void setTitleVisible(bool visible);
bool isTitleVisible() const;
+ void setSubtitle(const QString &subtitle);
+ QString subtitle() const;
void setSeparatorVisible(bool visible);
bool isSeparatorVisible() const;
void setCancelEnabled(bool enabled);
@@ -73,16 +75,17 @@ protected:
private:
QFont titleFont() const;
+ QFont subtitleFont() const;
QString m_text;
QString m_title;
+ QString m_subtitle;
bool m_titleVisible = true;
bool m_separatorVisible = true;
bool m_cancelEnabled = true;
bool m_finished = false;
bool m_error = false;
float m_cancelButtonFader = 0.0;
- int m_progressHeight = 0;
int m_minimum = 1;
int m_maximum = 100;
int m_value = 1;
diff --git a/src/plugins/coreplugin/progressmanager/progressmanager.cpp b/src/plugins/coreplugin/progressmanager/progressmanager.cpp
index 725721852f..d822397b90 100644
--- a/src/plugins/coreplugin/progressmanager/progressmanager.cpp
+++ b/src/plugins/coreplugin/progressmanager/progressmanager.cpp
@@ -39,6 +39,7 @@
#include <utils/qtcassert.h>
#include <utils/stylehelper.h>
#include <utils/theme/theme.h>
+#include <utils/utilsicons.h>
#include <QAction>
#include <QEvent>
@@ -291,7 +292,7 @@ void ProgressManagerPrivate::readSettings()
{
QSettings *settings = ICore::settings();
settings->beginGroup(QLatin1String(kSettingsGroup));
- m_progressViewPinned = settings->value(QLatin1String(kDetailsPinned), false).toBool();
+ m_progressViewPinned = settings->value(QLatin1String(kDetailsPinned), true).toBool();
settings->endGroup();
}
@@ -319,7 +320,7 @@ void ProgressManagerPrivate::init()
m_summaryProgressBar->setCancelEnabled(false);
m_summaryProgressLayout->addWidget(m_summaryProgressBar);
layout->addWidget(m_summaryProgressWidget);
- auto toggleButton = new ToggleButton(m_statusBarWidget);
+ auto toggleButton = new QToolButton(m_statusBarWidget);
layout->addWidget(toggleButton);
m_statusBarWidget->installEventFilter(this);
StatusBarManager::addStatusBarWidget(m_statusBarWidget, StatusBarManager::RightCorner);
@@ -327,10 +328,7 @@ void ProgressManagerPrivate::init()
QAction *toggleProgressView = new QAction(tr("Toggle Progress Details"), this);
toggleProgressView->setCheckable(true);
toggleProgressView->setChecked(m_progressViewPinned);
- // we have to set an transparent icon to prevent the tool button to show text
- QPixmap p(1, 1);
- p.fill(Qt::transparent);
- toggleProgressView->setIcon(QIcon(p));
+ toggleProgressView->setIcon(Utils::Icons::TOGGLE_PROGRESSDETAILS_TOOLBAR.icon());
Command *cmd = ActionManager::registerAction(toggleProgressView,
"QtCreator.ToggleProgressDetails");
@@ -457,6 +455,8 @@ FutureProgress *ProgressManagerPrivate::doAddTask(const QFuture<void> &future, c
this, &ProgressManagerPrivate::updateSummaryProgressBar);
connect(progress, &FutureProgress::statusBarWidgetChanged,
this, &ProgressManagerPrivate::updateStatusDetailsWidget);
+ connect(progress, &FutureProgress::subtitleInStatusBarChanged,
+ this, &ProgressManagerPrivate::updateStatusDetailsWidget);
updateStatusDetailsWidget();
emit taskStarted(type);
@@ -657,9 +657,22 @@ void ProgressManagerPrivate::updateStatusDetailsWidget()
QList<FutureProgress *>::iterator i = m_taskList.end();
while (i != m_taskList.begin()) {
--i;
- candidateWidget = (*i)->statusBarWidget();
+ FutureProgress *progress = *i;
+ candidateWidget = progress->statusBarWidget();
if (candidateWidget) {
- m_currentStatusDetailsProgress = *i;
+ m_currentStatusDetailsProgress = progress;
+ break;
+ } else if (progress->isSubtitleVisibleInStatusBar() && !progress->subtitle().isEmpty()) {
+ if (!m_statusDetailsLabel) {
+ m_statusDetailsLabel = new QLabel(m_summaryProgressWidget);
+ QFont font(m_statusDetailsLabel->font());
+ font.setPointSizeF(StyleHelper::sidebarFontSize());
+ font.setBold(true);
+ m_statusDetailsLabel->setFont(font);
+ }
+ m_statusDetailsLabel->setText(progress->subtitle());
+ candidateWidget = m_statusDetailsLabel;
+ m_currentStatusDetailsProgress = progress;
break;
}
}
@@ -697,33 +710,6 @@ void ProgressManagerPrivate::progressDetailsToggled(bool checked)
settings->endGroup();
}
-ToggleButton::ToggleButton(QWidget *parent)
- : QToolButton(parent)
-{
- setToolButtonStyle(Qt::ToolButtonIconOnly);
- if (creatorTheme()->flag(Theme::FlatToolBars)) {
- QPalette p = palette();
- p.setBrush(QPalette::Base, creatorTheme()->color(Theme::ToggleButtonBackgroundColor));
- setPalette(p);
- }
-}
-
-QSize ToggleButton::sizeHint() const
-{
- return QSize(13, 12); // Uneven width, because the arrow's width is also uneven.
-}
-
-void ToggleButton::paintEvent(QPaintEvent *event)
-{
- QToolButton::paintEvent(event);
- QPainter p(this);
- QStyleOption arrowOpt;
- arrowOpt.initFrom(this);
- arrowOpt.rect.adjust(2, 0, -1, -2);
- StyleHelper::drawArrow(QStyle::PE_IndicatorArrowUp, &p, &arrowOpt);
-}
-
-
ProgressManager::ProgressManager() = default;
ProgressManager::~ProgressManager() = default;
diff --git a/src/plugins/coreplugin/progressmanager/progressmanager_p.h b/src/plugins/coreplugin/progressmanager/progressmanager_p.h
index 85bf378159..4eabe50204 100644
--- a/src/plugins/coreplugin/progressmanager/progressmanager_p.h
+++ b/src/plugins/coreplugin/progressmanager/progressmanager_p.h
@@ -31,6 +31,7 @@
#include <QList>
#include <QGraphicsOpacityEffect>
#include <QHBoxLayout>
+#include <QLabel>
#include <QPointer>
#include <QPropertyAnimation>
#include <QToolButton>
@@ -103,6 +104,7 @@ private:
QHBoxLayout *m_summaryProgressLayout;
QWidget *m_currentStatusDetailsWidget = nullptr;
QPointer<FutureProgress> m_currentStatusDetailsProgress;
+ QLabel *m_statusDetailsLabel = nullptr;
ProgressBar *m_summaryProgressBar;
QGraphicsOpacityEffect *m_opacityEffect;
QPointer<QPropertyAnimation> m_opacityAnimation;
@@ -110,14 +112,5 @@ private:
bool m_hovered = false;
};
-class ToggleButton : public QToolButton
-{
- Q_OBJECT
-public:
- ToggleButton(QWidget *parent);
- QSize sizeHint() const override;
- void paintEvent(QPaintEvent *event) override;
-};
-
} // namespace Internal
} // namespace Core