refactor theming code

This commit is contained in:
laserpants 2016-05-31 02:08:52 +03:00
parent e3517e11d1
commit adfcfdc398
10 changed files with 224 additions and 73 deletions

View File

@ -14,7 +14,12 @@ FlatButtonPrivate::FlatButtonPrivate(FlatButton *q)
role(Material::Default), role(Material::Default),
rippleStyle(Material::PositionedRipple), rippleStyle(Material::PositionedRipple),
cornerRadius(3), 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.setPointSizeF(10.5);
font.setStyleName("Medium"); font.setStyleName("Medium");
q->setFont(font); 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) FlatButton::FlatButton(QWidget *parent)
: QPushButton(parent), : QPushButton(parent),
d_ptr(new FlatButtonPrivate(this)) d_ptr(new FlatButtonPrivate(this))
@ -122,6 +121,51 @@ Qt::BGMode FlatButton::bgMode() const
return d->bgMode; 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) void FlatButton::setPrimaryTextColor(const QColor &color)
{ {
Q_D(FlatButton); Q_D(FlatButton);
@ -182,6 +226,21 @@ QColor FlatButton::disabledTextColor() const
return d->disabledTextColor; 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) void FlatButton::setRole(Material::Role role)
{ {
Q_D(FlatButton); Q_D(FlatButton);
@ -232,7 +291,20 @@ void FlatButton::paintEvent(QPaintEvent *event)
if (Qt::OpaqueMode == d->bgMode) { if (Qt::OpaqueMode == d->bgMode) {
QBrush brush; QBrush brush;
brush.setStyle(Qt::SolidPattern); 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.setOpacity(1);
painter.setBrush(brush); painter.setBrush(brush);
painter.setPen(Qt::NoPen); painter.setPen(Qt::NoPen);
@ -289,7 +361,8 @@ void FlatButton::mousePressEvent(QMouseEvent *event)
QColor color = palette().color(QPalette::Active, QPalette::ButtonText); QColor color = palette().color(QPalette::Active, QPalette::ButtonText);
Ripple *ripple = new Ripple(Material::CenteredRipple == d->rippleStyle Ripple *ripple = new Ripple(Material::CenteredRipple == d->rippleStyle
? rect().center() : event->pos()); ? rect().center()
: event->pos());
ripple->setRadiusEndValue(100); ripple->setRadiusEndValue(100);
ripple->setOpacityStartValue(0.4); ripple->setOpacityStartValue(0.4);

View File

@ -15,17 +15,21 @@ class FlatButton : public QPushButton
Q_PROPERTY(Material::RippleStyle rippleStyle WRITE setRippleStyle READ rippleStyle) Q_PROPERTY(Material::RippleStyle rippleStyle WRITE setRippleStyle READ rippleStyle)
Q_PROPERTY(qreal cornerRadius WRITE setCornerRadius READ cornerRadius) Q_PROPERTY(qreal cornerRadius WRITE setCornerRadius READ cornerRadius)
Q_PROPERTY(Qt::BGMode bgMode WRITE setBgMode READ bgMode) 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 primaryTextColor WRITE setPrimaryTextColor READ primaryTextColor)
Q_PROPERTY(QColor secondaryTextColor WRITE setSecondaryTextColor READ secondaryTextColor) Q_PROPERTY(QColor secondaryTextColor WRITE setSecondaryTextColor READ secondaryTextColor)
Q_PROPERTY(QColor defaultTextColor WRITE setDefaultTextColor READ defaultTextColor) Q_PROPERTY(QColor defaultTextColor WRITE setDefaultTextColor READ defaultTextColor)
Q_PROPERTY(QColor disabledTextColor WRITE setDisabledTextColor READ disabledTextColor) Q_PROPERTY(QColor disabledTextColor WRITE setDisabledTextColor READ disabledTextColor)
Q_PROPERTY(qreal peakOpacity WRITE setPeakOpacity READ peakOpacity)
public: public:
explicit FlatButton(QWidget *parent = 0); explicit FlatButton(QWidget *parent = 0);
explicit FlatButton(const QString &text, QWidget *parent = 0); explicit FlatButton(const QString &text, QWidget *parent = 0);
~FlatButton(); ~FlatButton();
virtual void setRole(Material::Role role); void setRole(Material::Role role);
Material::Role role() const; Material::Role role() const;
void setRippleStyle(Material::RippleStyle style); void setRippleStyle(Material::RippleStyle style);
@ -37,6 +41,15 @@ public:
void setBgMode(Qt::BGMode mode); void setBgMode(Qt::BGMode mode);
Qt::BGMode bgMode() const; 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); void setPrimaryTextColor(const QColor &color);
QColor primaryTextColor() const; QColor primaryTextColor() const;
@ -49,6 +62,9 @@ public:
void setDisabledTextColor(const QColor &color); void setDisabledTextColor(const QColor &color);
QColor disabledTextColor() const; QColor disabledTextColor() const;
void setPeakOpacity(qreal opacity);
qreal peakOpacity() const;
protected: protected:
FlatButton(FlatButtonPrivate &d, QWidget *parent = 0); FlatButton(FlatButtonPrivate &d, QWidget *parent = 0);

View File

@ -19,8 +19,6 @@ FlatButtonDelegate::FlatButtonDelegate(FlatButton *parent)
{ {
setInitialState(_normalState); setInitialState(_normalState);
updatePalette();
addTransition(QEvent::Enter, _normalFocusedState, _hoveredFocusedState); addTransition(QEvent::Enter, _normalFocusedState, _hoveredFocusedState);
addTransition(QEvent::FocusIn, _normalState, _normalFocusedState); addTransition(QEvent::FocusIn, _normalState, _normalFocusedState);
addTransition(QEvent::FocusOut, _normalFocusedState, _normalState); addTransition(QEvent::FocusOut, _normalFocusedState, _normalState);
@ -124,6 +122,7 @@ void FlatButtonDelegate::updatePalette()
QPalette palette(button->palette()); QPalette palette(button->palette());
palette.setColor(QPalette::Active, QPalette::ButtonText, color); palette.setColor(QPalette::Active, QPalette::ButtonText, color);
palette.setColor(QPalette::Inactive, QPalette::ButtonText, color);
palette.setColor(QPalette::Disabled, QPalette::ButtonText, button->disabledTextColor()); palette.setColor(QPalette::Disabled, QPalette::ButtonText, button->disabledTextColor());
button->setPalette(palette); button->setPalette(palette);
@ -133,17 +132,17 @@ void FlatButtonDelegate::updatePalette()
_normalFocusedState->assignProperty(this, "backgroundOpacity", 0); _normalFocusedState->assignProperty(this, "backgroundOpacity", 0);
_normalFocusedState->assignProperty(this, "backgroundColor", color); _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, "backgroundColor", color);
_hoveredState->assignProperty(this, "focusHaloOpacity", 0); _hoveredState->assignProperty(this, "focusHaloOpacity", 0);
_hoveredFocusedState->assignProperty(this, "backgroundOpacity", 0.15); _hoveredFocusedState->assignProperty(this, "backgroundOpacity", button->peakOpacity());
_hoveredFocusedState->assignProperty(this, "backgroundColor", color); _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, "backgroundColor", color);
_pressedState->assignProperty(this, "focusHaloOpacity", 0); _pressedState->assignProperty(this, "focusHaloOpacity", 0);

View File

@ -16,13 +16,10 @@ class FlatButtonPrivate
public: public:
FlatButtonPrivate(FlatButton *q); FlatButtonPrivate(FlatButton *q);
virtual ~FlatButtonPrivate();
void init(); void init();
/*
void setPaletteColor(QPalette::ColorGroup group, QPalette::ColorRole role, const QColor &color);
*/
FlatButton *const q_ptr; FlatButton *const q_ptr;
RippleOverlay *ripple; RippleOverlay *ripple;
FlatButtonDelegate *delegate; FlatButtonDelegate *delegate;
@ -34,6 +31,10 @@ public:
QColor secondaryTextColor; QColor secondaryTextColor;
QColor defaultTextColor; QColor defaultTextColor;
QColor disabledTextColor; QColor disabledTextColor;
QColor primaryBgColor;
QColor secondaryBgColor;
QColor defaultBgColor;
qreal peakOpacity;
}; };
#endif // FLATBUTTON_P_H #endif // FLATBUTTON_P_H

View File

@ -10,10 +10,23 @@
#include <QDebug> #include <QDebug>
#include "raisedbutton_p.h" #include "raisedbutton_p.h"
RaisedButtonPrivate::RaisedButtonPrivate(RaisedButton *q)
: FlatButtonPrivate(q)
{
}
RaisedButtonPrivate::~RaisedButtonPrivate()
{
}
void RaisedButtonPrivate::init() void RaisedButtonPrivate::init()
{ {
Q_Q(RaisedButton); Q_Q(RaisedButton);
q->setPrimaryTextColor(Qt::white);
q->setSecondaryTextColor(Qt::white);
q->setPeakOpacity(0.25);
QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect; QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect;
effect->setBlurRadius(7); effect->setBlurRadius(7);
effect->setOffset(QPointF(0, 0)); 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) bool RaisedButton::event(QEvent *event)
{ {
Q_D(RaisedButton); Q_D(RaisedButton);
@ -149,14 +135,26 @@ void RaisedButton::paintEvent(QPaintEvent *event)
painter.save(); painter.save();
QBrush brush;
const qreal cr = d->cornerRadius; 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.setStyle(Qt::SolidPattern);
brush.setColor(isEnabled() brush.setColor(isEnabled()
? palette().color(QPalette::Active, QPalette::Background) ? bg : palette().color(QPalette::Disabled, QPalette::Background));
: palette().color(QPalette::Disabled, QPalette::Background));
painter.setBrush(brush); painter.setBrush(brush);
painter.setPen(Qt::NoPen); painter.setPen(Qt::NoPen);
painter.drawRoundedRect(rect(), cr, cr); painter.drawRoundedRect(rect(), cr, cr);

View File

@ -13,8 +13,6 @@ public:
explicit RaisedButton(QWidget *parent = 0); explicit RaisedButton(QWidget *parent = 0);
~RaisedButton(); ~RaisedButton();
void setRole(Material::Role role) Q_DECL_OVERRIDE;
protected: protected:
bool event(QEvent *event) Q_DECL_OVERRIDE; bool event(QEvent *event) Q_DECL_OVERRIDE;
void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;

View File

@ -9,9 +9,8 @@ class RaisedButtonPrivate : public FlatButtonPrivate
Q_DECLARE_PUBLIC(RaisedButton) Q_DECLARE_PUBLIC(RaisedButton)
public: public:
RaisedButtonPrivate(RaisedButton *q) RaisedButtonPrivate(RaisedButton *q);
: FlatButtonPrivate(q) ~RaisedButtonPrivate();
{}
void init(); void init();

View File

@ -18,7 +18,7 @@ class SliderThumb : public QWidget
public: public:
explicit SliderThumb(Slider *slider); explicit SliderThumb(Slider *slider);
~SliderThumb(); virutal ~SliderThumb();
inline void setDiameter(qreal diameter) inline void setDiameter(qreal diameter)
{ {

View File

@ -31,6 +31,73 @@ FlatButtonExamples::FlatButtonExamples(QWidget *parent)
layout->addWidget(frame); 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 *flatButton = new FlatButton;
flatButton->setText("Press me!"); flatButton->setText("Press me!");

View File

@ -7,6 +7,7 @@
RaisedButtonExamples::RaisedButtonExamples(QWidget *parent) RaisedButtonExamples::RaisedButtonExamples(QWidget *parent)
: ExampleList(parent) : ExampleList(parent)
{ {
QLayout *layout = widget()->layout(); QLayout *layout = widget()->layout();
RaisedButton *raisedButton = new RaisedButton; RaisedButton *raisedButton = new RaisedButton;
@ -20,7 +21,6 @@ RaisedButtonExamples::RaisedButtonExamples(QWidget *parent)
layout->addWidget(raisedButton); layout->addWidget(raisedButton);
//layout->setAlignment(raisedButton, Qt::AlignHCenter); //layout->setAlignment(raisedButton, Qt::AlignHCenter);
QPushButton *pb = new QPushButton; QPushButton *pb = new QPushButton;
pb->setText("Press me!"); pb->setText("Press me!");