123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- #include "qtmaterialsnackbar.h"
- #include "qtmaterialsnackbar_p.h"
- #include <QtWidgets/QApplication>
- #include <QPainter>
- #include "qtmaterialsnackbar_internal.h"
- #include "lib/qtmaterialstyle.h"
- #include "lib/qtmaterialstatetransition.h"
- #include <QDebug>
- /*!
- * \class QtMaterialSnackbarPrivate
- * \internal
- */
- QtMaterialSnackbarPrivate::QtMaterialSnackbarPrivate(QtMaterialSnackbar *q)
- : q_ptr(q)
- {
- }
- QtMaterialSnackbarPrivate::~QtMaterialSnackbarPrivate()
- {
- }
- void QtMaterialSnackbarPrivate::init()
- {
- Q_Q(QtMaterialSnackbar);
- stateMachine = new QtMaterialSnackbarStateMachine(q);
- bgOpacity = 0.9;
- duration = 3000;
- boxWidth = 300;
- clickDismiss = false;
- useThemeColors = true;
- q->setAttribute(Qt::WA_TransparentForMouseEvents);
- QFont font("Roboto", 10, QFont::Medium);
- font.setCapitalization(QFont::AllUppercase);
- q->setFont(font);
- stateMachine->start();
- QCoreApplication::processEvents();
- }
- /*!
- * \class QtMaterialSnackbar
- */
- QtMaterialSnackbar::QtMaterialSnackbar(QWidget *parent)
- : QtMaterialOverlayWidget(parent),
- d_ptr(new QtMaterialSnackbarPrivate(this))
- {
- d_func()->init();
- }
- QtMaterialSnackbar::~QtMaterialSnackbar()
- {
- }
- void QtMaterialSnackbar::setAutoHideDuration(int duration)
- {
- Q_D(QtMaterialSnackbar);
- d->duration = duration;
- }
- int QtMaterialSnackbar::autoHideDuration() const
- {
- Q_D(const QtMaterialSnackbar);
- return d->duration;
- }
- void QtMaterialSnackbar::setUseThemeColors(bool value)
- {
- Q_D(QtMaterialSnackbar);
- if (d->useThemeColors == value) {
- return;
- }
- d->useThemeColors = value;
- update();
- }
- bool QtMaterialSnackbar::useThemeColors() const
- {
- Q_D(const QtMaterialSnackbar);
- return d->useThemeColors;
- }
- void QtMaterialSnackbar::setBackgroundColor(const QColor &color)
- {
- Q_D(QtMaterialSnackbar);
- d->backgroundColor = color;
- MATERIAL_DISABLE_THEME_COLORS
- update();
- }
- QColor QtMaterialSnackbar::backgroundColor() const
- {
- Q_D(const QtMaterialSnackbar);
- if (d->useThemeColors || !d->backgroundColor.isValid()) {
- return QtMaterialStyle::instance().themeColor("text");
- } else {
- return d->backgroundColor;
- }
- }
- void QtMaterialSnackbar::setBackgroundOpacity(qreal opacity)
- {
- Q_D(QtMaterialSnackbar);
- d->bgOpacity = opacity;
- update();
- }
- qreal QtMaterialSnackbar::backgroundOpacity() const
- {
- Q_D(const QtMaterialSnackbar);
- return d->bgOpacity;
- }
- void QtMaterialSnackbar::setTextColor(const QColor &color)
- {
- Q_D(QtMaterialSnackbar);
- d->textColor = color;
- MATERIAL_DISABLE_THEME_COLORS
- update();
- }
- QColor QtMaterialSnackbar::textColor() const
- {
- Q_D(const QtMaterialSnackbar);
- if (d->useThemeColors || !d->textColor.isValid()) {
- return QtMaterialStyle::instance().themeColor("canvas");
- } else {
- return d->textColor;
- }
- }
- void QtMaterialSnackbar::setFontSize(qreal size)
- {
- QFont f(font());
- f.setPointSizeF(size);
- setFont(f);
- update();
- }
- qreal QtMaterialSnackbar::fontSize() const
- {
- return font().pointSizeF();
- }
- void QtMaterialSnackbar::setBoxWidth(int width)
- {
- Q_D(QtMaterialSnackbar);
- d->boxWidth = width;
- update();
- }
- int QtMaterialSnackbar::boxWidth() const
- {
- Q_D(const QtMaterialSnackbar);
- return d->boxWidth;
- }
- void QtMaterialSnackbar::setClickToDismissMode(bool value)
- {
- Q_D(QtMaterialSnackbar);
- d->clickDismiss = value;
- }
- bool QtMaterialSnackbar::clickToDismissMode() const
- {
- Q_D(const QtMaterialSnackbar);
- return d->clickDismiss;
- }
- void QtMaterialSnackbar::addMessage(const QString &message)
- {
- Q_D(QtMaterialSnackbar);
- d->messages.push_back(message);
- d->stateMachine->postEvent(new QtMaterialStateTransitionEvent(SnackbarShowTransition));
- raise();
- }
- void QtMaterialSnackbar::addInstantMessage(const QString &message)
- {
- Q_D(QtMaterialSnackbar);
- if (d->messages.isEmpty()) {
- d->messages.push_back(message);
- } else {
- d->messages.insert(1, message);
- }
- d->stateMachine->progress();
- }
- void QtMaterialSnackbar::dequeue()
- {
- Q_D(QtMaterialSnackbar);
- if (d->messages.isEmpty()) {
- return;
- }
- d->messages.removeFirst();
- if (!d->messages.isEmpty()) {
- d->stateMachine->postEvent(new QtMaterialStateTransitionEvent(SnackbarNextTransition));
- } else {
- d->stateMachine->postEvent(new QtMaterialStateTransitionEvent(SnackbarWaitTransition));
- }
- }
- void QtMaterialSnackbar::paintEvent(QPaintEvent *event)
- {
- Q_UNUSED(event)
- Q_D(QtMaterialSnackbar);
- if (d->messages.isEmpty()) {
- return;
- }
- QString message = d->messages.first();
- QPainter painter(this);
- painter.setRenderHint(QPainter::Antialiasing);
- QBrush brush;
- brush.setStyle(Qt::SolidPattern);
- brush.setColor(backgroundColor());
- painter.setBrush(brush);
- painter.setOpacity(d->bgOpacity);
- QRect r(0, 0, d->boxWidth, 40);
- painter.setPen(Qt::white);
- QRect br = painter.boundingRect(r, Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap, message);
- painter.setPen(Qt::NoPen);
- r = br.united(r).adjusted(-10, -10, 10, 20);
- const qreal s = 1-d->stateMachine->offset();
- painter.translate((width()-(r.width()-20))/2,
- height()+10-s*(r.height()));
- br.moveCenter(r.center());
- painter.drawRoundedRect(r.adjusted(0, 0, 0, 3), 3, 3);
- painter.setPen(textColor());
- painter.drawText(br, Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap, message);
- }
|