summary refs log tree commit diff
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2020-01-21 20:41:09 +0100
committerNicolas Werner <nicolas.werner@hotmail.de>2020-01-21 20:41:09 +0100
commitc95f4d82769b9eb5836f0ffbf9f87e054c393cec (patch)
treec8d3b3d9185a7c954e2e8919a634f574a6520e69
parentImprove emoji escaping (diff)
downloadnheko-c95f4d82769b9eb5836f0ffbf9f87e054c393cec.tar.xz
Fix colors in typing display, when username contains emoji
-rw-r--r--resources/qml/Avatar.qml3
-rw-r--r--resources/qml/TimelineView.qml1
-rw-r--r--src/Utils.cpp5
-rw-r--r--src/timeline/TimelineModel.cpp31
4 files changed, 35 insertions, 5 deletions
diff --git a/resources/qml/Avatar.qml b/resources/qml/Avatar.qml

index a53f057b..25fff7f3 100644 --- a/resources/qml/Avatar.qml +++ b/resources/qml/Avatar.qml
@@ -19,7 +19,8 @@ Rectangle { Text { anchors.fill: parent - text: String.fromCodePoint(displayName.codePointAt(0)) + text: chat.model.escapeEmoji(String.fromCodePoint(displayName.codePointAt(0))) + textFormat: Text.RichText color: colors.text font.pixelSize: avatar.height/2 verticalAlignment: Text.AlignVCenter diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index 60a8e6c1..a93f50c0 100644 --- a/resources/qml/TimelineView.qml +++ b/resources/qml/TimelineView.qml
@@ -206,6 +206,7 @@ Item { id: typingDisplay text: chat.model ? chat.model.formatTypingUsers(chat.model.typingUsers, chatFooter.color) : "" + textFormat: Text.RichText color: colors.windowText } } diff --git a/src/Utils.cpp b/src/Utils.cpp
index ab8631f7..911e57fc 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp
@@ -39,7 +39,7 @@ utils::replaceEmoji(const QString &body) QSettings settings; QString userFontFamily = settings.value("user/emoji_font_family", "emoji").toString(); - bool insideFontBlock = true; + bool insideFontBlock = false; for (auto &code : utf32_string) { // TODO: Be more precise here. if ((code >= 0x2600 && code <= 0x27bf) || (code >= 0x1f300 && code <= 0x1f3ff) || @@ -57,6 +57,9 @@ utils::replaceEmoji(const QString &body) } fmtBody += QString::fromUcs4(&code, 1); } + if (insideFontBlock) { + fmtBody += "</font>"; + } return fmtBody; } diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 54e054ec..65a6e470 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp
@@ -1406,9 +1406,34 @@ TimelineModel::formatTypingUsers(const std::vector<QString> &users, QColor bg) QStringList uidWithoutLast; auto formatUser = [this, bg](const QString &user_id) -> QString { - return QString("<font color=\"%1\">%2</font>") - .arg(userColor(user_id, bg).name()) - .arg(escapeEmoji(displayName(user_id).toHtmlEscaped())); + auto uncoloredUsername = escapeEmoji(displayName(user_id).toHtmlEscaped()); + QString prefix = QString("<font color=\"%1\">").arg(userColor(user_id, bg).name()); + + // color only parts that don't have a font already specified + QString coloredUsername; + int index = 0; + do { + auto startIndex = uncoloredUsername.indexOf("<font", index); + + if (startIndex - index != 0) + coloredUsername += + prefix + + uncoloredUsername.midRef( + index, startIndex > 0 ? startIndex - index : -1) + + "</font>"; + + auto endIndex = uncoloredUsername.indexOf("</font>", startIndex); + if (endIndex > 0) + endIndex += sizeof("</font>") - 1; + + if (endIndex - startIndex != 0) + coloredUsername += + uncoloredUsername.midRef(startIndex, endIndex - startIndex); + + index = endIndex; + } while (index > 0 && index < uncoloredUsername.size()); + + return coloredUsername; }; for (size_t i = 0; i + 1 < users.size(); i++) {