qt-material-widgets/components/qtmaterialdrawer.cpp

165 lines
3.4 KiB
C++
Raw Normal View History

2017-09-30 00:20:12 +00:00
#include "qtmaterialdrawer.h"
#include "qtmaterialdrawer_p.h"
#include <QPainter>
#include <QEvent>
#include <QMouseEvent>
2017-09-30 00:20:12 +00:00
#include <QtWidgets/QApplication>
#include <QtWidgets/QLayout>
#include <QLinearGradient>
#include <QtWidgets/QVBoxLayout>
#include "qtmaterialdrawer_internal.h"
/*!
* \class QtMaterialDrawerPrivate
* \internal
*/
2017-09-30 00:20:12 +00:00
QtMaterialDrawerPrivate::QtMaterialDrawerPrivate(QtMaterialDrawer *q)
: q_ptr(q),
stateMachine(new QtMaterialDrawerStateMachine(q)),
window(new QWidget),
width(250),
clickToClose(false)
2017-09-30 00:20:12 +00:00
{
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(window);
q->setLayout(layout);
q->setFixedWidth(width+16);
stateMachine->start();
QCoreApplication::processEvents();
}
/*!
* \class QtMaterialDrawer
*/
2017-09-30 00:20:12 +00:00
QtMaterialDrawer::QtMaterialDrawer(QWidget *parent)
: QtMaterialOverlayWidget(parent),
d_ptr(new QtMaterialDrawerPrivate(this))
{
}
QtMaterialDrawer::~QtMaterialDrawer()
{
}
void QtMaterialDrawer::setDrawerWidth(int width)
{
Q_D(QtMaterialDrawer);
d->width = width;
d->stateMachine->updatePropertyAssignments();
setFixedWidth(width+16);
}
int QtMaterialDrawer::drawerWidth() const
{
Q_D(const QtMaterialDrawer);
return d->width;
}
void QtMaterialDrawer::setDrawerLayout(QLayout *layout)
{
Q_D(QtMaterialDrawer);
d->window->setLayout(layout);
}
QLayout *QtMaterialDrawer::drawerLayout() const
{
Q_D(const QtMaterialDrawer);
return d->window->layout();
}
void QtMaterialDrawer::setClickOutsideToClose(bool state)
{
Q_D(QtMaterialDrawer);
d->clickToClose = state;
}
bool QtMaterialDrawer::clickOutsideToClose() const
{
Q_D(const QtMaterialDrawer);
return d->clickToClose;
}
2017-09-30 00:20:12 +00:00
void QtMaterialDrawer::openDrawer()
{
Q_D(QtMaterialDrawer);
emit d->stateMachine->enterOpenedState();
raise();
2017-09-30 00:20:12 +00:00
}
void QtMaterialDrawer::closeDrawer()
{
Q_D(QtMaterialDrawer);
emit d->stateMachine->enterClosedState();
}
bool QtMaterialDrawer::eventFilter(QObject *obj, QEvent *event)
{
Q_D(QtMaterialDrawer);
2017-09-30 00:20:12 +00:00
switch (event->type())
{
case QEvent::MouseButtonPress: {
QMouseEvent *mouseEvent;
if ((mouseEvent = static_cast<QMouseEvent *>(event))) {
if (!geometry().contains(mouseEvent->pos()) && d->clickToClose) {
closeDrawer();
}
}
break;
}
case QEvent::Move:
case QEvent::Resize: {
QLayout *lyut = layout();
if (lyut && 16 != lyut->contentsMargins().right()) {
lyut->setContentsMargins(0, 0, 16, 0);
2017-09-30 00:20:12 +00:00
}
}
default:
break;
}
2017-09-30 00:20:12 +00:00
return QtMaterialOverlayWidget::eventFilter(obj, event);
}
void QtMaterialDrawer::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 QtMaterialDrawer::overlayGeometry() const
{
Q_D(const QtMaterialDrawer);
return QtMaterialOverlayWidget::overlayGeometry().translated(d->stateMachine->offset(), 0);
}