mirror of https://github.com/Nheko-Reborn/nheko
parent
0d42909e40
commit
8a329d6517
@ -1,168 +0,0 @@ |
||||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#include <QPainter> |
||||
#include <QPainterPath> |
||||
#include <QSettings> |
||||
|
||||
#include "AvatarProvider.h" |
||||
#include "Utils.h" |
||||
#include "ui/Avatar.h" |
||||
|
||||
Avatar::Avatar(QWidget *parent, int size) |
||||
: QWidget(parent) |
||||
, size_(size) |
||||
{ |
||||
type_ = ui::AvatarType::Letter; |
||||
letter_ = "A"; |
||||
|
||||
QFont _font(font()); |
||||
_font.setPointSizeF(ui::FontSize); |
||||
setFont(_font); |
||||
|
||||
QSizePolicy policy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); |
||||
setSizePolicy(policy); |
||||
} |
||||
|
||||
QColor |
||||
Avatar::textColor() const |
||||
{ |
||||
if (!text_color_.isValid()) |
||||
return QColor("black"); |
||||
|
||||
return text_color_; |
||||
} |
||||
|
||||
QColor |
||||
Avatar::backgroundColor() const |
||||
{ |
||||
if (!text_color_.isValid()) |
||||
return QColor("white"); |
||||
|
||||
return background_color_; |
||||
} |
||||
|
||||
QSize |
||||
Avatar::sizeHint() const |
||||
{ |
||||
return QSize(size_ + 2, size_ + 2); |
||||
} |
||||
|
||||
void |
||||
Avatar::setTextColor(const QColor &color) |
||||
{ |
||||
text_color_ = color; |
||||
} |
||||
|
||||
void |
||||
Avatar::setBackgroundColor(const QColor &color) |
||||
{ |
||||
background_color_ = color; |
||||
} |
||||
|
||||
void |
||||
Avatar::setLetter(const QString &letter) |
||||
{ |
||||
letter_ = letter; |
||||
type_ = ui::AvatarType::Letter; |
||||
update(); |
||||
} |
||||
|
||||
void |
||||
Avatar::setImage(const QString &avatar_url) |
||||
{ |
||||
avatar_url_ = avatar_url; |
||||
AvatarProvider::resolve(avatar_url, |
||||
static_cast<int>(size_ * pixmap_.devicePixelRatio()), |
||||
this, |
||||
[this, requestedRatio = pixmap_.devicePixelRatio()](QPixmap pm) { |
||||
if (pm.isNull()) |
||||
return; |
||||
type_ = ui::AvatarType::Image; |
||||
pixmap_ = pm; |
||||
pixmap_.setDevicePixelRatio(requestedRatio); |
||||
update(); |
||||
}); |
||||
} |
||||
|
||||
void |
||||
Avatar::setImage(const QString &room, const QString &user) |
||||
{ |
||||
room_ = room; |
||||
user_ = user; |
||||
AvatarProvider::resolve(room, |
||||
user, |
||||
static_cast<int>(size_ * pixmap_.devicePixelRatio()), |
||||
this, |
||||
[this, requestedRatio = pixmap_.devicePixelRatio()](QPixmap pm) { |
||||
if (pm.isNull()) |
||||
return; |
||||
type_ = ui::AvatarType::Image; |
||||
pixmap_ = pm; |
||||
pixmap_.setDevicePixelRatio(requestedRatio); |
||||
update(); |
||||
}); |
||||
} |
||||
|
||||
void |
||||
Avatar::setDevicePixelRatio(double ratio) |
||||
{ |
||||
if (type_ == ui::AvatarType::Image && abs(pixmap_.devicePixelRatio() - ratio) > 0.01) { |
||||
pixmap_ = pixmap_.scaled(QSize(size_, size_) * ratio); |
||||
pixmap_.setDevicePixelRatio(ratio); |
||||
|
||||
if (!avatar_url_.isEmpty()) |
||||
setImage(avatar_url_); |
||||
else |
||||
setImage(room_, user_); |
||||
} |
||||
} |
||||
|
||||
void |
||||
Avatar::paintEvent(QPaintEvent *) |
||||
{ |
||||
bool rounded = QSettings().value(QStringLiteral("user/avatar_circles"), true).toBool(); |
||||
|
||||
QPainter painter(this); |
||||
|
||||
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | |
||||
QPainter::TextAntialiasing); |
||||
|
||||
QRectF r = rect(); |
||||
const int hs = size_ / 2; |
||||
|
||||
if (type_ != ui::AvatarType::Image) { |
||||
QBrush brush; |
||||
brush.setStyle(Qt::SolidPattern); |
||||
brush.setColor(backgroundColor()); |
||||
|
||||
painter.setPen(Qt::NoPen); |
||||
painter.setBrush(brush); |
||||
rounded ? painter.drawEllipse(r) : painter.drawRoundedRect(r, 3, 3); |
||||
} else if (painter.isActive()) { |
||||
setDevicePixelRatio(painter.device()->devicePixelRatioF()); |
||||
} |
||||
|
||||
switch (type_) { |
||||
case ui::AvatarType::Image: { |
||||
QPainterPath ppath; |
||||
|
||||
rounded ? ppath.addEllipse(width() / 2 - hs, height() / 2 - hs, size_, size_) |
||||
: ppath.addRoundedRect(r, 3, 3); |
||||
|
||||
painter.setClipPath(ppath); |
||||
painter.drawPixmap(QRect(width() / 2 - hs, height() / 2 - hs, size_, size_), |
||||
pixmap_); |
||||
break; |
||||
} |
||||
case ui::AvatarType::Letter: { |
||||
painter.setPen(textColor()); |
||||
painter.setBrush(Qt::NoBrush); |
||||
painter.drawText(r.translated(0, -1), Qt::AlignCenter, letter_); |
||||
break; |
||||
} |
||||
default: |
||||
break; |
||||
} |
||||
} |
@ -1,48 +0,0 @@ |
||||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#pragma once |
||||
|
||||
#include <QImage> |
||||
#include <QPixmap> |
||||
#include <QWidget> |
||||
|
||||
#include "Theme.h" |
||||
|
||||
class Avatar : public QWidget |
||||
{ |
||||
Q_OBJECT |
||||
|
||||
Q_PROPERTY(QColor textColor WRITE setTextColor READ textColor) |
||||
Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor) |
||||
|
||||
public: |
||||
explicit Avatar(QWidget *parent = nullptr, int size = ui::AvatarSize); |
||||
|
||||
void setBackgroundColor(const QColor &color); |
||||
void setImage(const QString &avatar_url); |
||||
void setImage(const QString &room, const QString &user); |
||||
void setLetter(const QString &letter); |
||||
void setTextColor(const QColor &color); |
||||
void setDevicePixelRatio(double ratio); |
||||
|
||||
QColor backgroundColor() const; |
||||
QColor textColor() const; |
||||
|
||||
QSize sizeHint() const override; |
||||
|
||||
protected: |
||||
void paintEvent(QPaintEvent *event) override; |
||||
|
||||
private: |
||||
void init(); |
||||
|
||||
ui::AvatarType type_; |
||||
QString letter_; |
||||
QString avatar_url_, room_, user_; |
||||
QColor background_color_; |
||||
QColor text_color_; |
||||
QPixmap pixmap_; |
||||
int size_; |
||||
}; |
Loading…
Reference in new issue