qtmaterialdrawer_internal.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #include "qtmaterialdrawer_internal.h"
  2. #include <QState>
  3. #include <QPainter>
  4. #include <QtWidgets/QLayout>
  5. #include <QSignalTransition>
  6. #include <QPropertyAnimation>
  7. #include "qtmaterialdrawer.h"
  8. /*!
  9. * \class QtMaterialDrawerStateMachine
  10. * \internal
  11. */
  12. QtMaterialDrawerStateMachine::QtMaterialDrawerStateMachine(QtMaterialDrawerWidget *drawer, QtMaterialDrawer *parent)
  13. : QStateMachine(parent),
  14. m_drawer(drawer),
  15. m_main(parent),
  16. m_openingState(new QState),
  17. m_openedState(new QState),
  18. m_closingState(new QState),
  19. m_closedState(new QState),
  20. m_opacity(0)
  21. {
  22. addState(m_openingState);
  23. addState(m_openedState);
  24. addState(m_closingState);
  25. addState(m_closedState);
  26. setInitialState(m_closedState);
  27. QSignalTransition *transition;
  28. QPropertyAnimation *animation;
  29. transition = new QSignalTransition(this, SIGNAL(signalOpen()));
  30. transition->setTargetState(m_openingState);
  31. m_closedState->addTransition(transition);
  32. animation = new QPropertyAnimation(drawer, "offset", this);
  33. animation->setDuration(220);
  34. animation->setEasingCurve(QEasingCurve::OutCirc);
  35. transition->addAnimation(animation);
  36. animation = new QPropertyAnimation(this, "opacity", this);
  37. animation->setDuration(220);
  38. transition->addAnimation(animation);
  39. transition = new QSignalTransition(animation, SIGNAL(finished()));
  40. transition->setTargetState(m_openedState);
  41. m_openingState->addTransition(transition);
  42. transition = new QSignalTransition(this, SIGNAL(signalClose()));
  43. transition->setTargetState(m_closingState);
  44. m_openingState->addTransition(transition);
  45. animation = new QPropertyAnimation(this, "opacity", this);
  46. animation->setDuration(220);
  47. transition->addAnimation(animation);
  48. animation = new QPropertyAnimation(drawer, "offset", this);
  49. animation->setDuration(220);
  50. animation->setEasingCurve(QEasingCurve::InCirc);
  51. transition->addAnimation(animation);
  52. transition = new QSignalTransition(animation, SIGNAL(finished()));
  53. transition->setTargetState(m_closedState);
  54. m_closingState->addTransition(transition);
  55. transition = new QSignalTransition(this, SIGNAL(signalClose()));
  56. transition->setTargetState(m_closingState);
  57. m_openedState->addTransition(transition);
  58. animation = new QPropertyAnimation(drawer, "offset", this);
  59. animation->setDuration(220);
  60. animation->setEasingCurve(QEasingCurve::InCirc);
  61. transition->addAnimation(animation);
  62. animation = new QPropertyAnimation(this, "opacity", this);
  63. animation->setDuration(220);
  64. transition->addAnimation(animation);
  65. transition = new QSignalTransition(animation, SIGNAL(finished()));
  66. transition->setTargetState(m_closedState);
  67. m_closingState->addTransition(transition);
  68. updatePropertyAssignments();
  69. }
  70. QtMaterialDrawerStateMachine::~QtMaterialDrawerStateMachine()
  71. {
  72. }
  73. void QtMaterialDrawerStateMachine::setOpacity(qreal opacity)
  74. {
  75. m_opacity = opacity;
  76. m_main->update();
  77. }
  78. bool QtMaterialDrawerStateMachine::isInClosedState() const
  79. {
  80. return m_closedState->active();
  81. }
  82. void QtMaterialDrawerStateMachine::updatePropertyAssignments()
  83. {
  84. const qreal closedOffset = -(m_drawer->width()+32);
  85. m_closingState->assignProperty(m_drawer, "offset", closedOffset);
  86. m_closedState->assignProperty(m_drawer, "offset", closedOffset);
  87. m_closingState->assignProperty(this, "opacity", 0);
  88. m_closedState->assignProperty(this, "opacity", 0);
  89. m_openingState->assignProperty(m_drawer, "offset", 0);
  90. m_openingState->assignProperty(this, "opacity", 0.4);
  91. }
  92. /*!
  93. * \class QtMaterialDrawerWidget
  94. * \internal
  95. */
  96. QtMaterialDrawerWidget::QtMaterialDrawerWidget(QWidget *parent)
  97. : QtMaterialOverlayWidget(parent),
  98. m_offset(0)
  99. {
  100. }
  101. QtMaterialDrawerWidget::~QtMaterialDrawerWidget()
  102. {
  103. }
  104. void QtMaterialDrawerWidget::setOffset(int offset)
  105. {
  106. m_offset = offset;
  107. QWidget *widget = parentWidget();
  108. if (widget) {
  109. setGeometry(widget->rect().translated(offset, 0));
  110. }
  111. update();
  112. }
  113. void QtMaterialDrawerWidget::paintEvent(QPaintEvent *event)
  114. {
  115. Q_UNUSED(event)
  116. QPainter painter(this);
  117. QBrush brush;
  118. brush.setStyle(Qt::SolidPattern);
  119. brush.setColor(Qt::white);
  120. painter.setBrush(brush);
  121. painter.setPen(Qt::NoPen);
  122. painter.drawRect(rect().adjusted(0, 0, -16, 0));
  123. QLinearGradient gradient(QPointF(width()-16, 0), QPointF(width(), 0));
  124. gradient.setColorAt(0, QColor(0, 0, 0, 80));
  125. gradient.setColorAt(0.5, QColor(0, 0, 0, 20));
  126. gradient.setColorAt(1, QColor(0, 0, 0, 0));
  127. painter.setBrush(QBrush(gradient));
  128. painter.drawRect(width()-16, 0, 16, height());
  129. }
  130. QRect QtMaterialDrawerWidget::overlayGeometry() const
  131. {
  132. return QtMaterialOverlayWidget::overlayGeometry().translated(m_offset, 0);
  133. }