Improve the style of snackbar a bit

This commit is contained in:
Konstantinos Sideris 2018-07-25 23:07:56 +03:00
parent 8386dd73ce
commit 1f47a6af3a
6 changed files with 63 additions and 54 deletions

View file

@ -233,3 +233,8 @@ Toggle {
qproperty-inactiveColor: gray; qproperty-inactiveColor: gray;
qproperty-trackColor: rgb(240, 240, 240); qproperty-trackColor: rgb(240, 240, 240);
} }
SnackBar {
qproperty-textColor: #caccd1;
qproperty-bgColor: #202228;
}

View file

@ -221,3 +221,8 @@ Toggle {
qproperty-inactiveColor: gray; qproperty-inactiveColor: gray;
qproperty-trackColor: rgb(240, 240, 240); qproperty-trackColor: rgb(240, 240, 240);
} }
SnackBar {
qproperty-textColor: white;
qproperty-bgColor: #495057;
}

View file

@ -14,6 +14,11 @@ OverlayWidget > * {
border-left: 1px solid palette(text); border-left: 1px solid palette(text);
} }
TopRoomBar {
qproperty-borderColor: palette(text);
border: none;
}
TimelineView, TimelineView,
TimelineView > *, TimelineView > *,
TimelineItem, TimelineItem,
@ -150,3 +155,8 @@ QListWidget {
background-color: palette(window); background-color: palette(window);
color: palette(text); color: palette(text);
} }
SnackBar {
qproperty-textColor: palette(text);
qproperty-bgColor: palette(base);
}

View file

@ -79,8 +79,7 @@ protected:
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
p.setPen(QPen(borderColor())); p.setPen(QPen(borderColor()));
p.drawLine(QPointF(0, height() - p.pen().widthF()), p.drawLine(QPointF(0, height()), QPointF(width(), height()));
QPointF(width(), height() - p.pen().widthF()));
} }
private: private:

View file

