123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- #include "qtmaterialtabs_internal.h"
- #include <QPainter>
- #include <QPropertyAnimation>
- #include <QtWidgets/QLayout>
- #include <QtWidgets/QLayoutItem>
- #include <QEvent>
- #include "qtmaterialtabs.h"
- #include <QDebug>
- /*!
- * \class QtMaterialTabsInkBar
- * \internal
- */
- QtMaterialTabsInkBar::QtMaterialTabsInkBar(QtMaterialTabs *parent)
- : QtMaterialOverlayWidget(parent),
- m_tabs(parent),
- m_animation(new QPropertyAnimation(parent)),
- m_tween(0)
- {
- Q_ASSERT(parent);
- m_animation->setPropertyName("tweenValue");
- m_animation->setEasingCurve(QEasingCurve::OutCirc);
- m_animation->setTargetObject(this);
- m_animation->setDuration(700);
- m_tabs->installEventFilter(this);
- setAttribute(Qt::WA_TransparentForMouseEvents);
- setAttribute(Qt::WA_NoSystemBackground);
- }
- QtMaterialTabsInkBar::~QtMaterialTabsInkBar()
- {
- }
- void QtMaterialTabsInkBar::refreshGeometry()
- {
- QLayoutItem *item = m_tabs->layout()->itemAt(m_tabs->currentIndex());
- if (item)
- {
- const QRect r(item->geometry());
- const qreal s = 1-m_tween;
- if (QAbstractAnimation::Running != m_animation->state()) {
- m_geometry = QRect(r.left(), r.bottom()-1, r.width(), 2);
- } else {
- const qreal left = m_previousGeometry.left()*s + r.left()*m_tween;
- const qreal width = m_previousGeometry.width()*s + r.width()*m_tween;
- m_geometry = QRect(left, r.bottom()-1, width, 2);
- }
- m_tabs->update();
- }
- }
- void QtMaterialTabsInkBar::animate()
- {
- raise();
- m_previousGeometry = m_geometry;
- m_animation->stop();
- m_animation->setStartValue(0);
- m_animation->setEndValue(1);
- m_animation->start();
- }
- bool QtMaterialTabsInkBar::eventFilter(QObject *obj, QEvent *event)
- {
- switch (event->type())
- {
- case QEvent::Move:
- case QEvent::Resize:
- {
- refreshGeometry();
- break;
- }
- default:
- break;
- }
- return QtMaterialOverlayWidget::eventFilter(obj, event);
- }
- void QtMaterialTabsInkBar::paintEvent(QPaintEvent *event)
- {
- Q_UNUSED(event)
- QPainter painter(this);
- painter.setOpacity(1);
- painter.fillRect(m_geometry, m_tabs->inkColor());
- }
- /*!
- * \class QtMaterialTab
- * \internal
- */
- QtMaterialTab::QtMaterialTab(QtMaterialTabs *parent)
- : QtMaterialFlatButton(parent),
- m_tabs(parent),
- m_active(false)
- {
- Q_ASSERT(parent);
- setMinimumHeight(50);
- QFont f(font());
- f.setStyleName("Normal");
- setFont(f);
- setCornerRadius(0);
- setRole(Material::Primary);
- setBackgroundMode(Qt::OpaqueMode);
- setBaseOpacity(0.25);
- connect(this, SIGNAL(clicked(bool)), this, SLOT(activateTab()));
- }
- QtMaterialTab::~QtMaterialTab()
- {
- }
- QSize QtMaterialTab::sizeHint() const
- {
- if (icon().isNull()) {
- return QtMaterialFlatButton::sizeHint();
- } else {
- return QSize(40, iconSize().height()+46);
- }
- }
- void QtMaterialTab::activateTab()
- {
- m_tabs->setCurrentTab(this);
- }
- void QtMaterialTab::paintForeground(QPainter *painter)
- {
- painter->setPen(foregroundColor());
- if (!icon().isNull()) {
- painter->translate(0, 12);
- }
- QSize textSize(fontMetrics().size(Qt::TextSingleLine, text()));
- QSize base(size()-textSize);
- QRect textGeometry(QPoint(base.width(), base.height())/2, textSize);
- painter->drawText(textGeometry, Qt::AlignCenter, text());
- if (!icon().isNull())
- {
- const QSize &size = iconSize();
- QRect iconRect(QPoint((width()-size.width())/2, 0), size);
- QPixmap pixmap = icon().pixmap(iconSize());
- QPainter icon(&pixmap);
- icon.setCompositionMode(QPainter::CompositionMode_SourceIn);
- icon.fillRect(pixmap.rect(), painter->pen().color());
- painter->drawPixmap(iconRect, pixmap);
- }
- if (!m_active)
- {
- if (!icon().isNull()) {
- painter->translate(0, -12);
- }
- QBrush overlay;
- overlay.setStyle(Qt::SolidPattern);
- overlay.setColor(backgroundColor());
- painter->setOpacity(0.36);
- painter->fillRect(rect(), overlay);
- }
- }
|