qtmaterialbadge.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. #include "qtmaterialbadge.h"
  2. #include "qtmaterialbadge_p.h"
  3. #include <QPainter>
  4. #include "lib/qtmaterialstyle.h"
  5. /*!
  6. * \class QtMaterialBadgePrivate
  7. * \internal
  8. */
  9. /*!
  10. * \internal
  11. */
  12. QtMaterialBadgePrivate::QtMaterialBadgePrivate(QtMaterialBadge *q)
  13. : q_ptr(q)
  14. {
  15. }
  16. /*!
  17. * \internal
  18. */
  19. QtMaterialBadgePrivate::~QtMaterialBadgePrivate()
  20. {
  21. }
  22. /*!
  23. * \internal
  24. */
  25. void QtMaterialBadgePrivate::init()
  26. {
  27. Q_Q(QtMaterialBadge);
  28. x = 0;
  29. y = 0;
  30. padding = 10;
  31. useThemeColors = true;
  32. q->setAttribute(Qt::WA_TransparentForMouseEvents);
  33. QFont font(q->font());
  34. font.setPointSizeF(10);
  35. font.setStyleName("Bold");
  36. q->setFont(font);
  37. q->setText("+1");
  38. }
  39. /*!
  40. * \class QtMaterialBadge
  41. */
  42. QtMaterialBadge::QtMaterialBadge(QWidget *parent)
  43. : QtMaterialOverlayWidget(parent),
  44. d_ptr(new QtMaterialBadgePrivate(this))
  45. {
  46. d_func()->init();
  47. }
  48. QtMaterialBadge::QtMaterialBadge(const QIcon &icon, QWidget *parent)
  49. : QtMaterialOverlayWidget(parent),
  50. d_ptr(new QtMaterialBadgePrivate(this))
  51. {
  52. d_func()->init();
  53. setIcon(icon);
  54. }
  55. QtMaterialBadge::QtMaterialBadge(const QString &text, QWidget *parent)
  56. : QtMaterialOverlayWidget(parent),
  57. d_ptr(new QtMaterialBadgePrivate(this))
  58. {
  59. d_func()->init();
  60. setText(text);
  61. }
  62. QtMaterialBadge::~QtMaterialBadge()
  63. {
  64. }
  65. void QtMaterialBadge::setUseThemeColors(bool value)
  66. {
  67. Q_D(QtMaterialBadge);
  68. if (d->useThemeColors == value) {
  69. return;
  70. }
  71. d->useThemeColors = value;
  72. update();
  73. }
  74. bool QtMaterialBadge::useThemeColors() const
  75. {
  76. Q_D(const QtMaterialBadge);
  77. return d->useThemeColors;
  78. }
  79. void QtMaterialBadge::setTextColor(const QColor &color)
  80. {
  81. Q_D(QtMaterialBadge);
  82. d->textColor = color;
  83. MATERIAL_DISABLE_THEME_COLORS
  84. update();
  85. }
  86. QColor QtMaterialBadge::textColor() const
  87. {
  88. Q_D(const QtMaterialBadge);
  89. if (d->useThemeColors || !d->textColor.isValid()) {
  90. return QtMaterialStyle::instance().themeColor("canvas");
  91. } else {
  92. return d->textColor;
  93. }
  94. }
  95. void QtMaterialBadge::setBackgroundColor(const QColor &color)
  96. {
  97. Q_D(QtMaterialBadge);
  98. d->backgroundColor = color;
  99. MATERIAL_DISABLE_THEME_COLORS
  100. update();
  101. }
  102. QColor QtMaterialBadge::backgroundColor() const
  103. {
  104. Q_D(const QtMaterialBadge);
  105. if (d->useThemeColors || !d->backgroundColor.isValid()) {
  106. return QtMaterialStyle::instance().themeColor("accent1");
  107. } else {
  108. return d->backgroundColor;
  109. }
  110. }
  111. void QtMaterialBadge::setRelativePosition(const QPointF &pos)
  112. {
  113. setRelativePosition(pos.x(), pos.y());
  114. }
  115. void QtMaterialBadge::setRelativePosition(qreal x, qreal y)
  116. {
  117. Q_D(QtMaterialBadge);
  118. d->x = x;
  119. d->y = y;
  120. update();
  121. }
  122. QPointF QtMaterialBadge::relativePosition() const
  123. {
  124. Q_D(const QtMaterialBadge);
  125. return QPointF(d->x, d->y);
  126. }
  127. void QtMaterialBadge::setRelativeXPosition(qreal x)
  128. {
  129. Q_D(QtMaterialBadge);
  130. d->x = x;
  131. update();
  132. }
  133. qreal QtMaterialBadge::relativeXPosition() const
  134. {
  135. Q_D(const QtMaterialBadge);
  136. return d->x;
  137. }
  138. void QtMaterialBadge::setRelativeYPosition(qreal y)
  139. {
  140. Q_D(QtMaterialBadge);
  141. d->y = y;
  142. update();
  143. }
  144. qreal QtMaterialBadge::relativeYPosition() const
  145. {
  146. Q_D(const QtMaterialBadge);
  147. return d->y;
  148. }
  149. /*!
  150. * \reimp
  151. */
  152. QSize QtMaterialBadge::sizeHint() const
  153. {
  154. const int s = getDiameter();
  155. return QSize(s+4, s+4);
  156. }
  157. void QtMaterialBadge::setIcon(const QIcon &icon)
  158. {
  159. Q_D(QtMaterialBadge);
  160. d->icon = icon;
  161. update();
  162. }
  163. QIcon QtMaterialBadge::icon() const
  164. {
  165. Q_D(const QtMaterialBadge);
  166. return d->icon;
  167. }
  168. void QtMaterialBadge::setText(const QString &text)
  169. {
  170. Q_D(QtMaterialBadge);
  171. d->text = text;
  172. if (!d->icon.isNull()) {
  173. d->icon = QIcon();
  174. }
  175. d->size = fontMetrics().size(Qt::TextShowMnemonic, text);
  176. update();
  177. }
  178. QString QtMaterialBadge::text() const
  179. {
  180. Q_D(const QtMaterialBadge);
  181. return d->text;
  182. }
  183. /*!
  184. * \reimp
  185. */
  186. void QtMaterialBadge::paintEvent(QPaintEvent *event)
  187. {
  188. Q_UNUSED(event)
  189. Q_D(QtMaterialBadge);
  190. QPainter painter(this);
  191. painter.setRenderHint(QPainter::Antialiasing);
  192. painter.translate(d->x, d->y);
  193. QBrush brush;
  194. brush.setStyle(Qt::SolidPattern);
  195. brush.setColor(isEnabled() ? backgroundColor()
  196. : QtMaterialStyle::instance().themeColor("disabled"));
  197. painter.setBrush(brush);
  198. painter.setPen(Qt::NoPen);
  199. const int s = getDiameter();
  200. QRectF r(0, 0, s, s);
  201. r.translate(QPointF((width()-s), (height()-s))/2);
  202. if (d->icon.isNull())
  203. {
  204. painter.drawEllipse(r);
  205. painter.setPen(textColor());
  206. painter.setBrush(Qt::NoBrush);
  207. painter.drawText(r.translated(0, -0.5), Qt::AlignCenter, d->text);
  208. }
  209. else
  210. {
  211. painter.drawEllipse(r);
  212. QRectF q(0, 0, 16, 16);
  213. q.moveCenter(r.center());
  214. QPixmap pixmap = icon().pixmap(16, 16);
  215. QPainter icon(&pixmap);
  216. icon.setCompositionMode(QPainter::CompositionMode_SourceIn);
  217. icon.fillRect(pixmap.rect(), textColor());
  218. painter.drawPixmap(q.toRect(), pixmap);
  219. }
  220. }
  221. int QtMaterialBadge::getDiameter() const
  222. {
  223. Q_D(const QtMaterialBadge);
  224. if (d->icon.isNull()) {
  225. return qMax(d->size.width(), d->size.height()) + d->padding;
  226. } else {
  227. return 24;
  228. }
  229. }