146 lines
4.6 KiB
C++
146 lines
4.6 KiB
C++
#include "qtmaterialcollapsiblemenu_internal.h"
|
|
#include <QPropertyAnimation>
|
|
#include <QPixmap>
|
|
#include <QPainter>
|
|
#include "qtmaterialcollapsiblemenu.h"
|
|
#include "lib/qtmaterialstatetransition.h"
|
|
|
|
/*!
|
|
* \class QtMaterialCollapsibleMenuStateMachine
|
|
* \internal
|
|
*/
|
|
|
|
QtMaterialCollapsibleMenuStateMachine::QtMaterialCollapsibleMenuStateMachine(
|
|
QtMaterialCollapsibleMenuProxy *proxy,
|
|
QtMaterialCollapsibleMenu *parent)
|
|
: QStateMachine(parent),
|
|
m_menu(parent),
|
|
m_proxy(proxy),
|
|
m_expandedState(new QState),
|
|
m_collapsedState(new QState),
|
|
m_expandXAnimation(new QPropertyAnimation(this)),
|
|
m_expandYAnimation(new QPropertyAnimation(this)),
|
|
m_collapseXAnimation(new QPropertyAnimation(this)),
|
|
m_collapseYAnimation(new QPropertyAnimation(this))
|
|
{
|
|
Q_ASSERT(parent);
|
|
|
|
addState(m_expandedState);
|
|
addState(m_collapsedState);
|
|
setInitialState(m_collapsedState);
|
|
|
|
QtMaterialStateTransition *transition;
|
|
QPropertyAnimation *animation;
|
|
|
|
transition = new QtMaterialStateTransition(CollapsibleMenuExpand);
|
|
transition->setTargetState(m_expandedState);
|
|
m_collapsedState->addTransition(transition);
|
|
|
|
m_expandXAnimation->setTargetObject(m_proxy);
|
|
m_expandXAnimation->setPropertyName("xScale");
|
|
m_expandXAnimation->setDuration(200);
|
|
m_expandXAnimation->setEasingCurve(QEasingCurve::OutQuad);
|
|
transition->addAnimation(m_expandXAnimation);
|
|
|
|
m_expandYAnimation->setTargetObject(m_proxy);
|
|
m_expandYAnimation->setPropertyName("yScale");
|
|
m_expandYAnimation->setDuration(600);
|
|
m_expandYAnimation->setEasingCurve(QEasingCurve::OutElastic);
|
|
transition->addAnimation(m_expandYAnimation);
|
|
|
|
animation = new QPropertyAnimation(this);
|
|
animation->setTargetObject(m_proxy);
|
|
animation->setPropertyName("opacity");
|
|
animation->setDuration(220);
|
|
animation->setEasingCurve(QEasingCurve::OutQuad);
|
|
transition->addAnimation(animation);
|
|
|
|
transition = new QtMaterialStateTransition(CollapsibleMenuCollapse);
|
|
transition->setTargetState(m_collapsedState);
|
|
m_expandedState->addTransition(transition);
|
|
|
|
m_collapseXAnimation->setTargetObject(m_proxy);
|
|
m_collapseXAnimation->setPropertyName("xScale");
|
|
m_collapseXAnimation->setDuration(400);
|
|
m_collapseXAnimation->setEasingCurve(QEasingCurve::OutQuad);
|
|
transition->addAnimation(m_collapseXAnimation);
|
|
|
|
m_collapseYAnimation->setTargetObject(m_proxy);
|
|
m_collapseYAnimation->setPropertyName("yScale");
|
|
m_collapseYAnimation->setDuration(500);
|
|
m_collapseYAnimation->setEasingCurve(QEasingCurve::OutQuad);
|
|
transition->addAnimation(m_collapseYAnimation);
|
|
|
|
m_expandedState->assignProperty(m_proxy, "xScale", 1);
|
|
m_expandedState->assignProperty(m_proxy, "yScale", 1);
|
|
m_expandedState->assignProperty(m_proxy, "opacity", 1);
|
|
|
|
m_collapsedState->assignProperty(m_proxy, "xScale", 0.5);
|
|
m_collapsedState->assignProperty(m_proxy, "yScale", 0.05);
|
|
m_collapsedState->assignProperty(m_proxy, "opacity", 0);
|
|
|
|
animation = new QPropertyAnimation(this);
|
|
animation->setTargetObject(m_proxy);
|
|
animation->setPropertyName("opacity");
|
|
animation->setDuration(140);
|
|
transition->addAnimation(animation);
|
|
|
|
connect(m_expandedState, SIGNAL(propertiesAssigned()),
|
|
m_menu, SLOT(setOpaque()));
|
|
connect(m_expandedState, SIGNAL(propertiesAssigned()),
|
|
m_menu, SIGNAL(wasExpanded()));
|
|
connect(m_collapsedState, SIGNAL(propertiesAssigned()),
|
|
m_menu, SIGNAL(wasCollapsed()));
|
|
}
|
|
|
|
QtMaterialCollapsibleMenuStateMachine::~QtMaterialCollapsibleMenuStateMachine()
|
|
{
|
|
}
|
|
|
|
/*!
|
|
* \class QtMaterialCollapsibleMenuProxy
|
|
* \internal
|
|
*/
|
|
|
|
QtMaterialCollapsibleMenuProxy::QtMaterialCollapsibleMenuProxy(
|
|
QWidget *source,
|
|
QGraphicsDropShadowEffect *effect,
|
|
QWidget *parent)
|
|
: QWidget(parent),
|
|
m_source(source),
|
|
m_effect(effect),
|
|
m_sx(0),
|
|
m_sy(0),
|
|
m_opacity(0)
|
|
{
|
|
}
|
|
|
|
QtMaterialCollapsibleMenuProxy::~QtMaterialCollapsibleMenuProxy()
|
|
{
|
|
}
|
|
|
|
QSize QtMaterialCollapsibleMenuProxy::sizeHint() const
|
|
{
|
|
if (!m_source) {
|
|
return QWidget::sizeHint();
|
|
}
|
|
return m_source->sizeHint();
|
|
}
|
|
|
|
void QtMaterialCollapsibleMenuProxy::paintEvent(QPaintEvent *event)
|
|
{
|
|
Q_UNUSED(event)
|
|
|
|
QPainter painter(this);
|
|
|
|
QRect r(rect());
|
|
QPixmap pm = m_source->grab(r.translated(-m_source->pos())).scaled(
|
|
static_cast<qreal>(r.width())*m_sx,
|
|
static_cast<qreal>(r.height())*m_sy,
|
|
Qt::IgnoreAspectRatio,
|
|
Qt::SmoothTransformation);
|
|
|
|
painter.setOpacity(m_opacity);
|
|
painter.drawPixmap(0, 0, pm);
|
|
}
|