qtmaterialsnackbar.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. #include "qtmaterialsnackbar.h"
  2. #include "qtmaterialsnackbar_p.h"
  3. #include <QtWidgets/QApplication>
  4. #include <QPainter>
  5. #include "qtmaterialsnackbar_internal.h"
  6. #include "lib/qtmaterialstyle.h"
  7. #include "lib/qtmaterialstatetransition.h"
  8. #include <QDebug>
  9. /*!
  10. * \class QtMaterialSnackbarPrivate
  11. * \internal
  12. */
  13. QtMaterialSnackbarPrivate::QtMaterialSnackbarPrivate(QtMaterialSnackbar *q)
  14. : q_ptr(q)
  15. {
  16. }
  17. QtMaterialSnackbarPrivate::~QtMaterialSnackbarPrivate()
  18. {
  19. }
  20. void QtMaterialSnackbarPrivate::init()
  21. {
  22. Q_Q(QtMaterialSnackbar);
  23. stateMachine = new QtMaterialSnackbarStateMachine(q);
  24. bgOpacity = 0.9;
  25. duration = 3000;
  26. boxWidth = 300;
  27. clickDismiss = false;
  28. useThemeColors = true;
  29. q->setAttribute(Qt::WA_TransparentForMouseEvents);
  30. QFont font("Roboto", 10, QFont::Medium);
  31. font.setCapitalization(QFont::AllUppercase);
  32. q->setFont(font);
  33. stateMachine->start();
  34. QCoreApplication::processEvents();
  35. }
  36. /*!
  37. * \class QtMaterialSnackbar
  38. */
  39. QtMaterialSnackbar::QtMaterialSnackbar(QWidget *parent)
  40. : QtMaterialOverlayWidget(parent),
  41. d_ptr(new QtMaterialSnackbarPrivate(this))
  42. {
  43. d_func()->init();
  44. }
  45. QtMaterialSnackbar::~QtMaterialSnackbar()
  46. {
  47. }
  48. void QtMaterialSnackbar::setAutoHideDuration(int duration)
  49. {
  50. Q_D(QtMaterialSnackbar);
  51. d->duration = duration;
  52. }
  53. int QtMaterialSnackbar::autoHideDuration() const
  54. {
  55. Q_D(const QtMaterialSnackbar);
  56. return d->duration;
  57. }
  58. void QtMaterialSnackbar::setUseThemeColors(bool value)
  59. {
  60. Q_D(QtMaterialSnackbar);
  61. if (d->useThemeColors == value) {
  62. return;
  63. }
  64. d->useThemeColors = value;
  65. update();
  66. }
  67. bool QtMaterialSnackbar::useThemeColors() const
  68. {
  69. Q_D(const QtMaterialSnackbar);
  70. return d->useThemeColors;
  71. }
  72. void QtMaterialSnackbar::setBackgroundColor(const QColor &color)
  73. {
  74. Q_D(QtMaterialSnackbar);
  75. d->backgroundColor = color;
  76. MATERIAL_DISABLE_THEME_COLORS
  77. update();
  78. }
  79. QColor QtMaterialSnackbar::backgroundColor() const
  80. {
  81. Q_D(const QtMaterialSnackbar);
  82. if (d->useThemeColors || !d->backgroundColor.isValid()) {
  83. return QtMaterialStyle::instance().themeColor("text");
  84. } else {
  85. return d->backgroundColor;
  86. }
  87. }
  88. void QtMaterialSnackbar::setBackgroundOpacity(qreal opacity)
  89. {
  90. Q_D(QtMaterialSnackbar);
  91. d->bgOpacity = opacity;
  92. update();
  93. }
  94. qreal QtMaterialSnackbar::backgroundOpacity() const
  95. {
  96. Q_D(const QtMaterialSnackbar);
  97. return d->bgOpacity;
  98. }
  99. void QtMaterialSnackbar::setTextColor(const QColor &color)
  100. {
  101. Q_D(QtMaterialSnackbar);
  102. d->textColor = color;
  103. MATERIAL_DISABLE_THEME_COLORS
  104. update();
  105. }
  106. QColor QtMaterialSnackbar::textColor() const
  107. {
  108. Q_D(const QtMaterialSnackbar);
  109. if (d->useThemeColors || !d->textColor.isValid()) {
  110. return QtMaterialStyle::instance().themeColor("canvas");
  111. } else {
  112. return d->textColor;
  113. }
  114. }
  115. void QtMaterialSnackbar::setFontSize(qreal size)
  116. {
  117. QFont f(font());
  118. f.setPointSizeF(size);
  119. setFont(f);
  120. update();
  121. }
  122. qreal QtMaterialSnackbar::fontSize() const
  123. {
  124. return font().pointSizeF();
  125. }
  126. void QtMaterialSnackbar::setBoxWidth(int width)
  127. {
  128. Q_D(QtMaterialSnackbar);
  129. d->boxWidth = width;
  130. update();
  131. }
  132. int QtMaterialSnackbar::boxWidth() const
  133. {
  134. Q_D(const QtMaterialSnackbar);
  135. return d->boxWidth;
  136. }
  137. void QtMaterialSnackbar::setClickToDismissMode(bool value)
  138. {
  139. Q_D(QtMaterialSnackbar);
  140. d->clickDismiss = value;
  141. }
  142. bool QtMaterialSnackbar::clickToDismissMode() const
  143. {
  144. Q_D(const QtMaterialSnackbar);
  145. return d->clickDismiss;
  146. }
  147. void QtMaterialSnackbar::addMessage(const QString &message)
  148. {
  149. Q_D(QtMaterialSnackbar);
  150. d->messages.push_back(message);
  151. d->stateMachine->postEvent(new QtMaterialStateTransitionEvent(SnackbarShowTransition));
  152. raise();
  153. }
  154. void QtMaterialSnackbar::addInstantMessage(const QString &message)
  155. {
  156. Q_D(QtMaterialSnackbar);
  157. if (d->messages.isEmpty()) {
  158. d->messages.push_back(message);
  159. } else {
  160. d->messages.insert(1, message);
  161. }
  162. d->stateMachine->progress();
  163. }
  164. void QtMaterialSnackbar::dequeue()
  165. {
  166. Q_D(QtMaterialSnackbar);
  167. if (d->messages.isEmpty()) {
  168. return;
  169. }
  170. d->messages.removeFirst();
  171. if (!d->messages.isEmpty()) {
  172. d->stateMachine->postEvent(new QtMaterialStateTransitionEvent(SnackbarNextTransition));
  173. } else {
  174. d->stateMachine->postEvent(new QtMaterialStateTransitionEvent(SnackbarWaitTransition));
  175. }
  176. }
  177. void QtMaterialSnackbar::paintEvent(QPaintEvent *event)
  178. {
  179. Q_UNUSED(event)
  180. Q_D(QtMaterialSnackbar);
  181. if (d->messages.isEmpty()) {
  182. return;
  183. }
  184. QString message = d->messages.first();
  185. QPainter painter(this);
  186. painter.setRenderHint(QPainter::Antialiasing);
  187. QBrush brush;
  188. brush.setStyle(Qt::SolidPattern);
  189. brush.setColor(backgroundColor());
  190. painter.setBrush(brush);
  191. painter.setOpacity(d->bgOpacity);
  192. QRect r(0, 0, d->boxWidth, 40);
  193. painter.setPen(Qt::white);
  194. QRect br = painter.boundingRect(r, Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap, message);
  195. painter.setPen(Qt::NoPen);
  196. r = br.united(r).adjusted(-10, -10, 10, 20);
  197. const qreal s = 1-d->stateMachine->offset();
  198. painter.translate((width()-(r.width()-20))/2,
  199. height()+10-s*(r.height()));
  200. br.moveCenter(r.center());
  201. painter.drawRoundedRect(r.adjusted(0, 0, 0, 3), 3, 3);
  202. painter.setPen(textColor());
  203. painter.drawText(br, Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap, message);
  204. }