diff --git a/src/plugins/coreplugin/progressmanager/progressbar.cpp b/src/plugins/coreplugin/progressmanager/progressbar.cpp index 1d70c9783ce3b0ca3a5fefb58fd4934851d15858..812f4cd13099c8c0fe18fe53546fc63812132eda 100644 --- a/src/plugins/coreplugin/progressmanager/progressbar.cpp +++ b/src/plugins/coreplugin/progressmanager/progressbar.cpp @@ -31,6 +31,7 @@ #include <utils/stylehelper.h> +#include <QtCore/QPropertyAnimation> #include <QtGui/QPainter> #include <QtGui/QFont> #include <QtGui/QBrush> @@ -38,10 +39,10 @@ #include <QtDebug> #define PROGRESSBAR_HEIGHT 13 -#define CANCEL_WIDTH 12 +#define CANCELBUTTON_SIZE 15 ProgressBar::ProgressBar(QWidget *parent) - : QWidget(parent), m_error(false), m_minimum(1), m_maximum(100), m_value(1) + : QWidget(parent), m_error(false), m_minimum(1), m_maximum(100), m_value(1), m_fader(0) { setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); setMouseTracking(true); @@ -51,6 +52,32 @@ ProgressBar::~ProgressBar() { } +bool ProgressBar::event(QEvent *e) +{ + switch(e->type()) { + case QEvent::Enter: + { + QPropertyAnimation *animation = new QPropertyAnimation(this, "fader"); + animation->setDuration(125); + animation->setEndValue(1.0); + animation->start(QAbstractAnimation::DeleteWhenStopped); + } + break; + case QEvent::Leave: + { + QPropertyAnimation *animation = new QPropertyAnimation(this, "fader"); + animation->setDuration(225); + animation->setEndValue(0.0); + animation->start(QAbstractAnimation::DeleteWhenStopped); + } + break; + default: + return QWidget::event(e); + } + return false; +} + + void ProgressBar::reset() { m_value = m_minimum; @@ -111,8 +138,16 @@ namespace { const int INDENT = 6; } void ProgressBar::mousePressEvent(QMouseEvent *event) { + QFont boldFont(font()); + boldFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize()); + boldFont.setBold(true); + QFontMetrics fm(boldFont); + int h = fm.height(); + QRect rect(INDENT - 1, h+8, size().width()-2*INDENT + 1, m_progressHeight-1); + QRect cancelRect(rect.adjusted(rect.width() - CANCELBUTTON_SIZE, 1, -1, 0)); + if (event->modifiers() == Qt::NoModifier - && event->x() >= size().width()-INDENT-m_progressHeight) { + && cancelRect.contains(event->pos())) { event->accept(); emit clicked(); return; @@ -159,17 +194,12 @@ void ProgressBar::paintEvent(QPaintEvent *) QRect textBounds = fm.boundingRect(m_title); textBounds.moveCenter(rect().center()); - int buttonWidth = value() < maximum() ? CANCEL_WIDTH : 0; int alignment = Qt::AlignHCenter; - int textSpace = rect().width() - buttonWidth - 8; + int textSpace = rect().width() - 8; // If there is not enough room when centered, we left align and // elide the text - QString elidedtitle = m_title; - if (!m_error && textBounds.right() > textSpace) { - alignment = Qt::AlignLeft; - elidedtitle = fm.elidedText(m_title, Qt::ElideRight, textSpace); - } + QString elidedtitle = fm.elidedText(m_title, Qt::ElideRight, textSpace); QRect textRect = rect().adjusted(INDENT + 1, 1, -INDENT - 1, 0); textRect.setHeight(h+5); @@ -193,6 +223,7 @@ void ProgressBar::paintEvent(QPaintEvent *) c.setAlpha(180); p.setPen(Qt::NoPen); + QRect inner = rect.adjusted(3, 2, -2, -2); inner.adjust(0, 0, qRound((percent - 1) * inner.width()), 0); if (m_error) { @@ -228,20 +259,32 @@ void ProgressBar::paintEvent(QPaintEvent *) p.drawPoint(inner.bottomRight()); // Draw cancel button - if (value() < maximum() && !m_error) { - QRect parentRect = parentWidget()->rect(); // ### Move to parent - QRect cancelRect(parentRect.right() - buttonWidth - 2, - parentRect.top() + 4, buttonWidth, CANCEL_WIDTH); + p.setOpacity(m_fader); + if (value() < maximum() && !m_error) { + QRect cancelRect(rect.adjusted(rect.width() - CANCELBUTTON_SIZE, 1, -1, 0)); bool hover = cancelRect.contains(mapFromGlobal(QCursor::pos())); - p.setPen(QPen(QColor(0, 0, 0, 20), 4)); - p.drawLine(cancelRect.center()+QPoint(-2,-2), cancelRect.center()+QPoint(+4,+4)); - p.drawLine(cancelRect.center()+QPoint(+4,-2), cancelRect.center()+QPoint(-2,+4)); - - p.setPen(QPen(hover ? Utils::StyleHelper::panelTextColor() : QColor(200, 200, 200), 1)); + QLinearGradient grad(cancelRect.topLeft(), cancelRect.bottomLeft()); + int intensity = hover ? 90 : 70; + QColor buttonColor(intensity, intensity, intensity, 255); + grad.setColorAt(0, buttonColor.lighter(130)); + grad.setColorAt(1, buttonColor.darker(130)); + p.setPen(Qt::NoPen); + p.setBrush(grad); + p.drawRect(cancelRect.adjusted(1, 1, -1, -1)); + + p.setPen(QPen(QColor(0, 0, 0, 30))); + p.drawLine(cancelRect.topLeft() + QPoint(0,1), cancelRect.bottomLeft() + QPoint(0,-1)); + p.setPen(QPen(QColor(0, 0, 0, 120))); + p.drawLine(cancelRect.topLeft() + QPoint(1,1), cancelRect.bottomLeft() + QPoint(1,-1)); + p.setPen(QPen(QColor(255, 255, 255, 30))); + p.drawLine(cancelRect.topLeft() + QPoint(2,1), cancelRect.bottomLeft() + QPoint(2,-1)); + p.setPen(QPen(hover ? Utils::StyleHelper::panelTextColor() : QColor(180, 180, 180), 1)); p.setRenderHint(QPainter::Antialiasing); p.translate(0.5, 0.5); - p.drawLine(cancelRect.center()+QPoint(-2,-2), cancelRect.center()+QPoint(+4,+4)); - p.drawLine(cancelRect.center()+QPoint(+4,-2), cancelRect.center()+QPoint(-2,+4)); + p.drawLine(cancelRect.center()+QPoint(-1,-2), cancelRect.center()+QPoint(+3,+2)); + p.drawLine(cancelRect.center()+QPoint(+3,-2), cancelRect.center()+QPoint(-1,+2)); + p.setPen(QPen(QColor(0, 0, 0, 80))); + p.drawLine(cancelRect.bottomLeft() + QPoint(2,-1), cancelRect.bottomRight() + QPoint(0,-1)); } } diff --git a/src/plugins/coreplugin/progressmanager/progressbar.h b/src/plugins/coreplugin/progressmanager/progressbar.h index caea7bafc0099534e785ad3e41258a000b298fc5..4b59e018747dc8c4d71b305c18c5fb17d7c782c9 100644 --- a/src/plugins/coreplugin/progressmanager/progressbar.h +++ b/src/plugins/coreplugin/progressmanager/progressbar.h @@ -38,6 +38,9 @@ class ProgressBar : public QWidget { Q_OBJECT + + Q_PROPERTY(float fader READ fader WRITE setFader) + public: ProgressBar(QWidget *parent = 0); ~ProgressBar(); @@ -50,13 +53,16 @@ public: QSize sizeHint() const; void paintEvent(QPaintEvent *); void mouseMoveEvent(QMouseEvent *); - int minimum() const { return m_minimum; } int maximum() const { return m_maximum; } int value() const { return m_value; } void reset(); void setRange(int minimum, int maximum); void setValue(int value); + float fader() { return m_fader; } + void setFader(float value) { m_fader = value; update(); } + bool event(QEvent *); + signals: void clicked(); @@ -69,10 +75,11 @@ private: QString m_title; bool m_error; int m_progressHeight; - int m_minimum; int m_maximum; int m_value; + float m_fader; + }; #endif // PROGRESSPIE_H