diff --git a/components/flatbutton.cpp b/components/flatbutton.cpp index 14c5cea..2a0b91b 100644 --- a/components/flatbutton.cpp +++ b/components/flatbutton.cpp @@ -14,7 +14,12 @@ FlatButtonPrivate::FlatButtonPrivate(FlatButton *q) role(Material::Default), rippleStyle(Material::PositionedRipple), cornerRadius(3), - bgMode(Qt::TransparentMode) + bgMode(Qt::TransparentMode), + peakOpacity(0.15) +{ +} + +FlatButtonPrivate::~FlatButtonPrivate() { } @@ -36,28 +41,22 @@ void FlatButtonPrivate::init() 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(); } -/* -void FlatButtonPrivate::setPaletteColor(QPalette::ColorGroup group, - QPalette::ColorRole role, - const QColor &color) -{ - Q_Q(FlatButton); - - QPalette palette(q->palette()); - palette.setColor(group, role, color); - q->setPalette(palette); - -// QPalette palette(q->palette()); -// Style &style = Style::instance(); -// -// palette.setColor(group, role, style.themeColor(themeColor)); -// -// q->setPalette(palette); -} -*/ - FlatButton::FlatButton(QWidget *parent) : QPushButton(parent), d_ptr(new FlatButtonPrivate(this)) @@ -122,6 +121,51 @@ Qt::BGMode FlatButton::bgMode() const 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); @@ -182,6 +226,21 @@ QColor FlatButton::disabledTextColor() const 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); @@ -232,7 +291,20 @@ void FlatButton::paintEvent(QPaintEvent *event) if (Qt::OpaqueMode == d->bgMode) { QBrush brush; brush.setStyle(Qt::SolidPattern); - brush.setColor(Qt::red); + 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); @@ -289,7 +361,8 @@ void FlatButton::mousePressEvent(QMouseEvent *event) QColor color = palette().color(QPalette::Active, QPalette::ButtonText); Ripple *ripple = new Ripple(Material::CenteredRipple == d->rippleStyle - ? rect().center() : event->pos()); + ? rect().center() + : event->pos()); ripple->setRadiusEndValue(100); ripple->setOpacityStartValue(0.4); diff --git a/components/flatbutton.h b/components/flatbutton.h index 45610e9..6311140 100644 --- a/components/flatbutton.h +++ b/components/flatbutton.h @@ -15,17 +15,21 @@ class FlatButton : public QPushButton Q_PROPERTY(Material::RippleStyle rippleStyle WRITE setRippleStyle READ rippleStyle) Q_PROPERTY(qreal cornerRadius WRITE setCornerRadius READ cornerRadius) Q_PROPERTY(Qt::BGMode bgMode WRITE setBgMode READ bgMode) + Q_PROPERTY(QColor primaryBgColor WRITE setPrimaryBgColor READ primaryBgColor) + Q_PROPERTY(QColor secondaryBgColor WRITE setSecondaryBgColor READ secondaryBgColor) + Q_PROPERTY(QColor defaultBgColor WRITE setDefaultBgColor READ defaultBgColor) Q_PROPERTY(QColor primaryTextColor WRITE setPrimaryTextColor READ primaryTextColor) Q_PROPERTY(QColor secondaryTextColor WRITE setSecondaryTextColor READ secondaryTextColor) Q_PROPERTY(QColor defaultTextColor WRITE setDefaultTextColor READ defaultTextColor) Q_PROPERTY(QColor disabledTextColor WRITE setDisabledTextColor READ disabledTextColor) + Q_PROPERTY(qreal peakOpacity WRITE setPeakOpacity READ peakOpacity) public: explicit FlatButton(QWidget *parent = 0); explicit FlatButton(const QString &text, QWidget *parent = 0); ~FlatButton(); - virtual void setRole(Material::Role role); + void setRole(Material::Role role); Material::Role role() const; void setRippleStyle(Material::RippleStyle style); @@ -37,6 +41,15 @@ public: void setBgMode(Qt::BGMode mode); Qt::BGMode bgMode() const; + void setPrimaryBgColor(const QColor &color); + QColor primaryBgColor() const; + + void setSecondaryBgColor(const QColor &color); + QColor secondaryBgColor() const; + + void setDefaultBgColor(const QColor &color); + QColor defaultBgColor() const; + void setPrimaryTextColor(const QColor &color); QColor primaryTextColor() const; @@ -49,6 +62,9 @@ public: void setDisabledTextColor(const QColor &color); QColor disabledTextColor() const; + void setPeakOpacity(qreal opacity); + qreal peakOpacity() const; + protected: FlatButton(FlatButtonPrivate &d, QWidget *parent = 0); diff --git a/components/flatbutton_internal.cpp b/components/flatbutton_internal.cpp index fe6f3ad..db30f11 100644 --- a/components/flatbutton_internal.cpp +++ b/components/flatbutton_internal.cpp @@ -19,8 +19,6 @@ FlatButtonDelegate::FlatButtonDelegate(FlatButton *parent) { setInitialState(_normalState); - updatePalette(); - addTransition(QEvent::Enter, _normalFocusedState, _hoveredFocusedState); addTransition(QEvent::FocusIn, _normalState, _normalFocusedState); addTransition(QEvent::FocusOut, _normalFocusedState, _normalState); @@ -124,6 +122,7 @@ void FlatButtonDelegate::updatePalette() QPalette palette(button->palette()); palette.setColor(QPalette::Active, QPalette::ButtonText, color); + palette.setColor(QPalette::Inactive, QPalette::ButtonText, color); palette.setColor(QPalette::Disabled, QPalette::ButtonText, button->disabledTextColor()); button->setPalette(palette); @@ -133,17 +132,17 @@ void FlatButtonDelegate::updatePalette() _normalFocusedState->assignProperty(this, "backgroundOpacity", 0); _normalFocusedState->assignProperty(this, "backgroundColor", color); - _normalFocusedState->assignProperty(this, "focusHaloOpacity", 0.15); + _normalFocusedState->assignProperty(this, "focusHaloOpacity", button->peakOpacity()); - _hoveredState->assignProperty(this, "backgroundOpacity", 0.15); + _hoveredState->assignProperty(this, "backgroundOpacity", button->peakOpacity()); _hoveredState->assignProperty(this, "backgroundColor", color); _hoveredState->assignProperty(this, "focusHaloOpacity", 0); - _hoveredFocusedState->assignProperty(this, "backgroundOpacity", 0.15); + _hoveredFocusedState->assignProperty(this, "backgroundOpacity", button->peakOpacity()); _hoveredFocusedState->assignProperty(this, "backgroundColor", color); - _normalFocusedState->assignProperty(this, "focusHaloOpacity", 0.15); + _normalFocusedState->assignProperty(this, "focusHaloOpacity", button->peakOpacity()); - _pressedState->assignProperty(this, "backgroundOpacity", 0.15); + _pressedState->assignProperty(this, "backgroundOpacity", button->peakOpacity()); _pressedState->assignProperty(this, "backgroundColor", color); _pressedState->assignProperty(this, "focusHaloOpacity", 0); diff --git a/components/flatbutton_p.h b/components/flatbutton_p.h index d45ba04..dac50c7 100644 --- a/components/flatbutton_p.h +++ b/components/flatbutton_p.h @@ -16,13 +16,10 @@ class FlatButtonPrivate public: FlatButtonPrivate(FlatButton *q); + virtual ~FlatButtonPrivate(); void init(); - /* - void setPaletteColor(QPalette::ColorGroup group, QPalette::ColorRole role, const QColor &color); - */ - FlatButton *const q_ptr; RippleOverlay *ripple; FlatButtonDelegate *delegate; @@ -34,6 +31,10 @@ public: QColor secondaryTextColor; QColor defaultTextColor; QColor disabledTextColor; + QColor primaryBgColor; + QColor secondaryBgColor; + QColor defaultBgColor; + qreal peakOpacity; }; #endif // FLATBUTTON_P_H diff --git a/components/raisedbutton.cpp b/components/raisedbutton.cpp index 302dc5f..23db32b 100644 --- a/components/raisedbutton.cpp +++ b/components/raisedbutton.cpp @@ -10,10 +10,23 @@ #include #include "raisedbutton_p.h" +RaisedButtonPrivate::RaisedButtonPrivate(RaisedButton *q) + : FlatButtonPrivate(q) +{ +} + +RaisedButtonPrivate::~RaisedButtonPrivate() +{ +} + void RaisedButtonPrivate::init() { Q_Q(RaisedButton); + q->setPrimaryTextColor(Qt::white); + q->setSecondaryTextColor(Qt::white); + q->setPeakOpacity(0.25); + QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect; effect->setBlurRadius(7); effect->setOffset(QPointF(0, 0)); @@ -97,33 +110,6 @@ RaisedButton::~RaisedButton() { } -void RaisedButton::setRole(Material::Role role) -{ - Q_D(FlatButton); - - d->role = role; - - /* - switch (role) - { - case Material::Primary: - d->setPaletteColor(QPalette::Active, QPalette::Background, "primary1"); - d->setPaletteColor(QPalette::Active, QPalette::ButtonText, "alternateText"); - break; - case Material::Secondary: - d->setPaletteColor(QPalette::Active, QPalette::Background, "accent1"); - d->setPaletteColor(QPalette::Active, QPalette::ButtonText, "alternateText"); - break; - default: - d->setPaletteColor(QPalette::Active, QPalette::Background, "canvas"); - d->setPaletteColor(QPalette::Active, QPalette::ButtonText, "text"); - break; - } - d->delegate->assignProperties(); - update(); - */ -} - bool RaisedButton::event(QEvent *event) { Q_D(RaisedButton); @@ -149,14 +135,26 @@ void RaisedButton::paintEvent(QPaintEvent *event) painter.save(); - QBrush brush; - const qreal cr = d->cornerRadius; + QColor bg; + switch (d->role) + { + case Material::Primary: + bg = d->primaryBgColor; + break; + case Material::Secondary: + bg = d->secondaryBgColor; + break; + case Material::Default: + default: + bg = d->defaultBgColor; + } + + QBrush brush; brush.setStyle(Qt::SolidPattern); brush.setColor(isEnabled() - ? palette().color(QPalette::Active, QPalette::Background) - : palette().color(QPalette::Disabled, QPalette::Background)); + ? bg : palette().color(QPalette::Disabled, QPalette::Background)); painter.setBrush(brush); painter.setPen(Qt::NoPen); painter.drawRoundedRect(rect(), cr, cr); diff --git a/components/raisedbutton.h b/components/raisedbutton.h index 357cd31..56da659 100644 --- a/components/raisedbutton.h +++ b/components/raisedbutton.h @@ -13,8 +13,6 @@ public: explicit RaisedButton(QWidget *parent = 0); ~RaisedButton(); - void setRole(Material::Role role) Q_DECL_OVERRIDE; - protected: bool event(QEvent *event) Q_DECL_OVERRIDE; void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; diff --git a/components/raisedbutton_p.h b/components/raisedbutton_p.h index cd5c205..00789ee 100644 --- a/components/raisedbutton_p.h +++ b/components/raisedbutton_p.h @@ -9,9 +9,8 @@ class RaisedButtonPrivate : public FlatButtonPrivate Q_DECLARE_PUBLIC(RaisedButton) public: - RaisedButtonPrivate(RaisedButton *q) - : FlatButtonPrivate(q) - {} + RaisedButtonPrivate(RaisedButton *q); + ~RaisedButtonPrivate(); void init(); diff --git a/components/sliderthumb.h b/components/sliderthumb.h index e4f0943..8e28c78 100644 --- a/components/sliderthumb.h +++ b/components/sliderthumb.h @@ -18,7 +18,7 @@ class SliderThumb : public QWidget public: explicit SliderThumb(Slider *slider); - ~SliderThumb(); + virutal ~SliderThumb(); inline void setDiameter(qreal diameter) { diff --git a/examples/flatbuttonexamples.cpp b/examples/flatbuttonexamples.cpp index 23af460..89db6ca 100644 --- a/examples/flatbuttonexamples.cpp +++ b/examples/flatbuttonexamples.cpp @@ -31,6 +31,73 @@ FlatButtonExamples::FlatButtonExamples(QWidget *parent) layout->addWidget(frame); } + { + FlatButton *flatButton = new FlatButton; + flatButton->setText("Press me!"); + flatButton->setMinimumSize(200, 42); + + flatButton->setRole(Material::Secondary); +// flatButton->setDisabled(true); + + ExampleView *view = new ExampleView; + view->setWidget(flatButton); + view->setBackgroundRole(QPalette::Base); + + Frame *frame = new Frame; + frame->setCodeSnippet( + "FlatButton *flatButton = new FlatButton;\n" + "flatButton->setText(\"Press me!\");" + ); + frame->setWidget(view); + + layout->addWidget(frame); + } + { + FlatButton *flatButton = new FlatButton; + flatButton->setText("Press me!"); + flatButton->setMinimumSize(200, 42); + + flatButton->setRole(Material::Primary); + flatButton->setBgMode(Qt::OpaqueMode); + flatButton->setPrimaryTextColor(Qt::white); + flatButton->setPeakOpacity(0.25); + + ExampleView *view = new ExampleView; + view->setWidget(flatButton); + view->setBackgroundRole(QPalette::Base); + + Frame *frame = new Frame; + frame->setCodeSnippet( + "FlatButton *flatButton = new FlatButton;\n" + "flatButton->setText(\"Press me!\");" + ); + frame->setWidget(view); + + layout->addWidget(frame); + } + { + FlatButton *flatButton = new FlatButton; + flatButton->setText("Press me!"); + flatButton->setMinimumSize(200, 42); + + flatButton->setRole(Material::Secondary); + flatButton->setBgMode(Qt::OpaqueMode); + flatButton->setSecondaryTextColor(Qt::white); + flatButton->setPeakOpacity(0.25); + + ExampleView *view = new ExampleView; + view->setWidget(flatButton); + view->setBackgroundRole(QPalette::Base); + + Frame *frame = new Frame; + frame->setCodeSnippet( + "FlatButton *flatButton = new FlatButton;\n" + "flatButton->setText(\"Press me!\");" + ); + frame->setWidget(view); + + layout->addWidget(frame); + } { FlatButton *flatButton = new FlatButton; flatButton->setText("Press me!"); diff --git a/examples/raisedbuttonexamples.cpp b/examples/raisedbuttonexamples.cpp index 6da577e..032a96d 100644 --- a/examples/raisedbuttonexamples.cpp +++ b/examples/raisedbuttonexamples.cpp @@ -7,6 +7,7 @@ RaisedButtonExamples::RaisedButtonExamples(QWidget *parent) : ExampleList(parent) { + QLayout *layout = widget()->layout(); RaisedButton *raisedButton = new RaisedButton; @@ -20,7 +21,6 @@ RaisedButtonExamples::RaisedButtonExamples(QWidget *parent) layout->addWidget(raisedButton); //layout->setAlignment(raisedButton, Qt::AlignHCenter); - QPushButton *pb = new QPushButton; pb->setText("Press me!");