muc participant avatars
This commit is contained in:
parent
efc90e18c3
commit
55703c2007
15 changed files with 506 additions and 221 deletions
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
|
||||
#include "rosteritem.h"
|
||||
#include "account.h"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
|
@ -334,40 +335,30 @@ bool Core::RosterItem::isMuc() const
|
|||
return muc;
|
||||
}
|
||||
|
||||
QString Core::RosterItem::avatarHash() const
|
||||
{
|
||||
return archive->getAvatarHash();
|
||||
}
|
||||
|
||||
bool Core::RosterItem::isAvatarAutoGenerated() const
|
||||
{
|
||||
return archive->getAutoAvatar();
|
||||
}
|
||||
|
||||
QString Core::RosterItem::avatarPath() const
|
||||
QString Core::RosterItem::avatarPath(const QString& resource) const
|
||||
{
|
||||
QString path(QStandardPaths::writableLocation(QStandardPaths::CacheLocation));
|
||||
path += "/" + account + "/" + jid + "/avatar." + archive->getAvatarType();
|
||||
path += "/" + account + "/" + jid + "/" + (resource.size() == 0 ? jid : resource);
|
||||
return path;
|
||||
}
|
||||
|
||||
bool Core::RosterItem::hasAvatar() const
|
||||
bool Core::RosterItem::setAvatar(const QByteArray& data, const QString& resource)
|
||||
{
|
||||
return archive->getHasAvatar();
|
||||
}
|
||||
|
||||
void Core::RosterItem::setAvatar(const QByteArray& data)
|
||||
{
|
||||
if (archive->setAvatar(data, false)) {
|
||||
if (archive->getHasAvatar()) {
|
||||
bool result = archive->setAvatar(data, false, resource);
|
||||
if (resource.size() == 0 && result) {
|
||||
if (data.size() == 0) {
|
||||
emit avatarChanged(Shared::Avatar::empty, "");
|
||||
} else {
|
||||
emit avatarChanged(Shared::Avatar::valid, avatarPath());
|
||||
QMimeDatabase db;
|
||||
QMimeType type = db.mimeTypeForData(data);
|
||||
QString ext = type.preferredSuffix();
|
||||
emit avatarChanged(Shared::Avatar::valid, avatarPath(resource) + "." + ext);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void Core::RosterItem::setAutoGeneratedAvatar()
|
||||
bool Core::RosterItem::setAutoGeneratedAvatar(const QString& resource)
|
||||
{
|
||||
QImage image(96, 96, QImage::Format_ARGB32_Premultiplied);
|
||||
QPainter painter(&image);
|
||||
|
@ -383,13 +374,68 @@ void Core::RosterItem::setAutoGeneratedAvatar()
|
|||
} else {
|
||||
painter.setPen(Qt::white);
|
||||
}
|
||||
painter.drawText(image.rect(), Qt::AlignCenter | Qt::AlignVCenter, jid.at(0).toUpper());
|
||||
painter.drawText(image.rect(), Qt::AlignCenter | Qt::AlignVCenter, resource.size() == 0 ? jid.at(0).toUpper() : resource.at(0).toUpper());
|
||||
QByteArray arr;
|
||||
QBuffer stream(&arr);
|
||||
stream.open(QBuffer::WriteOnly);
|
||||
image.save(&stream, "PNG");
|
||||
stream.close();
|
||||
if (archive->setAvatar(arr, true)) {
|
||||
emit avatarChanged(Shared::Avatar::autocreated, avatarPath());
|
||||
bool result = archive->setAvatar(arr, true, resource);
|
||||
if (resource.size() == 0 && result) {
|
||||
emit avatarChanged(Shared::Avatar::autocreated, avatarPath(resource) + ".png");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
bool Core::RosterItem::readAvatarInfo(Archive::AvatarInfo& target, const QString& resource) const
|
||||
{
|
||||
return archive->readAvatarInfo(target, resource);
|
||||
}
|
||||
|
||||
Shared::VCard Core::RosterItem::handleResponseVCard(const QXmppVCardIq& card, const QString& resource)
|
||||
{
|
||||
Archive::AvatarInfo info;
|
||||
bool hasAvatar = readAvatarInfo(info, resource);
|
||||
|
||||
QByteArray ava = card.photo();
|
||||
Shared::VCard vCard;
|
||||
initializeVCard(vCard, card);
|
||||
Shared::Avatar type = Shared::Avatar::empty;
|
||||
QString path = "";
|
||||
|
||||
if (ava.size() > 0) {
|
||||
bool changed = setAvatar(ava, resource);
|
||||
if (changed) {
|
||||
type = Shared::Avatar::valid;
|
||||
QMimeDatabase db;
|
||||
QMimeType type = db.mimeTypeForData(ava);
|
||||
QString ext = type.preferredSuffix();
|
||||
path = avatarPath(resource) + "." + ext;
|
||||
} else if (hasAvatar) {
|
||||
if (info.autogenerated) {
|
||||
type = Shared::Avatar::autocreated;
|
||||
path = avatarPath(resource) + ".png";
|
||||
} else {
|
||||
type = Shared::Avatar::valid;
|
||||
path = avatarPath(resource) + "." + info.type;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!hasAvatar || !info.autogenerated) {
|
||||
setAutoGeneratedAvatar(resource);
|
||||
type = Shared::Avatar::autocreated;
|
||||
path = avatarPath(resource) + ".png";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
vCard.setAvatarType(type);
|
||||
vCard.setAvatarPath(path);
|
||||
|
||||
if (resource.size() == 0) {
|
||||
emit avatarChanged(vCard.getAvatarType(), vCard.getAvatarPath());
|
||||
}
|
||||
|
||||
return vCard;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue