summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorKitty Barnett <develop@catznip.com>2022-11-02 14:25:27 +0100
committerKitty Barnett <develop@catznip.com>2022-10-23 16:26:49 +0200
commit063fe5953ada75177c1668f8b805cd9b79724581 (patch)
treecab925248944d72161c077ff1ce60a473d89c231 /indra
parentcf2afdc541b540582650f89c6b95aacfeaef516f (diff)
Create a separate segment for emoji characters so that we can display them in a slightly larger font size than the surrounding text
Diffstat (limited to 'indra')
-rw-r--r--indra/llui/lltextbase.cpp49
-rw-r--r--indra/llui/lltextbase.h12
2 files changed, 58 insertions, 3 deletions
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 0447e7070c..2a6e6901e4 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -2302,6 +2302,36 @@ void LLTextBase::appendWidget(const LLInlineViewSegment::Params& params, const s
insertStringNoUndo(getLength(), widget_wide_text, &segments);
}
+void LLTextBase::createTextWithEmojiSegment(const LLWString& text, S32 segment_start, LLStyleConstSP style, segment_vec_t& segments)
+{
+ LLStyleSP emoji_style;
+
+ S32 text_start = 0, text_kitty = 0, text_len = text.size();
+ for (; text_kitty < text_len; text_kitty++)
+ {
+ if (LLStringOps::isEmoji(text[text_kitty]))
+ {
+ if (text_kitty > text_start)
+ {
+ segments.push_back(new LLNormalTextSegment(style, segment_start + text_start, segment_start + text_kitty, *this));
+ }
+
+ if (!emoji_style)
+ {
+ emoji_style = new LLStyle(*style);
+ emoji_style->setFont(LLFontGL::getFontEmoji());
+ }
+ segments.push_back(new LLEmojiTextSegment(emoji_style, segment_start + text_kitty, segment_start + text_kitty + 1, *this));
+ text_start = text_kitty + 1;
+ }
+ }
+
+ if (text_start < text_len)
+ {
+ segments.push_back(new LLNormalTextSegment(style, segment_start + text_start, segment_start + text_len, *this));
+ }
+}
+
void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only)
{
// Save old state
@@ -2334,6 +2364,7 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig
S32 cur_length = getLength();
LLStyleConstSP sp(new LLStyle(highlight_params));
LLTextSegmentPtr segmentp;
+ segment_vec_t segments;
if (underline_on_hover_only || mSkipLinkUnderline)
{
highlight_params.font.style("NORMAL");
@@ -2342,9 +2373,8 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig
}
else
{
- segmentp = new LLNormalTextSegment(sp, cur_length, cur_length + wide_text.size(), *this);
+ createTextWithEmojiSegment(wide_text, cur_length, sp, segments);
}
- segment_vec_t segments;
segments.push_back(segmentp);
insertStringNoUndo(cur_length, wide_text, &segments);
}
@@ -2367,7 +2397,7 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig
}
else
{
- segments.push_back(new LLNormalTextSegment(sp, segment_start, segment_end, *this ));
+ createTextWithEmojiSegment(wide_text, segment_start, sp, segments);
}
insertStringNoUndo(getLength(), wide_text, &segments);
@@ -3515,6 +3545,19 @@ const S32 LLLabelTextSegment::getLength() const
}
//
+// LLEmojiTextSegment
+//
+LLEmojiTextSegment::LLEmojiTextSegment(LLStyleConstSP style, S32 start, S32 end, LLTextBase& editor)
+ : LLNormalTextSegment(style, start, end, editor)
+{
+}
+
+LLEmojiTextSegment::LLEmojiTextSegment(const LLColor4& color, S32 start, S32 end, LLTextBase& editor, BOOL is_visible)
+ : LLNormalTextSegment(color, start, end, editor, is_visible)
+{
+}
+
+//
// LLOnHoverChangeableTextSegment
//
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 590e7c9dbb..fc999c4cca 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -178,6 +178,17 @@ protected:
/*virtual*/ const S32 getLength() const;
};
+// Text segment that represents a single emoji character that has a different style (=font size) than the rest of
+// the document it belongs to
+class LLEmojiTextSegment : public LLNormalTextSegment
+{
+public:
+ LLEmojiTextSegment(LLStyleConstSP style, S32 start, S32 end, LLTextBase& editor);
+ LLEmojiTextSegment(const LLColor4& color, S32 start, S32 end, LLTextBase& editor, BOOL is_visible = TRUE);
+
+ bool canEdit() const override { return false; }
+};
+
// Text segment that changes it's style depending of mouse pointer position ( is it inside or outside segment)
class LLOnHoverChangeableTextSegment : public LLNormalTextSegment
{
@@ -629,6 +640,7 @@ protected:
void appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params = LLStyle::Params());
void appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only = false);
+ void createTextWithEmojiSegment(const LLWString& wide_text, S32 segment_start, LLStyleConstSP style, segment_vec_t& segments);
S32 normalizeUri(std::string& uri);
protected: