diff --git a/src/plugins/coreplugin/fancyactionbar.cpp b/src/plugins/coreplugin/fancyactionbar.cpp index 815075d725f5cfa7691f81abb1707207ac6d180a..c62e695d88d47d96fedb0f86d40ce22f093754e9 100644 --- a/src/plugins/coreplugin/fancyactionbar.cpp +++ b/src/plugins/coreplugin/fancyactionbar.cpp @@ -116,19 +116,19 @@ void FancyToolButton::paintEvent(QPaintEvent *event) if (isDown() || isChecked()) { painter.save(); - QColor whiteOverlay(Qt::black); - whiteOverlay.setAlpha(30); + QColor color(Qt::black); + color.setAlpha(15); QRect roundRect = rect().adjusted(5, 3, -5, -3); painter.translate(0.5, 0.5); painter.setRenderHint(QPainter::Antialiasing); - painter.setPen(QColor(255, 255, 255, 40)); + painter.setPen(QColor(255, 255, 255, 20)); static int rounding = 3; painter.drawRoundedRect(roundRect.adjusted(-1, -1, 1, 1), rounding, rounding); - painter.setPen(QColor(0, 0, 0, 40)); - painter.setBrush(QColor(0, 0, 0, 30)); + painter.setPen(QColor(0, 0, 0, 20)); + painter.setBrush(QColor(0, 0, 0, 15)); painter.drawRoundedRect(roundRect.adjusted(1, 1, 0, 0), rounding, rounding); - whiteOverlay.setAlpha(150); - painter.setPen(whiteOverlay); + color.setAlpha(75); + painter.setPen(color); painter.setBrush(Qt::NoBrush); painter.drawRoundedRect(roundRect, 3, 3); painter.restore(); diff --git a/src/plugins/coreplugin/fancytabwidget.cpp b/src/plugins/coreplugin/fancytabwidget.cpp index 7e97c07239c5d14d706648d8b38fd076c7747369..e63dd9e1ed1db49d6388def7c491a20e1d450c2e 100644 --- a/src/plugins/coreplugin/fancytabwidget.cpp +++ b/src/plugins/coreplugin/fancytabwidget.cpp @@ -53,6 +53,24 @@ using namespace Internal; const int FancyTabBar::m_rounding = 22; const int FancyTabBar::m_textPadding = 4; +void FancyTab::fadeIn() +{ + QPropertyAnimation *animation; + animation = new QPropertyAnimation(this, "fader"); + animation->setDuration(160); + animation->setEndValue(25); + animation->start(QAbstractAnimation::DeleteWhenStopped); +} + +void FancyTab::fadeOut() +{ + QPropertyAnimation *animation; + animation = new QPropertyAnimation(this, "fader"); + animation->setDuration(225); + animation->setEndValue(0); + animation->start(QAbstractAnimation::DeleteWhenStopped); +} + FancyTabBar::FancyTabBar(QWidget *parent) : QWidget(parent) { @@ -63,10 +81,6 @@ FancyTabBar::FancyTabBar(QWidget *parent) setMinimumWidth(qMax(2 * m_rounding, 40)); setAttribute(Qt::WA_Hover, true); setFocusPolicy(Qt::NoFocus); - m_hoverControl.setFrameRange(0, 20); - m_hoverControl.setDuration(130); - m_hoverControl.setCurveShape(QTimeLine::EaseInCurve); - connect(&m_hoverControl, SIGNAL(frameChanged(int)), this, SLOT(updateHover())); setMouseTracking(true); // Needed for hover events } @@ -115,15 +129,15 @@ void FancyTabBar::mouseMoveEvent(QMouseEvent *e) } } - m_hoverControl.stop(); + if (validIndex(m_hoverIndex)) + m_tabs[m_hoverIndex]->fadeOut(); + m_hoverIndex = newHover; - update(m_hoverRect); - m_hoverRect = QRect(); - if (m_hoverIndex >=0) { + if (validIndex(m_hoverIndex)) { + m_tabs[m_hoverIndex]->fadeIn(); QRect oldHoverRect = m_hoverRect; m_hoverRect = tabRect(m_hoverIndex); - m_hoverControl.start(); } } } @@ -131,7 +145,7 @@ void FancyTabBar::mouseMoveEvent(QMouseEvent *e) bool FancyTabBar::event(QEvent *event) { if (event->type() == QEvent::ToolTip) { - if (m_hoverIndex >= 0 && m_hoverIndex < m_tabs.count()) { + if (validIndex(m_hoverIndex)) { QString tt = tabToolTip(m_hoverIndex); if (!tt.isEmpty()) { QToolTip::showText(static_cast<QHelpEvent*>(event)->globalPos(), tt, this); @@ -159,10 +173,14 @@ void FancyTabBar::enterEvent(QEvent *e) void FancyTabBar::leaveEvent(QEvent *e) { Q_UNUSED(e) - if (m_hoverIndex >= 0) { + if (validIndex(m_hoverIndex)) { m_hoverIndex = -1; update(m_hoverRect); m_hoverRect = QRect(); + for (int i = 0 ; i < m_tabs.count() ; ++i) { + if (m_tabs[i]->fader() > 0) + m_tabs[i]->fadeOut(); + } } } @@ -202,11 +220,14 @@ void FancyTabBar::mousePressEvent(QMouseEvent *e) void FancyTabBar::paintTab(QPainter *painter, int tabIndex) const { + if (!validIndex(tabIndex)) { + qWarning("invalid index"); + return; + } painter->save(); QRect rect = tabRect(tabIndex); bool selected = (tabIndex == m_currentIndex); - bool hover = (tabIndex == m_hoverIndex); bool enabled = isTabEnabled(tabIndex); #ifdef Q_WS_MAC @@ -214,8 +235,7 @@ void FancyTabBar::paintTab(QPainter *painter, int tabIndex) const #endif QColor hoverColor; - if (hover) - hoverColor = QColor(255, 255, 255, m_hoverControl.currentFrame()); + hoverColor = QColor(255, 255, 255, m_tabs[tabIndex]->fader()); if (selected) { //background @@ -245,8 +265,19 @@ void FancyTabBar::paintTab(QPainter *painter, int tabIndex) const painter->setPen(QColor(255, 255, 255, 50)); painter->drawLine(rect.bottomLeft() + QPoint(0,1), rect.bottomRight() + QPoint(0,1)); } else { - if (hover && enabled) - painter->fillRect(rect, hoverColor); + if (enabled) { + painter->save(); + QColor whiteOverlay(Qt::white); + whiteOverlay.setAlpha(int(m_tabs[tabIndex]->fader()/2)); + QRect roundRect = rect.adjusted(5, 3, -5, -3); + painter->translate(0.5, 0.5); + painter->setRenderHint(QPainter::Antialiasing); + painter->setBrush(whiteOverlay); + whiteOverlay.setAlpha(int(m_tabs[tabIndex]->fader())); + painter->setPen(whiteOverlay); + painter->drawRoundedRect(roundRect, 3, 3); + painter->restore(); + } } QString tabText(this->tabText(tabIndex)); @@ -291,7 +322,7 @@ void FancyTabBar::setTabEnabled(int index, bool enable) Q_ASSERT(index >= 0); if (index < m_tabs.size() && index >= 0) { - m_tabs[index].enabled = enable; + m_tabs[index]->enabled = enable; update(tabRect(index)); } } @@ -302,7 +333,7 @@ bool FancyTabBar::isTabEnabled(int index) const Q_ASSERT(index >= 0); if (index < m_tabs.size() && index >= 0) - return m_tabs[index].enabled; + return m_tabs[index]->enabled; return false; } diff --git a/src/plugins/coreplugin/fancytabwidget.h b/src/plugins/coreplugin/fancytabwidget.h index cb689b1c00c87754065db887239e3352e303e2fe..7f5146721e29d721a2c077bf428499cf631578fe 100644 --- a/src/plugins/coreplugin/fancytabwidget.h +++ b/src/plugins/coreplugin/fancytabwidget.h @@ -44,12 +44,26 @@ QT_END_NAMESPACE namespace Core { namespace Internal { - struct FancyTab{ - QIcon icon; - QString text; - QString toolTip; - bool enabled; - }; +class FancyTab : public QObject{ + Q_OBJECT + + Q_PROPERTY(float fader READ fader WRITE setFader) +public: + FancyTab(QWidget *tabbar) : enabled(false), tabbar(tabbar), m_fader(0) {} + float fader() { return m_fader; } + void setFader(float value) { m_fader = value; tabbar->update(); } + + void fadeIn(); + void fadeOut(); + + QIcon icon; + QString text; + QString toolTip; + bool enabled; +private: + QWidget *tabbar; + float m_fader; +}; class FancyTabBar : public QWidget { @@ -67,6 +81,7 @@ public: void mouseMoveEvent(QMouseEvent *); void enterEvent(QEvent *); void leaveEvent(QEvent *); + bool validIndex(int index) const { return index >= 0 && index < m_tabs.count(); } QSize sizeHint() const; QSize minimumSizeHint() const; @@ -75,24 +90,24 @@ public: bool isTabEnabled(int index) const; void insertTab(int index, const QIcon &icon, const QString &label) { - FancyTab tab; - tab.enabled = true; - tab.icon = icon; - tab.text = label; + FancyTab *tab = new FancyTab(this); + tab->icon = icon; + tab->text = label; m_tabs.insert(index, tab); } void setEnabled(int index, bool enabled); void removeTab(int index) { - m_tabs.removeAt(index); + FancyTab *tab = m_tabs.takeAt(index); + delete tab; } void setCurrentIndex(int index); int currentIndex() const { return m_currentIndex; } - void setTabToolTip(int index, QString toolTip) { m_tabs[index].toolTip = toolTip; } - QString tabToolTip(int index) const { return m_tabs.at(index).toolTip; } + void setTabToolTip(int index, QString toolTip) { m_tabs[index]->toolTip = toolTip; } + QString tabToolTip(int index) const { return m_tabs.at(index)->toolTip; } - QIcon tabIcon(int index) const {return m_tabs.at(index).icon; } - QString tabText(int index) const { return m_tabs.at(index).text; } + QIcon tabIcon(int index) const {return m_tabs.at(index)->icon; } + QString tabText(int index) const { return m_tabs.at(index)->text; } int count() const {return m_tabs.count(); } QRect tabRect(int index) const; @@ -105,11 +120,10 @@ public slots: private: static const int m_rounding; static const int m_textPadding; - QTimeLine m_hoverControl; QRect m_hoverRect; int m_hoverIndex; int m_currentIndex; - QList<FancyTab> m_tabs; + QList<FancyTab*> m_tabs; QSize tabSizeHint(bool minimum = false) const;