qt-material-widgets/components/qtmaterialdrawer.cpp

230 lines
3.8 KiB
C++
Raw Normal View History

2017-09-30 00:20:12 +00:00
#include "qtmaterialdrawer.h"
2022-02-17 02:22:22 +00:00
namespace md
{
2017-09-30 00:20:12 +00:00
/*!
* \class QtMaterialDrawerPrivate
* \internal
*/
2017-10-05 08:13:21 +00:00
/*!
* \internal
*/
2022-02-17 02:22:22 +00:00
DrawerPrivate::DrawerPrivate(Drawer *q)
2017-10-05 08:13:21 +00:00
: q_ptr(q)
{
}
/*!
* \internal
*/
2022-02-17 02:22:22 +00:00
DrawerPrivate::~DrawerPrivate()
2017-10-05 08:13:21 +00:00
{
}
/*!
* \internal
*/
2022-02-17 02:22:22 +00:00
void DrawerPrivate::init()
2017-09-30 00:20:12 +00:00
{
2022-02-17 02:22:22 +00:00
Q_Q(Drawer);
2017-10-05 08:13:21 +00:00
2022-02-17 02:22:22 +00:00
widget = new DrawerWidget;
stateMachine = new DrawerStateMachine(widget, q);
2017-10-05 08:13:21 +00:00
window = new QWidget;
width = 250;
clickToClose = false;
autoRaise = true;
closed = true;
overlay = false;
2017-10-05 08:13:21 +00:00
2017-09-30 00:20:12 +00:00
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(window);
widget->setLayout(layout);
widget->setFixedWidth(width+16);
widget->setParent(q);
2017-09-30 00:20:12 +00:00
stateMachine->start();
QCoreApplication::processEvents();
}
/*!
* \class QtMaterialDrawer
*/
2022-02-17 02:22:22 +00:00
Drawer::Drawer(QWidget *parent)
: OverlayWidget(parent),
d_ptr(new DrawerPrivate(this))
2017-09-30 00:20:12 +00:00
{
2017-10-05 08:13:21 +00:00
d_func()->init();
2017-09-30 00:20:12 +00:00
}
2022-02-17 02:22:22 +00:00
Drawer::~Drawer()
2017-09-30 00:20:12 +00:00
{
}
2022-02-17 02:22:22 +00:00
void Drawer::setDrawerWidth(int width)
2017-09-30 00:20:12 +00:00
{
2022-02-17 02:22:22 +00:00
Q_D(Drawer);
2017-09-30 00:20:12 +00:00
d->width = width;
d->stateMachine->updatePropertyAssignments();
d->widget->setFixedWidth(width+16);
2017-09-30 00:20:12 +00:00
}
2022-02-17 02:22:22 +00:00
int Drawer::drawerWidth() const
2017-09-30 00:20:12 +00:00
{
2022-02-17 02:22:22 +00:00
Q_D(const Drawer);
2017-09-30 00:20:12 +00:00
return d->width;
}
2022-02-17 02:22:22 +00:00
void Drawer::setDrawerLayout(QLayout *layout)
2017-09-30 00:20:12 +00:00
{
2022-02-17 02:22:22 +00:00
Q_D(Drawer);
2017-09-30 00:20:12 +00:00
d->window->setLayout(layout);
}
2022-02-17 02:22:22 +00:00
QLayout *Drawer::drawerLayout() const
2017-09-30 00:20:12 +00:00
{
2022-02-17 02:22:22 +00:00
Q_D(const Drawer);
2017-09-30 00:20:12 +00:00
return d->window->layout();
}
2022-02-17 02:22:22 +00:00
void Drawer::setClickOutsideToClose(bool state)
{
2022-02-17 02:22:22 +00:00
Q_D(Drawer);
d->clickToClose = state;
}
2022-02-17 02:22:22 +00:00
bool Drawer::clickOutsideToClose() const
{
2022-02-17 02:22:22 +00:00
Q_D(const Drawer);
return d->clickToClose;
}
2022-02-17 02:22:22 +00:00
void Drawer::setAutoRaise(bool state)
2017-10-05 08:13:21 +00:00
{
2022-02-17 02:22:22 +00:00
Q_D(Drawer);
2017-10-05 08:13:21 +00:00
d->autoRaise = state;
}
2022-02-17 02:22:22 +00:00
bool Drawer::autoRaise() const
2017-10-05 08:13:21 +00:00
{
2022-02-17 02:22:22 +00:00
Q_D(const Drawer);
2017-10-05 08:13:21 +00:00
return d->autoRaise;
}
2022-02-17 02:22:22 +00:00
void Drawer::setOverlayMode(bool value)
{
2022-02-17 02:22:22 +00:00
Q_D(Drawer);
d->overlay = value;
2017-10-12 19:47:10 +00:00
update();
}
2022-02-17 02:22:22 +00:00
bool Drawer::overlayMode() const
{
2022-02-17 02:22:22 +00:00
Q_D(const Drawer);
return d->overlay;
}
2022-02-17 02:22:22 +00:00
void Drawer::openDrawer()
2017-09-30 00:20:12 +00:00
{
2022-02-17 02:22:22 +00:00
Q_D(Drawer);
2017-09-30 00:20:12 +00:00
emit d->stateMachine->signalOpen();
2017-10-05 08:13:21 +00:00
if (d->autoRaise) {
raise();
}
2017-10-12 19:10:43 +00:00
setAttribute(Qt::WA_TransparentForMouseEvents, false);
setAttribute(Qt::WA_NoSystemBackground, false);
2017-09-30 00:20:12 +00:00
}
2022-02-17 02:22:22 +00:00
void Drawer::closeDrawer()
2017-09-30 00:20:12 +00:00
{
2022-02-17 02:22:22 +00:00
Q_D(Drawer);
2017-09-30 00:20:12 +00:00
emit d->stateMachine->signalClose();
2017-10-12 19:10:43 +00:00
if (d->overlay) {
setAttribute(Qt::WA_TransparentForMouseEvents);
setAttribute(Qt::WA_NoSystemBackground);
}
}
2022-02-17 02:22:22 +00:00
bool Drawer::event(QEvent *event)
2017-10-12 19:10:43 +00:00
{
2022-02-17 02:22:22 +00:00
Q_D(Drawer);
2017-10-12 19:10:43 +00:00
switch (event->type())
{
case QEvent::Move:
case QEvent::Resize:
if (!d->overlay) {
setMask(QRegion(d->widget->rect()));
}
break;
default:
break;
}
2022-02-17 02:22:22 +00:00
return OverlayWidget::event(event);
2017-09-30 00:20:12 +00:00
}
2022-02-17 02:22:22 +00:00
bool Drawer::eventFilter(QObject *obj, QEvent *event)
2017-09-30 00:20:12 +00:00
{
2022-02-17 02:22:22 +00:00
Q_D(Drawer);
2017-09-30 00:20:12 +00:00
switch (event->type())
{
case QEvent::MouseButtonPress: {
QMouseEvent *mouseEvent;
if ((mouseEvent = static_cast<QMouseEvent *>(event))) {
const bool canClose = d->clickToClose || d->overlay;
if (!d->widget->geometry().contains(mouseEvent->pos()) && canClose) {
closeDrawer();
}
}
break;
}
case QEvent::Move:
case QEvent::Resize: {
2017-10-12 19:10:43 +00:00
QLayout *lw = d->widget->layout();
if (lw && 16 != lw->contentsMargins().right()) {
lw->setContentsMargins(0, 0, 16, 0);
2017-09-30 00:20:12 +00:00
}
2017-10-12 19:10:43 +00:00
break;
2017-09-30 00:20:12 +00:00
}
default:
break;
}
2022-02-17 02:22:22 +00:00
return OverlayWidget::eventFilter(obj, event);
2017-09-30 00:20:12 +00:00
}
2022-02-17 02:22:22 +00:00
void Drawer::paintEvent(QPaintEvent *event)
2017-09-30 00:20:12 +00:00
{
Q_UNUSED(event)
2022-02-17 02:22:22 +00:00
Q_D(Drawer);
2017-09-30 00:20:12 +00:00
if (!d->overlay || d->stateMachine->isInClosedState()) {
return;
}
QPainter painter(this);
painter.setOpacity(d->stateMachine->opacity());
painter.fillRect(rect(), Qt::SolidPattern);
2017-09-30 00:20:12 +00:00
}
2022-02-17 02:22:22 +00:00
}