Handle surrogate pairs in avatars

This commit is contained in:
Konstantinos Sideris 2018-01-12 10:21:53 +02:00
parent 8beef5e61f
commit 5b09c8e652
6 changed files with 25 additions and 13 deletions

View File

@ -17,4 +17,9 @@ descriptiveTime(const QDateTime &then);
//! in the RoomList.
DescInfo
getMessageDescription(const TimelineEvent &event, const QString &localUser);
//! Get the first character of a string, taking into account that
//! surrogate pairs might be in use.
QString
firstChar(const QString &input);
}

View File

@ -21,7 +21,7 @@ public:
void setBackgroundColor(const QColor &color);
void setIcon(const QIcon &icon);
void setImage(const QImage &image);
void setLetter(const QChar &letter);
void setLetter(const QString &letter);
void setSize(int size);
void setTextColor(const QColor &color);
@ -38,7 +38,7 @@ private:
void init();
ui::AvatarType type_;
QChar letter_;
QString letter_;
QColor background_color_;
QColor text_color_;
QIcon icon_;

View File

@ -28,6 +28,7 @@
#include "RoomInfoListItem.h"
#include "RoomSettings.h"
#include "Theme.h"
#include "Utils.h"
constexpr int Padding = 7;
constexpr int IconSize = 48;
@ -244,7 +245,8 @@ RoomInfoListItem::paintEvent(QPaintEvent *event)
p.setFont(font);
p.setPen(QColor("#333"));
p.setBrush(Qt::NoBrush);
p.drawText(avatarRegion.translated(0, -1), Qt::AlignCenter, QChar(roomName()[0]));
p.drawText(
avatarRegion.translated(0, -1), Qt::AlignCenter, utils::firstChar(roomName()));
} else {
p.save();

View File

@ -27,6 +27,7 @@
#include "OverlayModal.h"
#include "RoomSettings.h"
#include "TopRoomBar.h"
#include "Utils.h"
TopRoomBar::TopRoomBar(QWidget *parent)
: QWidget(parent)
@ -40,7 +41,7 @@ TopRoomBar::TopRoomBar(QWidget *parent)
topLayout_->setMargin(10);
avatar_ = new Avatar(this);
avatar_->setLetter(QChar('?'));
avatar_->setLetter("");
avatar_->setSize(35);
textLayout_ = new QVBoxLayout();
@ -169,12 +170,7 @@ TopRoomBar::closeLeaveRoomDialog(bool leaving)
void
TopRoomBar::updateRoomAvatarFromName(const QString &name)
{
QChar letter = '?';
if (name.size() > 0)
letter = name[0];
avatar_->setLetter(letter);
avatar_->setLetter(utils::firstChar(name));
update();
}
@ -183,7 +179,7 @@ TopRoomBar::reset()
{
nameLabel_->setText("");
topicLabel_->setText("");
avatar_->setLetter(QChar('?'));
avatar_->setLetter("");
roomName_.clear();
roomTopic_.clear();

View File

@ -119,3 +119,12 @@ utils::getMessageDescription(const TimelineEvent &event, const QString &localUse
return DescInfo{};
}
QString
utils::firstChar(const QString &input)
{
if (!input.isEmpty())
return QString::fromUcs4(&input.toUcs4().at(0), 1);
return input;
}

View File

@ -7,7 +7,7 @@ Avatar::Avatar(QWidget *parent)
{
size_ = ui::AvatarSize;
type_ = ui::AvatarType::Letter;
letter_ = QChar('A');
letter_ = "A";
QFont _font(font());
_font.setPointSizeF(ui::FontSize);
@ -79,7 +79,7 @@ Avatar::setSize(int size)
}
void
Avatar::setLetter(const QChar &letter)
Avatar::setLetter(const QString &letter)
{
letter_ = letter;
type_ = ui::AvatarType::Letter;