#include "flatbutton.h" #include #include #include #include #include #include #include "lib/rippleoverlay.h" #include "lib/ripple.h" #include "flatbutton_p.h" FlatButtonPrivate::FlatButtonPrivate(FlatButton *q) : q_ptr(q), role(Material::Default), rippleStyle(Material::PositionedRipple), cornerRadius(3), bgMode(Qt::TransparentMode), peakOpacity(0.15) { } FlatButtonPrivate::~FlatButtonPrivate() { } void FlatButtonPrivate::init() { Q_Q(FlatButton); ripple = new RippleOverlay(q); delegate = new FlatButtonDelegate(q); Style &style = Style::instance(); q->setStyle(&style); q->setAttribute(Qt::WA_Hover); q->setMouseTracking(true); QFont font(q->font()); font.setCapitalization(QFont::AllUppercase); font.setPointSizeF(10.5); font.setStyleName("Medium"); q->setFont(font); // Apply theme style q->setPrimaryBgColor(style.themeColor("primary1")); q->setSecondaryBgColor(style.themeColor("accent1")); q->setDefaultBgColor(style.themeColor("text")); q->setPrimaryTextColor(style.themeColor("primary1")); q->setSecondaryTextColor(style.themeColor("accent1")); q->setDefaultTextColor(style.themeColor("text")); q->setDisabledTextColor(style.themeColor("disabled")); delegate->updatePalette(); } FlatButton::FlatButton(QWidget *parent) : QPushButton(parent), d_ptr(new FlatButtonPrivate(this)) { d_func()->init(); } FlatButton::FlatButton(const QString &text, QWidget *parent) : QPushButton(parent), d_ptr(new FlatButtonPrivate(this)) { d_func()->init(); setText(text); } FlatButton::~FlatButton() { } void FlatButton::setRippleStyle(Material::RippleStyle style) { Q_D(FlatButton); d->rippleStyle = style; } Material::RippleStyle FlatButton::rippleStyle() const { Q_D(const FlatButton); return d->rippleStyle; } void FlatButton::setCornerRadius(qreal radius) { Q_D(FlatButton); d->cornerRadius = radius; update(); } qreal FlatButton::cornerRadius() const { Q_D(const FlatButton); return d->cornerRadius; } void FlatButton::setBgMode(Qt::BGMode mode) { Q_D(FlatButton); d->bgMode = mode; update(); } Qt::BGMode FlatButton::bgMode() const { Q_D(const FlatButton); return d->bgMode; } void FlatButton::setPrimaryBgColor(const QColor &color) { Q_D(FlatButton); d->primaryBgColor = color; d->delegate->updatePalette(); } QColor FlatButton::primaryBgColor() const { Q_D(const FlatButton); return d->primaryBgColor; } void FlatButton::setSecondaryBgColor(const QColor &color) { Q_D(FlatButton); d->secondaryBgColor = color; d->delegate->updatePalette(); } QColor FlatButton::secondaryBgColor() const { Q_D(const FlatButton); return d->secondaryBgColor; } void FlatButton::setDefaultBgColor(const QColor &color) { Q_D(FlatButton); d->defaultBgColor = color; d->delegate->updatePalette(); } QColor FlatButton::defaultBgColor() const { Q_D(const FlatButton); return d->defaultBgColor; } void FlatButton::setPrimaryTextColor(const QColor &color) { Q_D(FlatButton); d->primaryTextColor = color; d->delegate->updatePalette(); } QColor FlatButton::primaryTextColor() const { Q_D(const FlatButton); return d->primaryTextColor; } void FlatButton::setSecondaryTextColor(const QColor &color) { Q_D(FlatButton); d->secondaryTextColor = color; d->delegate->updatePalette(); } QColor FlatButton::secondaryTextColor() const { Q_D(const FlatButton); return d->secondaryTextColor; } void FlatButton::setDefaultTextColor(const QColor &color) { Q_D(FlatButton); d->defaultTextColor = color; d->delegate->updatePalette(); } QColor FlatButton::defaultTextColor() const { Q_D(const FlatButton); return d->defaultTextColor; } void FlatButton::setDisabledTextColor(const QColor &color) { Q_D(FlatButton); d->disabledTextColor = color; d->delegate->updatePalette(); } QColor FlatButton::disabledTextColor() const { Q_D(const FlatButton); return d->disabledTextColor; } void FlatButton::setPeakOpacity(qreal opacity) { Q_D(FlatButton); d->peakOpacity = opacity; d->delegate->updatePalette(); } qreal FlatButton::peakOpacity() const { Q_D(const FlatButton); return d->peakOpacity; } void FlatButton::setRole(Material::Role role) { Q_D(FlatButton); d->role = role; d->delegate->updatePalette(); } Material::Role FlatButton::role() const { Q_D(const FlatButton); return d->role; } FlatButton::FlatButton(FlatButtonPrivate &d, QWidget *parent) : QPushButton(parent), d_ptr(&d) { d_func()->init(); } void FlatButton::resizeEvent(QResizeEvent *event) { Q_D(FlatButton); if (d->ripple) { d->ripple->setGeometry(rect()); } QPushButton::resizeEvent(event); } void FlatButton::paintEvent(QPaintEvent *event) { Q_UNUSED(event) Q_D(FlatButton); const qreal bgOpacity = d->delegate->backgroundOpacity(); const qreal haloOpacity = d->delegate->focusHaloOpacity(); const qreal hs = static_cast(width())*d->delegate->focusHaloSize()/2; const qreal cr = d->cornerRadius; QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); if (Qt::OpaqueMode == d->bgMode) { QBrush brush; brush.setStyle(Qt::SolidPattern); QColor color; switch (d->role) { case Material::Primary: color = d->primaryBgColor; break; case Material::Secondary: color = d->secondaryBgColor; break; case Material::Default: default: color = d->defaultBgColor; } brush.setColor(color); painter.setOpacity(1); painter.setBrush(brush); painter.setPen(Qt::NoPen); painter.drawRoundedRect(rect(), cr, cr); } if (isEnabled() && bgOpacity > 0) { QBrush brush; brush.setStyle(Qt::SolidPattern); brush.setColor(d->delegate->backgroundColor()); painter.setOpacity(bgOpacity); painter.setBrush(brush); painter.setPen(Qt::NoPen); painter.drawRoundedRect(rect(), cr, cr); } if (isEnabled() && haloOpacity > 0) { QBrush brush; brush.setStyle(Qt::SolidPattern); brush.setColor(palette().color(QPalette::Active, QPalette::ButtonText)); painter.setOpacity(haloOpacity); painter.setBrush(brush); painter.setPen(Qt::NoPen); QPointF center = rect().center(); painter.drawEllipse(center, hs, hs); } QStylePainter style(this); QStyleOptionButton option; initStyleOption(&option); option.features |= QStyleOptionButton::Flat; style.drawControl(QStyle::CE_PushButtonLabel, option); #ifdef DEBUG_LAYOUT QPainter debug(this); QPen pen; pen.setColor(Qt::red); pen.setWidth(2); debug.setPen(pen); debug.drawRect(rect()); #endif } void FlatButton::mousePressEvent(QMouseEvent *event) { Q_D(FlatButton); if (Material::NoRipple == d->rippleStyle) { return; } QColor color = palette().color(QPalette::Active, QPalette::ButtonText); Ripple *ripple = new Ripple(Material::CenteredRipple == d->rippleStyle ? rect().center() : event->pos()); ripple->setRadiusEndValue(100); ripple->setOpacityStartValue(0.4); ripple->setColor(color); d->ripple->addRipple(ripple); QPushButton::mousePressEvent(event); }