123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- #include "qtmaterialdrawer.h"
- #include "qtmaterialdrawer_p.h"
- #include <QPainter>
- #include <QEvent>
- #include <QDebug>
- #include <QMouseEvent>
- #include <QtWidgets/QApplication>
- #include <QtWidgets/QLayout>
- #include <QLinearGradient>
- #include <QtWidgets/QVBoxLayout>
- #include "qtmaterialdrawer_internal.h"
- /*!
- * \class QtMaterialDrawerPrivate
- * \internal
- */
- /*!
- * \internal
- */
- QtMaterialDrawerPrivate::QtMaterialDrawerPrivate(QtMaterialDrawer *q)
- : q_ptr(q)
- {
- }
- /*!
- * \internal
- */
- QtMaterialDrawerPrivate::~QtMaterialDrawerPrivate()
- {
- }
- /*!
- * \internal
- */
- void QtMaterialDrawerPrivate::init()
- {
- Q_Q(QtMaterialDrawer);
- widget = new QtMaterialDrawerWidget;
- stateMachine = new QtMaterialDrawerStateMachine(widget, q);
- window = new QWidget;
- width = 250;
- clickToClose = false;
- autoRaise = true;
- closed = true;
- overlay = false;
- QVBoxLayout *layout = new QVBoxLayout;
- layout->addWidget(window);
- widget->setLayout(layout);
- widget->setFixedWidth(width+16);
- widget->setParent(q);
- stateMachine->start();
- QCoreApplication::processEvents();
- }
- /*!
- * \class QtMaterialDrawer
- */
- QtMaterialDrawer::QtMaterialDrawer(QWidget *parent)
- : QtMaterialOverlayWidget(parent),
- d_ptr(new QtMaterialDrawerPrivate(this))
- {
- d_func()->init();
- }
- QtMaterialDrawer::~QtMaterialDrawer()
- {
- }
- void QtMaterialDrawer::setDrawerWidth(int width)
- {
- Q_D(QtMaterialDrawer);
- d->width = width;
- d->stateMachine->updatePropertyAssignments();
- d->widget->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;
- }
- void QtMaterialDrawer::setAutoRaise(bool state)
- {
- Q_D(QtMaterialDrawer);
- d->autoRaise = state;
- }
- bool QtMaterialDrawer::autoRaise() const
- {
- Q_D(const QtMaterialDrawer);
- return d->autoRaise;
- }
- void QtMaterialDrawer::setOverlayMode(bool value)
- {
- Q_D(QtMaterialDrawer);
- d->overlay = value;
- update();
- }
- bool QtMaterialDrawer::overlayMode() const
- {
- Q_D(const QtMaterialDrawer);
- return d->overlay;
- }
- void QtMaterialDrawer::openDrawer()
- {
- Q_D(QtMaterialDrawer);
- emit d->stateMachine->signalOpen();
- if (d->autoRaise) {
- raise();
- }
- setAttribute(Qt::WA_TransparentForMouseEvents, false);
- setAttribute(Qt::WA_NoSystemBackground, false);
- }
- void QtMaterialDrawer::closeDrawer()
- {
- Q_D(QtMaterialDrawer);
- emit d->stateMachine->signalClose();
- if (d->overlay) {
- setAttribute(Qt::WA_TransparentForMouseEvents);
- setAttribute(Qt::WA_NoSystemBackground);
- }
- }
- bool QtMaterialDrawer::event(QEvent *event)
- {
- Q_D(QtMaterialDrawer);
- switch (event->type())
- {
- case QEvent::Move:
- case QEvent::Resize:
- if (!d->overlay) {
- setMask(QRegion(d->widget->rect()));
- }
- break;
- default:
- break;
- }
- return QtMaterialOverlayWidget::event(event);
- }
- bool QtMaterialDrawer::eventFilter(QObject *obj, QEvent *event)
- {
- Q_D(QtMaterialDrawer);
- 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: {
- QLayout *lw = d->widget->layout();
- if (lw && 16 != lw->contentsMargins().right()) {
- lw->setContentsMargins(0, 0, 16, 0);
- }
- break;
- }
- default:
- break;
- }
- return QtMaterialOverlayWidget::eventFilter(obj, event);
- }
- void QtMaterialDrawer::paintEvent(QPaintEvent *event)
- {
- Q_UNUSED(event)
- Q_D(QtMaterialDrawer);
- if (!d->overlay || d->stateMachine->isInClosedState()) {
- return;
- }
- QPainter painter(this);
- painter.setOpacity(d->stateMachine->opacity());
- painter.fillRect(rect(), Qt::SolidPattern);
- }
|