Merge pull request #63482 from bruvzg/fix_rtl_theme_font_sizes
This commit is contained in:
commit
6d57e209e9
@ -272,6 +272,7 @@
|
||||
<method name="push_font">
|
||||
<return type="void" />
|
||||
<argument index="0" name="font" type="Font" />
|
||||
<argument index="1" name="font_size" type="int" />
|
||||
<description>
|
||||
Adds a [code][font][/code] tag to the tag stack. Overrides default fonts for its duration.
|
||||
</description>
|
||||
|
@ -224,13 +224,21 @@ void RichTextLabel::_update_line_font(ItemFrame *p_frame, int p_line, const Ref<
|
||||
for (int i = 0; i < spans; i++) {
|
||||
ItemText *it = reinterpret_cast<ItemText *>((uint64_t)TS->shaped_get_span_meta(t, i));
|
||||
if (it) {
|
||||
Ref<Font> font = _find_font(it);
|
||||
if (font.is_null()) {
|
||||
font = p_base_font;
|
||||
Ref<Font> font = p_base_font;
|
||||
int font_size = p_base_font_size;
|
||||
|
||||
ItemFont *font_it = _find_font(it);
|
||||
if (font_it) {
|
||||
if (font_it->font.is_valid()) {
|
||||
font = font_it->font;
|
||||
}
|
||||
if (font_it->font_size > 0) {
|
||||
font_size = font_it->font_size;
|
||||
}
|
||||
}
|
||||
int font_size = _find_font_size(it);
|
||||
if (font_size == -1) {
|
||||
font_size = p_base_font_size;
|
||||
ItemFontSize *font_size_it = _find_font_size(it);
|
||||
if (font_size_it && font_size_it->font_size > 0) {
|
||||
font_size = font_size_it->font_size;
|
||||
}
|
||||
TS->shaped_set_span_update_font(t, i, font->get_rids(), font_size, font->get_opentype_features());
|
||||
for (int j = 0; j < TextServer::SPACING_MAX; j++) {
|
||||
@ -483,13 +491,21 @@ float RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font>
|
||||
l.dc_ol_color = dc->ol_color;
|
||||
} break;
|
||||
case ITEM_NEWLINE: {
|
||||
Ref<Font> font = _find_font(it);
|
||||
if (font.is_null()) {
|
||||
font = p_base_font;
|
||||
Ref<Font> font = p_base_font;
|
||||
int font_size = p_base_font_size;
|
||||
|
||||
ItemFont *font_it = _find_font(it);
|
||||
if (font_it) {
|
||||
if (font_it->font.is_valid()) {
|
||||
font = font_it->font;
|
||||
}
|
||||
if (font_it->font_size > 0) {
|
||||
font_size = font_it->font_size;
|
||||
}
|
||||
}
|
||||
int font_size = _find_font_size(it);
|
||||
if (font_size == -1) {
|
||||
font_size = p_base_font_size;
|
||||
ItemFontSize *font_size_it = _find_font_size(it);
|
||||
if (font_size_it && font_size_it->font_size > 0) {
|
||||
font_size = font_size_it->font_size;
|
||||
}
|
||||
l.text_buf->add_string("\n", font, font_size);
|
||||
text += "\n";
|
||||
@ -498,13 +514,21 @@ float RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font>
|
||||
} break;
|
||||
case ITEM_TEXT: {
|
||||
ItemText *t = static_cast<ItemText *>(it);
|
||||
Ref<Font> font = _find_font(it);
|
||||
if (font.is_null()) {
|
||||
font = p_base_font;
|
||||
Ref<Font> font = p_base_font;
|
||||
int font_size = p_base_font_size;
|
||||
|
||||
ItemFont *font_it = _find_font(it);
|
||||
if (font_it) {
|
||||
if (font_it->font.is_valid()) {
|
||||
font = font_it->font;
|
||||
}
|
||||
if (font_it->font_size > 0) {
|
||||
font_size = font_it->font_size;
|
||||
}
|
||||
}
|
||||
int font_size = _find_font_size(it);
|
||||
if (font_size == -1) {
|
||||
font_size = p_base_font_size;
|
||||
ItemFontSize *font_size_it = _find_font_size(it);
|
||||
if (font_size_it && font_size_it->font_size > 0) {
|
||||
font_size = font_size_it->font_size;
|
||||
}
|
||||
String lang = _find_language(it);
|
||||
String tx = t->text;
|
||||
@ -750,13 +774,21 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o
|
||||
}
|
||||
}
|
||||
if (!prefix.is_empty()) {
|
||||
Ref<Font> font = _find_font(l.from);
|
||||
if (font.is_null()) {
|
||||
font = get_theme_font(SNAME("normal_font"));
|
||||
Ref<Font> font = get_theme_font(SNAME("normal_font"));
|
||||
int font_size = get_theme_font_size(SNAME("normal_font_size"));
|
||||
|
||||
ItemFont *font_it = _find_font(l.from);
|
||||
if (font_it) {
|
||||
if (font_it->font.is_valid()) {
|
||||
font = font_it->font;
|
||||
}
|
||||
if (font_it->font_size > 0) {
|
||||
font_size = font_it->font_size;
|
||||
}
|
||||
}
|
||||
int font_size = _find_font_size(l.from);
|
||||
if (font_size == -1) {
|
||||
font_size = get_theme_font_size(SNAME("normal_font_size"));
|
||||
ItemFontSize *font_size_it = _find_font_size(l.from);
|
||||
if (font_size_it && font_size_it->font_size > 0) {
|
||||
font_size = font_size_it->font_size;
|
||||
}
|
||||
if (rtl) {
|
||||
float offx = 0.0f;
|
||||
@ -1519,13 +1551,20 @@ float RichTextLabel::_find_click_in_line(ItemFrame *p_frame, int p_line, const V
|
||||
int stop = text_rect_begin;
|
||||
*r_click_item = _find_indentable(it);
|
||||
while (*r_click_item) {
|
||||
Ref<Font> font = _find_font(*r_click_item);
|
||||
if (!font.is_valid()) {
|
||||
font = get_theme_font(SNAME("normal_font"));
|
||||
Ref<Font> font = get_theme_font(SNAME("normal_font"));
|
||||
int font_size = get_theme_font_size(SNAME("normal_font_size"));
|
||||
ItemFont *font_it = _find_font(*r_click_item);
|
||||
if (font_it) {
|
||||
if (font_it->font.is_valid()) {
|
||||
font = font_it->font;
|
||||
}
|
||||
if (font_it->font_size > 0) {
|
||||
font_size = font_it->font_size;
|
||||
}
|
||||
}
|
||||
int font_size = _find_font_size(*r_click_item);
|
||||
if (font_size == -1) {
|
||||
font_size = get_theme_font_size(SNAME("normal_font_size"));
|
||||
ItemFontSize *font_size_it = _find_font_size(*r_click_item);
|
||||
if (font_size_it && font_size_it->font_size > 0) {
|
||||
font_size = font_size_it->font_size;
|
||||
}
|
||||
if (rtl) {
|
||||
stop += tab_size * font->get_char_size(' ', font_size).width;
|
||||
@ -2109,34 +2148,34 @@ RichTextLabel::Item *RichTextLabel::_find_indentable(Item *p_item) {
|
||||
return indentable;
|
||||
}
|
||||
|
||||
Ref<Font> RichTextLabel::_find_font(Item *p_item) {
|
||||
RichTextLabel::ItemFont *RichTextLabel::_find_font(Item *p_item) {
|
||||
Item *fontitem = p_item;
|
||||
|
||||
while (fontitem) {
|
||||
if (fontitem->type == ITEM_FONT) {
|
||||
ItemFont *fi = static_cast<ItemFont *>(fontitem);
|
||||
return fi->font;
|
||||
return fi;
|
||||
}
|
||||
|
||||
fontitem = fontitem->parent;
|
||||
}
|
||||
|
||||
return Ref<Font>();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
int RichTextLabel::_find_font_size(Item *p_item) {
|
||||
RichTextLabel::ItemFontSize *RichTextLabel::_find_font_size(Item *p_item) {
|
||||
Item *sizeitem = p_item;
|
||||
|
||||
while (sizeitem) {
|
||||
if (sizeitem->type == ITEM_FONT_SIZE) {
|
||||
ItemFontSize *fi = static_cast<ItemFontSize *>(sizeitem);
|
||||
return fi->font_size;
|
||||
return fi;
|
||||
}
|
||||
|
||||
sizeitem = sizeitem->parent;
|
||||
}
|
||||
|
||||
return -1;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
int RichTextLabel::_find_outline_size(Item *p_item, int p_default) {
|
||||
@ -2222,24 +2261,40 @@ int RichTextLabel::_find_margin(Item *p_item, const Ref<Font> &p_base_font, int
|
||||
|
||||
while (item) {
|
||||
if (item->type == ITEM_INDENT) {
|
||||
Ref<Font> font = _find_font(item);
|
||||
if (font.is_null()) {
|
||||
font = p_base_font;
|
||||
Ref<Font> font = p_base_font;
|
||||
int font_size = p_base_font_size;
|
||||
|
||||
ItemFont *font_it = _find_font(item);
|
||||
if (font_it) {
|
||||
if (font_it->font.is_valid()) {
|
||||
font = font_it->font;
|
||||
}
|
||||
if (font_it->font_size > 0) {
|
||||
font_size = font_it->font_size;
|
||||
}
|
||||
}
|
||||
int font_size = _find_font_size(item);
|
||||
if (font_size == -1) {
|
||||
font_size = p_base_font_size;
|
||||
ItemFontSize *font_size_it = _find_font_size(item);
|
||||
if (font_size_it && font_size_it->font_size > 0) {
|
||||
font_size = font_size_it->font_size;
|
||||
}
|
||||
margin += tab_size * font->get_char_size(' ', font_size).width;
|
||||
|
||||
} else if (item->type == ITEM_LIST) {
|
||||
Ref<Font> font = _find_font(item);
|
||||
if (font.is_null()) {
|
||||
font = p_base_font;
|
||||
Ref<Font> font = p_base_font;
|
||||
int font_size = p_base_font_size;
|
||||
|
||||
ItemFont *font_it = _find_font(item);
|
||||
if (font_it) {
|
||||
if (font_it->font.is_valid()) {
|
||||
font = font_it->font;
|
||||
}
|
||||
if (font_it->font_size > 0) {
|
||||
font_size = font_it->font_size;
|
||||
}
|
||||
}
|
||||
int font_size = _find_font_size(item);
|
||||
if (font_size == -1) {
|
||||
font_size = p_base_font_size;
|
||||
ItemFontSize *font_size_it = _find_font_size(item);
|
||||
if (font_size_it && font_size_it->font_size > 0) {
|
||||
font_size = font_size_it->font_size;
|
||||
}
|
||||
margin += tab_size * font->get_char_size(' ', font_size).width;
|
||||
}
|
||||
@ -2918,7 +2973,7 @@ void RichTextLabel::push_dropcap(const String &p_string, const Ref<Font> &p_font
|
||||
_add_item(item, false);
|
||||
}
|
||||
|
||||
void RichTextLabel::push_font(const Ref<Font> &p_font) {
|
||||
void RichTextLabel::push_font(const Ref<Font> &p_font, int p_size) {
|
||||
_stop_thread();
|
||||
MutexLock data_lock(data_mutex);
|
||||
|
||||
@ -2927,6 +2982,7 @@ void RichTextLabel::push_font(const Ref<Font> &p_font) {
|
||||
ItemFont *item = memnew(ItemFont);
|
||||
|
||||
item->font = p_font;
|
||||
item->font_size = p_size;
|
||||
_add_item(item, true);
|
||||
}
|
||||
|
||||
@ -2934,35 +2990,35 @@ void RichTextLabel::push_normal() {
|
||||
Ref<Font> normal_font = get_theme_font(SNAME("normal_font"));
|
||||
ERR_FAIL_COND(normal_font.is_null());
|
||||
|
||||
push_font(normal_font);
|
||||
push_font(normal_font, get_theme_font_size(SNAME("normal_font_size")));
|
||||
}
|
||||
|
||||
void RichTextLabel::push_bold() {
|
||||
Ref<Font> bold_font = get_theme_font(SNAME("bold_font"));
|
||||
ERR_FAIL_COND(bold_font.is_null());
|
||||
|
||||
push_font(bold_font);
|
||||
push_font(bold_font, get_theme_font_size(SNAME("bold_font_size")));
|
||||
}
|
||||
|
||||
void RichTextLabel::push_bold_italics() {
|
||||
Ref<Font> bold_italics_font = get_theme_font(SNAME("bold_italics_font"));
|
||||
ERR_FAIL_COND(bold_italics_font.is_null());
|
||||
|
||||
push_font(bold_italics_font);
|
||||
push_font(bold_italics_font, get_theme_font_size(SNAME("bold_italics_font_size")));
|
||||
}
|
||||
|
||||
void RichTextLabel::push_italics() {
|
||||
Ref<Font> italics_font = get_theme_font(SNAME("italics_font"));
|
||||
ERR_FAIL_COND(italics_font.is_null());
|
||||
|
||||
push_font(italics_font);
|
||||
push_font(italics_font, get_theme_font_size(SNAME("italics_font_size")));
|
||||
}
|
||||
|
||||
void RichTextLabel::push_mono() {
|
||||
Ref<Font> mono_font = get_theme_font(SNAME("mono_font"));
|
||||
ERR_FAIL_COND(mono_font.is_null());
|
||||
|
||||
push_font(mono_font);
|
||||
push_font(mono_font, get_theme_font_size(SNAME("mono_font_size")));
|
||||
}
|
||||
|
||||
void RichTextLabel::push_font_size(int p_font_size) {
|
||||
@ -3552,9 +3608,9 @@ void RichTextLabel::append_text(const String &p_bbcode) {
|
||||
//use bold font
|
||||
in_bold = true;
|
||||
if (in_italics) {
|
||||
push_font(bold_italics_font);
|
||||
push_font(bold_italics_font, get_theme_font_size(SNAME("bold_italics_font_size")));
|
||||
} else {
|
||||
push_font(bold_font);
|
||||
push_font(bold_font, get_theme_font_size(SNAME("bold_font_size")));
|
||||
}
|
||||
pos = brk_end + 1;
|
||||
tag_stack.push_front(tag);
|
||||
@ -3562,15 +3618,15 @@ void RichTextLabel::append_text(const String &p_bbcode) {
|
||||
//use italics font
|
||||
in_italics = true;
|
||||
if (in_bold) {
|
||||
push_font(bold_italics_font);
|
||||
push_font(bold_italics_font, get_theme_font_size(SNAME("bold_italics_font_size")));
|
||||
} else {
|
||||
push_font(italics_font);
|
||||
push_font(italics_font, get_theme_font_size(SNAME("italics_font_size")));
|
||||
}
|
||||
pos = brk_end + 1;
|
||||
tag_stack.push_front(tag);
|
||||
} else if (tag == "code") {
|
||||
//use monospace font
|
||||
push_font(mono_font);
|
||||
push_font(mono_font, get_theme_font_size(SNAME("mono_font_size")));
|
||||
pos = brk_end + 1;
|
||||
tag_stack.push_front(tag);
|
||||
} else if (tag.begins_with("table=")) {
|
||||
@ -3999,9 +4055,16 @@ void RichTextLabel::append_text(const String &p_bbcode) {
|
||||
String fnt_ftr = tag.substr(18, tag.length());
|
||||
Vector<String> subtag = fnt_ftr.split(",");
|
||||
if (subtag.size() > 0) {
|
||||
Ref<Font> font = _find_font(current);
|
||||
if (font.is_null()) {
|
||||
font = normal_font;
|
||||
Ref<Font> font = normal_font;
|
||||
int font_size = 0;
|
||||
ItemFont *font_it = _find_font(current);
|
||||
if (font_it) {
|
||||
if (font_it->font.is_valid()) {
|
||||
font = font_it->font;
|
||||
}
|
||||
if (font_it->font_size > 0) {
|
||||
font_size = font_it->font_size;
|
||||
}
|
||||
}
|
||||
Ref<FontVariation> fc;
|
||||
fc.instantiate();
|
||||
@ -4016,7 +4079,7 @@ void RichTextLabel::append_text(const String &p_bbcode) {
|
||||
}
|
||||
}
|
||||
fc->set_opentype_features(features);
|
||||
push_font(fc);
|
||||
push_font(fc, font_size);
|
||||
}
|
||||
pos = brk_end + 1;
|
||||
tag_stack.push_front("opentype_features");
|
||||
@ -4037,6 +4100,7 @@ void RichTextLabel::append_text(const String &p_bbcode) {
|
||||
|
||||
Ref<FontVariation> fc;
|
||||
fc.instantiate();
|
||||
int fnt_size = 0;
|
||||
for (int i = 1; i < subtag.size(); i++) {
|
||||
Vector<String> subtag_a = subtag[i].split("=", true, 2);
|
||||
if (subtag_a.size() == 2) {
|
||||
@ -4047,10 +4111,7 @@ void RichTextLabel::append_text(const String &p_bbcode) {
|
||||
fc->set_base_font(font_data);
|
||||
}
|
||||
} else if (subtag_a[0] == "size" || subtag_a[0] == "s") {
|
||||
int fnt_size = subtag_a[1].to_int();
|
||||
if (fnt_size > 0) {
|
||||
push_font_size(fnt_size);
|
||||
}
|
||||
fnt_size = subtag_a[1].to_int();
|
||||
} else if (subtag_a[0] == "glyph_spacing" || subtag_a[0] == "gl") {
|
||||
int spacing = subtag_a[1].to_int();
|
||||
fc->set_spacing(TextServer::SPACING_GLYPH, spacing);
|
||||
@ -4101,7 +4162,7 @@ void RichTextLabel::append_text(const String &p_bbcode) {
|
||||
}
|
||||
}
|
||||
}
|
||||
push_font(fc);
|
||||
push_font(fc, fnt_size);
|
||||
pos = brk_end + 1;
|
||||
tag_stack.push_front("font");
|
||||
|
||||
@ -4929,7 +4990,7 @@ void RichTextLabel::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("add_image", "image", "width", "height", "color", "inline_align"), &RichTextLabel::add_image, DEFVAL(0), DEFVAL(0), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(INLINE_ALIGNMENT_CENTER));
|
||||
ClassDB::bind_method(D_METHOD("newline"), &RichTextLabel::add_newline);
|
||||
ClassDB::bind_method(D_METHOD("remove_line", "line"), &RichTextLabel::remove_line);
|
||||
ClassDB::bind_method(D_METHOD("push_font", "font"), &RichTextLabel::push_font);
|
||||
ClassDB::bind_method(D_METHOD("push_font", "font", "font_size"), &RichTextLabel::push_font);
|
||||
ClassDB::bind_method(D_METHOD("push_font_size", "font_size"), &RichTextLabel::push_font_size);
|
||||
ClassDB::bind_method(D_METHOD("push_normal"), &RichTextLabel::push_normal);
|
||||
ClassDB::bind_method(D_METHOD("push_bold"), &RichTextLabel::push_bold);
|
||||
|
@ -178,6 +178,7 @@ private:
|
||||
|
||||
struct ItemFont : public Item {
|
||||
Ref<Font> font;
|
||||
int font_size = 0;
|
||||
ItemFont() { type = ITEM_FONT; }
|
||||
};
|
||||
|
||||
@ -462,8 +463,8 @@ private:
|
||||
Item *_find_indentable(Item *p_item);
|
||||
Item *_get_item_at_pos(Item *p_item_from, Item *p_item_to, int p_position);
|
||||
void _find_frame(Item *p_item, ItemFrame **r_frame, int *r_line);
|
||||
int _find_font_size(Item *p_item);
|
||||
Ref<Font> _find_font(Item *p_item);
|
||||
ItemFontSize *_find_font_size(Item *p_item);
|
||||
ItemFont *_find_font(Item *p_item);
|
||||
int _find_outline_size(Item *p_item, int p_default);
|
||||
ItemList *_find_list_item(Item *p_item);
|
||||
ItemDropcap *_find_dc_item(Item *p_item);
|
||||
@ -518,7 +519,7 @@ public:
|
||||
void add_newline();
|
||||
bool remove_line(const int p_line);
|
||||
void push_dropcap(const String &p_string, const Ref<Font> &p_font, int p_size, const Rect2 &p_dropcap_margins = Rect2(), const Color &p_color = Color(1, 1, 1), int p_ol_size = 0, const Color &p_ol_color = Color(0, 0, 0, 0));
|
||||
void push_font(const Ref<Font> &p_font);
|
||||
void push_font(const Ref<Font> &p_font, int p_size = 0);
|
||||
void push_font_size(int p_font_size);
|
||||
void push_outline_size(int p_font_size);
|
||||
void push_normal();
|
||||
|
Loading…
Reference in New Issue
Block a user