qtmaterialavatar.cpp 6.1 KB

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