qt-material-widgets/components/qtmaterialsnackbar_internal...

103 lines
2.9 KiB
C++
Raw Normal View History

2017-09-29 22:57:55 +00:00
#include "qtmaterialsnackbar_internal.h"
2017-09-29 13:58:00 +00:00
#include <QPropertyAnimation>
2017-09-29 22:57:55 +00:00
#include "qtmaterialsnackbar.h"
#include "lib/qtmaterialstatetransition.h"
2017-09-29 13:58:00 +00:00
#include <QDebug>
2022-02-17 02:57:43 +00:00
namespace md
{
2017-09-29 13:58:00 +00:00
2022-02-17 02:57:43 +00:00
SnackBarStateMachine::SnackBarStateMachine(SnackBar *parent)
2017-09-29 13:58:00 +00:00
: QStateMachine(parent),
m_snackbar(parent)
{
m_timer.setSingleShot(true);
QState *hiddenState = new QState;
QState *visibleState = new QState;
QState *finalState = new QState;
addState(hiddenState);
addState(visibleState);
addState(finalState);
setInitialState(hiddenState);
2022-02-17 02:57:43 +00:00
StateTransition *transition;
2017-09-29 13:58:00 +00:00
2022-02-17 02:57:43 +00:00
transition = new StateTransition(SnackbarShowTransition);
2017-09-29 13:58:00 +00:00
transition->setTargetState(visibleState);
hiddenState->addTransition(transition);
2022-02-17 02:57:43 +00:00
transition = new StateTransition(SnackbarHideTransition);
2017-09-29 13:58:00 +00:00
transition->setTargetState(visibleState);
hiddenState->addTransition(transition);
2022-02-17 02:57:43 +00:00
transition = new StateTransition(SnackbarHideTransition);
2017-09-29 13:58:00 +00:00
transition->setTargetState(finalState);
visibleState->addTransition(transition);
2022-02-17 02:57:43 +00:00
transition = new StateTransition(SnackbarWaitTransition);
2017-09-29 13:58:00 +00:00
transition->setTargetState(hiddenState);
finalState->addTransition(transition);
2022-02-17 02:57:43 +00:00
transition = new StateTransition(SnackbarNextTransition);
2017-09-29 13:58:00 +00:00
transition->setTargetState(visibleState);
finalState->addTransition(transition);
connect(visibleState, SIGNAL(propertiesAssigned()),
this, SLOT(snackbarShown()));
connect(finalState, SIGNAL(propertiesAssigned()),
m_snackbar, SLOT(dequeue()));
QPropertyAnimation *animation;
animation = new QPropertyAnimation(this, "offset", this);
animation->setEasingCurve(QEasingCurve::OutCubic);
2017-11-02 19:12:41 +00:00
animation->setDuration(300);
2017-09-29 13:58:00 +00:00
addDefaultAnimation(animation);
hiddenState->assignProperty(this, "offset", 1);
visibleState->assignProperty(this, "offset", 0);
finalState->assignProperty(this, "offset", 1);
connect(&m_timer, SIGNAL(timeout()), this, SLOT(progress()));
m_snackbar->installEventFilter(this);
}
2022-02-17 02:57:43 +00:00
SnackBarStateMachine::~SnackBarStateMachine()
2017-09-29 13:58:00 +00:00
{
}
2022-02-17 02:57:43 +00:00
bool SnackBarStateMachine::eventFilter(QObject *watched, QEvent *event)
2017-09-29 13:58:00 +00:00
{
if (QEvent::MouseButtonPress == event->type() && m_snackbar->clickToDismissMode()) {
progress();
}
return QStateMachine::eventFilter(watched, event);
}
2022-02-17 02:57:43 +00:00
void SnackBarStateMachine::setOffset(qreal offset)
2017-09-29 13:58:00 +00:00
{
m_offset = offset;
m_snackbar->update();
}
2022-02-17 02:57:43 +00:00
void SnackBarStateMachine::progress()
2017-09-29 13:58:00 +00:00
{
m_timer.stop();
2022-02-17 02:57:43 +00:00
postEvent(new StateTransitionEvent(SnackbarHideTransition));
2017-09-29 13:58:00 +00:00
if (m_snackbar->clickToDismissMode()) {
m_snackbar->setAttribute(Qt::WA_TransparentForMouseEvents, true);
}
}
2022-02-17 02:57:43 +00:00
void SnackBarStateMachine::snackbarShown()
2017-09-29 13:58:00 +00:00
{
m_timer.start(m_snackbar->autoHideDuration());
if (m_snackbar->clickToDismissMode()) {
m_snackbar->setAttribute(Qt::WA_TransparentForMouseEvents, false);
}
}
2022-02-17 02:57:43 +00:00
}