123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- #include "qtmaterialdrawer_internal.h"
- #include <QState>
- #include <QPainter>
- #include <QtWidgets/QLayout>
- #include <QSignalTransition>
- #include <QPropertyAnimation>
- #include "qtmaterialdrawer.h"
- /*!
- * \class QtMaterialDrawerStateMachine
- * \internal
- */
- QtMaterialDrawerStateMachine::QtMaterialDrawerStateMachine(QtMaterialDrawerWidget *drawer, QtMaterialDrawer *parent)
- : QStateMachine(parent),
- m_drawer(drawer),
- m_main(parent),
- m_openingState(new QState),
- m_openedState(new QState),
- m_closingState(new QState),
- m_closedState(new QState),
- m_opacity(0)
- {
- addState(m_openingState);
- addState(m_openedState);
- addState(m_closingState);
- addState(m_closedState);
- setInitialState(m_closedState);
- QSignalTransition *transition;
- QPropertyAnimation *animation;
- transition = new QSignalTransition(this, SIGNAL(signalOpen()));
- transition->setTargetState(m_openingState);
- m_closedState->addTransition(transition);
- animation = new QPropertyAnimation(drawer, "offset", this);
- animation->setDuration(220);
- animation->setEasingCurve(QEasingCurve::OutCirc);
- transition->addAnimation(animation);
- animation = new QPropertyAnimation(this, "opacity", this);
- animation->setDuration(220);
- transition->addAnimation(animation);
- transition = new QSignalTransition(animation, SIGNAL(finished()));
- transition->setTargetState(m_openedState);
- m_openingState->addTransition(transition);
- transition = new QSignalTransition(this, SIGNAL(signalClose()));
- transition->setTargetState(m_closingState);
- m_openingState->addTransition(transition);
- animation = new QPropertyAnimation(this, "opacity", this);
- animation->setDuration(220);
- transition->addAnimation(animation);
- animation = new QPropertyAnimation(drawer, "offset", this);
- animation->setDuration(220);
- animation->setEasingCurve(QEasingCurve::InCirc);
- transition->addAnimation(animation);
- transition = new QSignalTransition(animation, SIGNAL(finished()));
- transition->setTargetState(m_closedState);
- m_closingState->addTransition(transition);
- transition = new QSignalTransition(this, SIGNAL(signalClose()));
- transition->setTargetState(m_closingState);
- m_openedState->addTransition(transition);
- animation = new QPropertyAnimation(drawer, "offset", this);
- animation->setDuration(220);
- animation->setEasingCurve(QEasingCurve::InCirc);
- transition->addAnimation(animation);
- animation = new QPropertyAnimation(this, "opacity", this);
- animation->setDuration(220);
- transition->addAnimation(animation);
- transition = new QSignalTransition(animation, SIGNAL(finished()));
- transition->setTargetState(m_closedState);
- m_closingState->addTransition(transition);
- updatePropertyAssignments();
- }
- QtMaterialDrawerStateMachine::~QtMaterialDrawerStateMachine()
- {
- }
- void QtMaterialDrawerStateMachine::setOpacity(qreal opacity)
- {
- m_opacity = opacity;
- m_main->update();
- }
- bool QtMaterialDrawerStateMachine::isInClosedState() const
- {
- return m_closedState->active();
- }
- void QtMaterialDrawerStateMachine::updatePropertyAssignments()
- {
- const qreal closedOffset = -(m_drawer->width()+32);
- m_closingState->assignProperty(m_drawer, "offset", closedOffset);
- m_closedState->assignProperty(m_drawer, "offset", closedOffset);
- m_closingState->assignProperty(this, "opacity", 0);
- m_closedState->assignProperty(this, "opacity", 0);
- m_openingState->assignProperty(m_drawer, "offset", 0);
- m_openingState->assignProperty(this, "opacity", 0.4);
- }
- /*!
- * \class QtMaterialDrawerWidget
- * \internal
- */
- QtMaterialDrawerWidget::QtMaterialDrawerWidget(QWidget *parent)
- : QtMaterialOverlayWidget(parent),
- m_offset(0)
- {
- }
- QtMaterialDrawerWidget::~QtMaterialDrawerWidget()
- {
- }
- void QtMaterialDrawerWidget::setOffset(int offset)
- {
- m_offset = offset;
- QWidget *widget = parentWidget();
- if (widget) {
- setGeometry(widget->rect().translated(offset, 0));
- }
- update();
- }
- void QtMaterialDrawerWidget::paintEvent(QPaintEvent *event)
- {
- Q_UNUSED(event)
- QPainter painter(this);
- QBrush brush;
- brush.setStyle(Qt::SolidPattern);
- brush.setColor(Qt::white);
- painter.setBrush(brush);
- painter.setPen(Qt::NoPen);
- painter.drawRect(rect().adjusted(0, 0, -16, 0));
- QLinearGradient gradient(QPointF(width()-16, 0), QPointF(width(), 0));
- gradient.setColorAt(0, QColor(0, 0, 0, 80));
- gradient.setColorAt(0.5, QColor(0, 0, 0, 20));
- gradient.setColorAt(1, QColor(0, 0, 0, 0));
- painter.setBrush(QBrush(gradient));
- painter.drawRect(width()-16, 0, 16, height());
- }
- QRect QtMaterialDrawerWidget::overlayGeometry() const
- {
- return QtMaterialOverlayWidget::overlayGeometry().translated(m_offset, 0);
- }
|