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),
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);

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -10,10 +10,23 @@
#include <QDebug>
#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);

View File

@ -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;

View File

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

View File

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

View File

@ -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!");

View File

@ -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!");