qtmaterialsnackbar_internal.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include "qtmaterialsnackbar_internal.h"
  2. #include <QPropertyAnimation>
  3. #include "qtmaterialsnackbar.h"
  4. #include "lib/qtmaterialstatetransition.h"
  5. #include <QDebug>
  6. QtMaterialSnackbarStateMachine::QtMaterialSnackbarStateMachine(QtMaterialSnackbar *parent)
  7. : QStateMachine(parent),
  8. m_snackbar(parent)
  9. {
  10. m_timer.setSingleShot(true);
  11. QState *hiddenState = new QState;
  12. QState *visibleState = new QState;
  13. QState *finalState = new QState;
  14. addState(hiddenState);
  15. addState(visibleState);
  16. addState(finalState);
  17. setInitialState(hiddenState);
  18. QtMaterialStateTransition *transition;
  19. transition = new QtMaterialStateTransition(SnackbarShowTransition);
  20. transition->setTargetState(visibleState);
  21. hiddenState->addTransition(transition);
  22. transition = new QtMaterialStateTransition(SnackbarHideTransition);
  23. transition->setTargetState(visibleState);
  24. hiddenState->addTransition(transition);
  25. transition = new QtMaterialStateTransition(SnackbarHideTransition);
  26. transition->setTargetState(finalState);
  27. visibleState->addTransition(transition);
  28. transition = new QtMaterialStateTransition(SnackbarWaitTransition);
  29. transition->setTargetState(hiddenState);
  30. finalState->addTransition(transition);
  31. transition = new QtMaterialStateTransition(SnackbarNextTransition);
  32. transition->setTargetState(visibleState);
  33. finalState->addTransition(transition);
  34. connect(visibleState, SIGNAL(propertiesAssigned()),
  35. this, SLOT(snackbarShown()));
  36. connect(finalState, SIGNAL(propertiesAssigned()),
  37. m_snackbar, SLOT(dequeue()));
  38. QPropertyAnimation *animation;
  39. animation = new QPropertyAnimation(this, "offset", this);
  40. animation->setEasingCurve(QEasingCurve::OutCubic);
  41. animation->setDuration(300);
  42. addDefaultAnimation(animation);
  43. hiddenState->assignProperty(this, "offset", 1);
  44. visibleState->assignProperty(this, "offset", 0);
  45. finalState->assignProperty(this, "offset", 1);
  46. connect(&m_timer, SIGNAL(timeout()), this, SLOT(progress()));
  47. m_snackbar->installEventFilter(this);
  48. }
  49. QtMaterialSnackbarStateMachine::~QtMaterialSnackbarStateMachine()
  50. {
  51. }
  52. bool QtMaterialSnackbarStateMachine::eventFilter(QObject *watched, QEvent *event)
  53. {
  54. if (QEvent::MouseButtonPress == event->type() && m_snackbar->clickToDismissMode()) {
  55. progress();
  56. }
  57. return QStateMachine::eventFilter(watched, event);
  58. }
  59. void QtMaterialSnackbarStateMachine::setOffset(qreal offset)
  60. {
  61. m_offset = offset;
  62. m_snackbar->update();
  63. }
  64. void QtMaterialSnackbarStateMachine::progress()
  65. {
  66. m_timer.stop();
  67. postEvent(new QtMaterialStateTransitionEvent(SnackbarHideTransition));
  68. if (m_snackbar->clickToDismissMode()) {
  69. m_snackbar->setAttribute(Qt::WA_TransparentForMouseEvents, true);
  70. }
  71. }
  72. void QtMaterialSnackbarStateMachine::snackbarShown()
  73. {
  74. m_timer.start(m_snackbar->autoHideDuration());
  75. if (m_snackbar->clickToDismissMode()) {
  76. m_snackbar->setAttribute(Qt::WA_TransparentForMouseEvents, false);
  77. }
  78. }