diff options
Diffstat (limited to 'src/plugins/coreplugin/progressmanager')
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 |