qtmaterialdrawer.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. #include "qtmaterialdrawer.h"
  2. #include "qtmaterialdrawer_p.h"
  3. #include <QPainter>
  4. #include <QEvent>
  5. #include <QDebug>
  6. #include <QMouseEvent>
  7. #include <QtWidgets/QApplication>
  8. #include <QtWidgets/QLayout>
  9. #include <QLinearGradient>
  10. #include <QtWidgets/QVBoxLayout>
  11. #include "qtmaterialdrawer_internal.h"
  12. /*!
  13. * \class QtMaterialDrawerPrivate
  14. * \internal
  15. */
  16. /*!
  17. * \internal
  18. */
  19. QtMaterialDrawerPrivate::QtMaterialDrawerPrivate(QtMaterialDrawer *q)
  20. : q_ptr(q)
  21. {
  22. }
  23. /*!
  24. * \internal
  25. */
  26. QtMaterialDrawerPrivate::~QtMaterialDrawerPrivate()
  27. {
  28. }
  29. /*!
  30. * \internal
  31. */
  32. void QtMaterialDrawerPrivate::init()
  33. {
  34. Q_Q(QtMaterialDrawer);
  35. widget = new QtMaterialDrawerWidget;
  36. stateMachine = new QtMaterialDrawerStateMachine(widget, q);
  37. window = new QWidget;
  38. width = 250;
  39. clickToClose = false;
  40. autoRaise = true;
  41. closed = true;
  42. overlay = false;
  43. QVBoxLayout *layout = new QVBoxLayout;
  44. layout->addWidget(window);
  45. widget->setLayout(layout);
  46. widget->setFixedWidth(width+16);
  47. widget->setParent(q);
  48. stateMachine->start();
  49. QCoreApplication::processEvents();
  50. }
  51. /*!
  52. * \class QtMaterialDrawer
  53. */
  54. QtMaterialDrawer::QtMaterialDrawer(QWidget *parent)
  55. : QtMaterialOverlayWidget(parent),
  56. d_ptr(new QtMaterialDrawerPrivate(this))
  57. {
  58. d_func()->init();
  59. }
  60. QtMaterialDrawer::~QtMaterialDrawer()
  61. {
  62. }
  63. void QtMaterialDrawer::setDrawerWidth(int width)
  64. {
  65. Q_D(QtMaterialDrawer);
  66. d->width = width;
  67. d->stateMachine->updatePropertyAssignments();
  68. d->widget->setFixedWidth(width+16);
  69. }
  70. int QtMaterialDrawer::drawerWidth() const
  71. {
  72. Q_D(const QtMaterialDrawer);
  73. return d->width;
  74. }
  75. void QtMaterialDrawer::setDrawerLayout(QLayout *layout)
  76. {
  77. Q_D(QtMaterialDrawer);
  78. d->window->setLayout(layout);
  79. }
  80. QLayout *QtMaterialDrawer::drawerLayout() const
  81. {
  82. Q_D(const QtMaterialDrawer);
  83. return d->window->layout();
  84. }
  85. void QtMaterialDrawer::setClickOutsideToClose(bool state)
  86. {
  87. Q_D(QtMaterialDrawer);
  88. d->clickToClose = state;
  89. }
  90. bool QtMaterialDrawer::clickOutsideToClose() const
  91. {
  92. Q_D(const QtMaterialDrawer);
  93. return d->clickToClose;
  94. }
  95. void QtMaterialDrawer::setAutoRaise(bool state)
  96. {
  97. Q_D(QtMaterialDrawer);
  98. d->autoRaise = state;
  99. }
  100. bool QtMaterialDrawer::autoRaise() const
  101. {
  102. Q_D(const QtMaterialDrawer);
  103. return d->autoRaise;
  104. }
  105. void QtMaterialDrawer::setOverlayMode(bool value)
  106. {
  107. Q_D(QtMaterialDrawer);
  108. d->overlay = value;
  109. update();
  110. }
  111. bool QtMaterialDrawer::overlayMode() const
  112. {
  113. Q_D(const QtMaterialDrawer);
  114. return d->overlay;
  115. }
  116. void QtMaterialDrawer::openDrawer()
  117. {
  118. Q_D(QtMaterialDrawer);
  119. emit d->stateMachine->signalOpen();
  120. if (d->autoRaise) {
  121. raise();
  122. }
  123. setAttribute(Qt::WA_TransparentForMouseEvents, false);
  124. setAttribute(Qt::WA_NoSystemBackground, false);
  125. }
  126. void QtMaterialDrawer::closeDrawer()
  127. {
  128. Q_D(QtMaterialDrawer);
  129. emit d->stateMachine->signalClose();
  130. if (d->overlay) {
  131. setAttribute(Qt::WA_TransparentForMouseEvents);
  132. setAttribute(Qt::WA_NoSystemBackground);
  133. }
  134. }
  135. bool QtMaterialDrawer::event(QEvent *event)
  136. {
  137. Q_D(QtMaterialDrawer);
  138. switch (event->type())
  139. {
  140. case QEvent::Move:
  141. case QEvent::Resize:
  142. if (!d->overlay) {
  143. setMask(QRegion(d->widget->rect()));
  144. }
  145. break;
  146. default:
  147. break;
  148. }
  149. return QtMaterialOverlayWidget::event(event);
  150. }
  151. bool QtMaterialDrawer::eventFilter(QObject *obj, QEvent *event)
  152. {
  153. Q_D(QtMaterialDrawer);
  154. switch (event->type())
  155. {
  156. case QEvent::MouseButtonPress: {
  157. QMouseEvent *mouseEvent;
  158. if ((mouseEvent = static_cast<QMouseEvent *>(event))) {
  159. const bool canClose = d->clickToClose || d->overlay;
  160. if (!d->widget->geometry().contains(mouseEvent->pos()) && canClose) {
  161. closeDrawer();
  162. }
  163. }
  164. break;
  165. }
  166. case QEvent::Move:
  167. case QEvent::Resize: {
  168. QLayout *lw = d->widget->layout();
  169. if (lw && 16 != lw->contentsMargins().right()) {
  170. lw->setContentsMargins(0, 0, 16, 0);
  171. }
  172. break;
  173. }
  174. default:
  175. break;
  176. }
  177. return QtMaterialOverlayWidget::eventFilter(obj, event);
  178. }
  179. void QtMaterialDrawer::paintEvent(QPaintEvent *event)
  180. {
  181. Q_UNUSED(event)
  182. Q_D(QtMaterialDrawer);
  183. if (!d->overlay || d->stateMachine->isInClosedState()) {
  184. return;
  185. }
  186. QPainter painter(this);
  187. painter.setOpacity(d->stateMachine->opacity());
  188. painter.fillRect(rect(), Qt::SolidPattern);
  189. }