Skip to content

Commit

Permalink
Merge pull request #298 from a-andreyev/aa13q-fancy-colors
Browse files Browse the repository at this point in the history
Provide a colour code for the user
  • Loading branch information
KitsuneRal authored May 13, 2019
2 parents 1a03462 + 74fa9bc commit fc8a8bb
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
28 changes: 27 additions & 1 deletion lib/user.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@
#include <QtCore/QStringBuilder>
#include <QtCore/QElapsedTimer>

#include <QtCore/QCryptographicHash>
#include <QtCore/QtEndian>

#include <functional>

using namespace QMatrixClient;
Expand All @@ -47,8 +50,21 @@ class User::Private
return Avatar(move(url));
}

qreal makeHueF(QString userId)
{
QByteArray hash = QCryptographicHash::hash(userId.toUtf8(),
QCryptographicHash::Sha1);
QDataStream dataStream(qToLittleEndian(hash).left(2));
dataStream.setByteOrder(QDataStream::LittleEndian);
quint16 hashValue;
dataStream >> hashValue;
qreal hueF = static_cast<qreal>(hashValue)/std::numeric_limits<quint16>::max();
Q_ASSERT((0 <= hueF) && (hueF <= 1));
return hueF;
}

Private(QString userId, Connection* connection)
: userId(move(userId)), connection(connection)
: userId(move(userId)), connection(connection), hueF(makeHueF(userId))
{ }

QString userId;
Expand All @@ -57,6 +73,7 @@ class User::Private
QString bridged;
QString mostUsedName;
QMultiHash<QString, const Room*> otherNames;
qreal hueF;
Avatar mostUsedAvatar { makeAvatar({}) };
std::vector<Avatar> otherAvatars;
auto otherAvatar(const QUrl& url)
Expand Down Expand Up @@ -222,6 +239,11 @@ bool User::isGuest() const
return *it == ':';
}

int User::hue() const
{
return int(hueF()*359);
}

QString User::name(const Room* room) const
{
return d->nameForRoom(room);
Expand Down Expand Up @@ -428,3 +450,7 @@ void User::processEvent(const RoomMemberEvent& event, const Room* room,
updateAvatarUrl(event.avatarUrl(), d->avatarUrlForRoom(room), room);
}
}

qreal User::hueF() const {
return d->hueF;
}
11 changes: 11 additions & 0 deletions lib/user.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ namespace QMatrixClient
Q_OBJECT
Q_PROPERTY(QString id READ id CONSTANT)
Q_PROPERTY(bool isGuest READ isGuest CONSTANT)
Q_PROPERTY(int hue READ hue CONSTANT)
Q_PROPERTY(qreal hueF READ hueF CONSTANT)
Q_PROPERTY(QString name READ name NOTIFY nameChanged)
Q_PROPERTY(QString displayName READ displayname NOTIFY nameChanged STORED false)
Q_PROPERTY(QString fullName READ fullName NOTIFY nameChanged STORED false)
Expand Down Expand Up @@ -95,6 +97,15 @@ namespace QMatrixClient
*/
bool isGuest() const;

/** Hue color component of this user based on id.
* The implementation is based on XEP-0392:
* https://xmpp.org/extensions/xep-0392.html
* Naming and ranges are the same as QColor's hue methods:
* https://doc.qt.io/qt-5/qcolor.html#integer-vs-floating-point-precision
*/
int hue() const;
qreal hueF() const;

const Avatar& avatarObject(const Room* room = nullptr) const;
Q_INVOKABLE QImage avatar(int dimension, const Room* room = nullptr);
Q_INVOKABLE QImage avatar(int requestedWidth, int requestedHeight,
Expand Down

0 comments on commit fc8a8bb

Please sign in to comment.