qt-material-widgets/components/dialog.cpp

162 lines
3.8 KiB
C++
Raw Normal View History

2022-02-17 15:17:19 +00:00
#include "dialog.h"
2022-02-17 02:15:21 +00:00
namespace md
{
2017-09-29 23:15:08 +00:00
/*!
* \class DialogPrivate
2017-09-29 23:15:08 +00:00
* \internal
*/
2022-02-17 02:15:21 +00:00
DialogPrivate::DialogPrivate(Dialog *q)
2017-09-29 23:15:08 +00:00
: q_ptr(q)
{
}
2022-02-17 02:15:21 +00:00
DialogPrivate::~DialogPrivate()
2017-09-29 23:15:08 +00:00
{
}
2022-02-17 02:15:21 +00:00
void DialogPrivate::init()
2017-09-29 23:15:08 +00:00
{
2022-02-17 02:15:21 +00:00
Q_Q(Dialog);
2017-09-29 23:15:08 +00:00
2022-02-17 02:15:21 +00:00
dialogWindow = new DialogWindow(q);
2017-09-29 23:15:08 +00:00
proxyStack = new QStackedLayout;
stateMachine = new QStateMachine(q);
2022-02-17 02:15:21 +00:00
proxy = new DialogProxy(dialogWindow, proxyStack, q);
2017-09-29 23:15:08 +00:00
QVBoxLayout *layout = new QVBoxLayout;
q->setLayout(layout);
QWidget *widget = new QWidget;
widget->setLayout(proxyStack);
widget->setMinimumWidth(400);
QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect;
effect->setColor(QColor(0, 0, 0, 200));
effect->setBlurRadius(64);
effect->setOffset(0, 13);
widget->setGraphicsEffect(effect);
layout->addWidget(widget);
layout->setAlignment(widget, Qt::AlignCenter);
proxyStack->addWidget(dialogWindow);
proxyStack->addWidget(proxy);
proxyStack->setCurrentIndex(1);
q->setAttribute(Qt::WA_TransparentForMouseEvents);
QState *hiddenState = new QState;
QState *visibleState = new QState;
stateMachine->addState(hiddenState);
stateMachine->addState(visibleState);
stateMachine->setInitialState(hiddenState);
2022-02-17 02:15:21 +00:00
StateTransition *transition;
2017-09-29 23:15:08 +00:00
2022-02-17 02:15:21 +00:00
transition = new StateTransition(DialogShowTransition);
2017-09-29 23:15:08 +00:00
transition->setTargetState(visibleState);
hiddenState->addTransition(transition);
2022-02-17 02:15:21 +00:00
transition = new StateTransition(DialogHideTransition);
2017-09-29 23:15:08 +00:00
transition->setTargetState(hiddenState);
visibleState->addTransition(transition);
visibleState->assignProperty(proxy, "opacity", 1);
visibleState->assignProperty(effect, "color", QColor(0, 0, 0, 200));
visibleState->assignProperty(dialogWindow, "offset", 0);
hiddenState->assignProperty(proxy, "opacity", 0);
hiddenState->assignProperty(effect, "color", QColor(0, 0, 0, 0));
hiddenState->assignProperty(dialogWindow, "offset", 200);
QPropertyAnimation *animation;
animation = new QPropertyAnimation(proxy, "opacity", q);
animation->setDuration(280);
stateMachine->addDefaultAnimation(animation);
animation = new QPropertyAnimation(effect, "color", q);
animation->setDuration(280);
stateMachine->addDefaultAnimation(animation);
animation = new QPropertyAnimation(dialogWindow, "offset", q);
animation->setDuration(280);
animation->setEasingCurve(QEasingCurve::OutCirc);
stateMachine->addDefaultAnimation(animation);
QObject::connect(visibleState, SIGNAL(propertiesAssigned()),
proxy, SLOT(makeOpaque()));
QObject::connect(hiddenState, SIGNAL(propertiesAssigned()),
proxy, SLOT(makeTransparent()));
stateMachine->start();
QCoreApplication::processEvents();
}
/*!
* \class Dialog
2017-09-29 23:15:08 +00:00
*/
2022-02-17 02:15:21 +00:00
Dialog::Dialog(QWidget *parent)
: OverlayWidget(parent),
d_ptr(new DialogPrivate(this))
2017-09-29 23:15:08 +00:00
{
d_func()->init();
}
2022-02-17 02:15:21 +00:00
Dialog::~Dialog()
2017-09-29 23:15:08 +00:00
{
}
2022-02-17 02:15:21 +00:00
QLayout *Dialog::windowLayout() const
2017-09-29 23:15:08 +00:00
{
2022-02-17 02:15:21 +00:00
Q_D(const Dialog);
2017-09-29 23:15:08 +00:00
return d->dialogWindow->layout();
}
2022-02-17 02:15:21 +00:00
void Dialog::setWindowLayout(QLayout *layout)
2017-09-29 23:15:08 +00:00
{
2022-02-17 02:15:21 +00:00
Q_D(Dialog);
2017-09-29 23:15:08 +00:00
d->dialogWindow->setLayout(layout);
}
2022-02-17 02:15:21 +00:00
void Dialog::showDialog()
2017-09-29 23:15:08 +00:00
{
2022-02-17 02:15:21 +00:00
Q_D(Dialog);
2017-09-29 23:15:08 +00:00
2022-02-17 02:15:21 +00:00
d->stateMachine->postEvent(new StateTransitionEvent(DialogShowTransition));
raise();
2017-09-29 23:15:08 +00:00
}
2022-02-17 02:15:21 +00:00
void Dialog::hideDialog()
2017-09-29 23:15:08 +00:00
{
2022-02-17 02:15:21 +00:00
Q_D(Dialog);
2017-09-29 23:15:08 +00:00
2022-02-17 02:15:21 +00:00
d->stateMachine->postEvent(new StateTransitionEvent(DialogHideTransition));
2017-09-29 23:15:08 +00:00
setAttribute(Qt::WA_TransparentForMouseEvents);
d->proxyStack->setCurrentIndex(1);
}
2022-02-17 02:15:21 +00:00
void Dialog::paintEvent(QPaintEvent *event)
2017-09-29 23:15:08 +00:00
{
Q_UNUSED(event)
2022-02-17 02:15:21 +00:00
Q_D(Dialog);
2017-09-29 23:15:08 +00:00
QPainter painter(this);
QBrush brush;
brush.setStyle(Qt::SolidPattern);
brush.setColor(Qt::black);
painter.setBrush(brush);
painter.setPen(Qt::NoPen);
painter.setOpacity(d->proxy->opacity()/2.4);
painter.drawRect(rect());
}
2022-02-17 02:15:21 +00:00
}