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