@ -1,4 +1,3 @@
#include <QDebug>
#include <QPainter> #include <QPainter>
#include <tweeny/tweeny.h> #include <tweeny/tweeny.h>
@ -6,35 +5,33 @@
#include "SnackBar.h" #include "SnackBar.h"
constexpr int STARTING_OFFSET = 1; constexpr int STARTING_OFFSET = 1;
constexpr int ANIMATION_DURATION = 6'000;
constexpr int BOX_PADDING = 10;
constexpr double MIN_WIDTH = 400.0;
constexpr double MIN_WIDTH_PERCENTAGE = 0.3;
SnackBar::SnackBar(QWidget *parent) SnackBar::SnackBar(QWidget *parent)
: OverlayWidget(parent) : OverlayWidget(parent)
{ {
bgOpacity_ = 0.9; QFont font;
duration_ = 6000; font.setPointSizeF(font.pointSizeF() * 1.2);
boxWidth_ = 400;
boxHeight_ = 40;
boxPadding_ = 10;
textColor_ = QColor("white");
bgColor_ = QColor("#333");
offset_ = STARTING_OFFSET;
position_ = SnackBarPosition::Top;
QFont font("Open Sans");
font.setPixelSize(14);
font.setWeight(50); font.setWeight(50);
setFont(font); setFont(font);
boxHeight_ = QFontMetrics(font).height() * 2;
offset_ = STARTING_OFFSET;
position_ = SnackBarPosition::Top;
hideTimer_.setSingleShot(true); hideTimer_.setSingleShot(true);
auto offset_anim = tweeny::from(1.0f).to(0.0f).during(100).via(tweeny::easing::cubicOut); auto offset_anim = tweeny::from(1.0f).to(0.0f).during(100).via(tweeny::easing::cubicOut);
connect(&showTimer_, &QTimer::timeout, this, [this, offset_anim]() mutable { connect(&showTimer_, &QTimer::timeout, this, [this, offset_anim]() mutable {
if (offset_anim.progress() < 1.0f) { if (offset_anim.progress() < 1.0f) {
offset_ = offset_anim.step(0.07f); offset_ = offset_anim.step(0.07f);
update(); repaint();
} else { } else {
showTimer_.stop(); showTimer_.stop();
hideTimer_.start(duration_); hideTimer_.start(ANIMATION_DURATION);
offset_anim.seek(0.0f); offset_anim.seek(0.0f);
} }
}); });
@ -115,27 +112,26 @@ SnackBar::paintEvent(QPaintEvent *event)
brush.setStyle(Qt::SolidPattern); brush.setStyle(Qt::SolidPattern);
brush.setColor(bgColor_); brush.setColor(bgColor_);
p.setBrush(brush); p.setBrush(brush);
p.setOpacity(bgOpacity_);
QRect r(0, 0, boxWidth_, boxHeight_); QRect r(0, 0, std::max(MIN_WIDTH, width() * MIN_WIDTH_PERCENTAGE), boxHeight_);
p.setPen(Qt::white); p.setPen(Qt::white);
QRect br = p.boundingRect(r, Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap, message_); QRect br = p.boundingRect(r, Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap, message_);
p.setPen(Qt::NoPen); p.setPen(Qt::NoPen);
r = br.united(r).adjusted(-boxPadding_, -boxPadding_, boxPadding_, boxPadding_); r = br.united(r).adjusted(-BOX_PADDING, -BOX_PADDING, BOX_PADDING, BOX_PADDING);
const qreal s = 1 - offset_; const qreal s = 1 - offset_;
if (position_ == SnackBarPosition::Bottom) if (position_ == SnackBarPosition::Bottom)
p.translate((width() - (r.width() - 2 * boxPadding_)) / 2, p.translate((width() - (r.width() - 2 * BOX_PADDING)) / 2,
height() - boxPadding_ - s * (r.height())); height() - BOX_PADDING - s * (r.height()));
else else
p.translate((width() - (r.width() - 2 * boxPadding_)) / 2, p.translate((width() - (r.width() - 2 * BOX_PADDING)) / 2,
s * (r.height()) - 2 * boxPadding_); s * (r.height()) - 2 * BOX_PADDING);
br.moveCenter(r.center()); br.moveCenter(r.center());
p.drawRoundedRect(r.adjusted(0, 0, 0, 3), 3, 3); p.drawRoundedRect(r.adjusted(0, 0, 0, 4), 4, 4);
p.setPen(textColor_); p.setPen(textColor_);
p.drawText(br, Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap, message_); p.drawText(br, Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap, message_);
} }

View file

@ -17,12 +17,30 @@ class SnackBar : public OverlayWidget
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QColor bgColor READ backgroundColor WRITE setBackgroundColor)
Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor)
public: public:
explicit SnackBar(QWidget *parent); explicit SnackBar(QWidget *parent);
inline void setBackgroundColor(const QColor &color); QColor backgroundColor() const { return bgColor_; }
inline void setTextColor(const QColor &color); void setBackgroundColor(const QColor &color)
inline void setPosition(SnackBarPosition pos); {
bgColor_ = color;
update();
}
QColor textColor() const { return textColor_; }
void setTextColor(const QColor &color)
{
textColor_ = color;
update();
}
void setPosition(SnackBarPosition pos)
{
position_ = pos;
update();
}
public slots: public slots:
void showMessage(const QString &msg); void showMessage(const QString &msg);
@ -49,31 +67,7 @@ private:
QTimer showTimer_; QTimer showTimer_;
QTimer hideTimer_; QTimer hideTimer_;
int duration_; double boxHeight_;
int boxWidth_;
int boxHeight_;
int boxPadding_;
SnackBarPosition position_; SnackBarPosition position_;
}; };
inline void
SnackBar::setPosition(SnackBarPosition pos)
{
position_ = pos;
update();
}
inline void
SnackBar::setBackgroundColor(const QColor &color)
{
bgColor_ = color;
update();
}
inline void
SnackBar::setTextColor(const QColor &color)
{
textColor_ = color;
update();
}