[RTL/TextServer] Add baseline inline alignment mode for objects and RTL tables.
This commit is contained in:
parent
15631e24f7
commit
53c76fa5d1
22 changed files with 108 additions and 45 deletions
|
@ -153,6 +153,7 @@ void register_global_constants() {
|
|||
|
||||
BIND_CORE_ENUM_CONSTANT(INLINE_ALIGNMENT_TOP_TO);
|
||||
BIND_CORE_ENUM_CONSTANT(INLINE_ALIGNMENT_CENTER_TO);
|
||||
BIND_CORE_ENUM_CONSTANT(INLINE_ALIGNMENT_BASELINE_TO);
|
||||
BIND_CORE_ENUM_CONSTANT(INLINE_ALIGNMENT_BOTTOM_TO);
|
||||
|
||||
BIND_CORE_ENUM_CONSTANT(INLINE_ALIGNMENT_TO_TOP);
|
||||
|
|
|
@ -86,6 +86,7 @@ enum InlineAlignment {
|
|||
// Image alignment points.
|
||||
INLINE_ALIGNMENT_TOP_TO = 0b0000,
|
||||
INLINE_ALIGNMENT_CENTER_TO = 0b0001,
|
||||
INLINE_ALIGNMENT_BASELINE_TO = 0b0011,
|
||||
INLINE_ALIGNMENT_BOTTOM_TO = 0b0010,
|
||||
INLINE_ALIGNMENT_IMAGE_MASK = 0b0011,
|
||||
|
||||
|
|
|
@ -1479,6 +1479,9 @@
|
|||
<constant name="INLINE_ALIGNMENT_CENTER_TO" value="1" enum="InlineAlignment">
|
||||
Aligns the center of the inline object (e.g. image, table) to the position of the text specified by [code]INLINE_ALIGNMENT_TO_*[/code] constant.
|
||||
</constant>
|
||||
<constant name="INLINE_ALIGNMENT_BASELINE_TO" value="3" enum="InlineAlignment">
|
||||
Aligns the baseline (user defined) of the inline object (e.g. image, table) to the position of the text specified by [code]INLINE_ALIGNMENT_TO_*[/code] constant.
|
||||
</constant>
|
||||
<constant name="INLINE_ALIGNMENT_BOTTOM_TO" value="2" enum="InlineAlignment">
|
||||
Aligns the bottom of the inline object (e.g. image, table) to the position of the text specified by [code]INLINE_ALIGNMENT_TO_*[/code] constant.
|
||||
</constant>
|
||||
|
|
|
@ -367,6 +367,7 @@
|
|||
<return type="void" />
|
||||
<param index="0" name="columns" type="int" />
|
||||
<param index="1" name="inline_align" type="int" enum="InlineAlignment" default="0" />
|
||||
<param index="2" name="align_to_row" type="int" default="-1" />
|
||||
<description>
|
||||
Adds a [code][table=columns,inline_align][/code] tag to the tag stack.
|
||||
</description>
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
<param index="1" name="size" type="Vector2" />
|
||||
<param index="2" name="inline_align" type="int" enum="InlineAlignment" default="5" />
|
||||
<param index="3" name="length" type="int" default="1" />
|
||||
<param index="4" name="baseline" type="float" default="0.0" />
|
||||
<description>
|
||||
Adds inline object to the text buffer, [param key] must be unique. In the text, object is represented as [param length] object replacement characters.
|
||||
</description>
|
||||
|
@ -122,6 +123,7 @@
|
|||
<param index="0" name="key" type="Variant" />
|
||||
<param index="1" name="size" type="Vector2" />
|
||||
<param index="2" name="inline_align" type="int" enum="InlineAlignment" default="5" />
|
||||
<param index="3" name="baseline" type="float" default="0.0" />
|
||||
<description>
|
||||
Sets new size and alignment of embedded object.
|
||||
</description>
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
<param index="1" name="size" type="Vector2" />
|
||||
<param index="2" name="inline_align" type="int" enum="InlineAlignment" default="5" />
|
||||
<param index="3" name="length" type="int" default="1" />
|
||||
<param index="4" name="baseline" type="float" default="0.0" />
|
||||
<description>
|
||||
Adds inline object to the text buffer, [param key] must be unique. In the text, object is represented as [param length] object replacement characters.
|
||||
</description>
|
||||
|
@ -228,6 +229,7 @@
|
|||
<param index="0" name="key" type="Variant" />
|
||||
<param index="1" name="size" type="Vector2" />
|
||||
<param index="2" name="inline_align" type="int" enum="InlineAlignment" default="5" />
|
||||
<param index="3" name="baseline" type="float" default="0.0" />
|
||||
<description>
|
||||
Sets new size and alignment of embedded object.
|
||||
</description>
|
||||
|
|
|
@ -1097,6 +1097,7 @@
|
|||
<param index="2" name="size" type="Vector2" />
|
||||
<param index="3" name="inline_align" type="int" enum="InlineAlignment" default="5" />
|
||||
<param index="4" name="length" type="int" default="1" />
|
||||
<param index="5" name="baseline" type="float" default="0.0" />
|
||||
<description>
|
||||
Adds inline object to the text buffer, [param key] must be unique. In the text, object is represented as [param length] object replacement characters.
|
||||
</description>
|
||||
|
@ -1438,6 +1439,7 @@
|
|||
<param index="1" name="key" type="Variant" />
|
||||
<param index="2" name="size" type="Vector2" />
|
||||
<param index="3" name="inline_align" type="int" enum="InlineAlignment" default="5" />
|
||||
<param index="4" name="baseline" type="float" default="0.0" />
|
||||
<description>
|
||||
Sets new size and alignment of embedded object.
|
||||
</description>
|
||||
|
|
|
@ -945,6 +945,7 @@
|
|||
<param index="2" name="size" type="Vector2" />
|
||||
<param index="3" name="inline_align" type="int" enum="InlineAlignment" />
|
||||
<param index="4" name="length" type="int" />
|
||||
<param index="5" name="baseline" type="float" />
|
||||
<description>
|
||||
</description>
|
||||
</method>
|
||||
|
@ -1242,6 +1243,7 @@
|
|||
<param index="1" name="key" type="Variant" />
|
||||
<param index="2" name="size" type="Vector2" />
|
||||
<param index="3" name="inline_align" type="int" enum="InlineAlignment" />
|
||||
<param index="4" name="baseline" type="float" />
|
||||
<description>
|
||||
</description>
|
||||
</method>
|
||||
|
|
|
@ -3915,7 +3915,7 @@ bool TextServerAdvanced::_shaped_text_add_string(const RID &p_shaped, const Stri
|
|||
return true;
|
||||
}
|
||||
|
||||
bool TextServerAdvanced::_shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length) {
|
||||
bool TextServerAdvanced::_shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length, float p_baseline) {
|
||||
_THREAD_SAFE_METHOD_
|
||||
ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped);
|
||||
ERR_FAIL_COND_V(!sd, false);
|
||||
|
@ -3935,6 +3935,7 @@ bool TextServerAdvanced::_shaped_text_add_object(const RID &p_shaped, const Vari
|
|||
obj.inline_align = p_inline_align;
|
||||
obj.rect.size = p_size;
|
||||
obj.pos = span.start;
|
||||
obj.baseline = p_baseline;
|
||||
|
||||
sd->spans.push_back(span);
|
||||
sd->text = sd->text + String::chr(0xfffc).repeat(p_length);
|
||||
|
@ -3945,7 +3946,7 @@ bool TextServerAdvanced::_shaped_text_add_object(const RID &p_shaped, const Vari
|
|||
return true;
|
||||
}
|
||||
|
||||
bool TextServerAdvanced::_shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align) {
|
||||
bool TextServerAdvanced::_shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, float p_baseline) {
|
||||
ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped);
|
||||
ERR_FAIL_COND_V(!sd, false);
|
||||
|
||||
|
@ -3953,6 +3954,7 @@ bool TextServerAdvanced::_shaped_text_resize_object(const RID &p_shaped, const V
|
|||
ERR_FAIL_COND_V(!sd->objects.has(p_key), false);
|
||||
sd->objects[p_key].rect.size = p_size;
|
||||
sd->objects[p_key].inline_align = p_inline_align;
|
||||
sd->objects[p_key].baseline = p_baseline;
|
||||
if (sd->valid) {
|
||||
// Recalc string metrics.
|
||||
sd->ascent = 0;
|
||||
|
@ -4039,6 +4041,9 @@ void TextServerAdvanced::_realign(ShapedTextDataAdvanced *p_sd) const {
|
|||
case INLINE_ALIGNMENT_CENTER_TO: {
|
||||
E.value.rect.position.y -= E.value.rect.size.y / 2;
|
||||
} break;
|
||||
case INLINE_ALIGNMENT_BASELINE_TO: {
|
||||
E.value.rect.position.y -= E.value.baseline;
|
||||
} break;
|
||||
case INLINE_ALIGNMENT_TOP_TO: {
|
||||
// NOP
|
||||
} break;
|
||||
|
@ -4067,6 +4072,9 @@ void TextServerAdvanced::_realign(ShapedTextDataAdvanced *p_sd) const {
|
|||
case INLINE_ALIGNMENT_CENTER_TO: {
|
||||
E.value.rect.position.x -= E.value.rect.size.x / 2;
|
||||
} break;
|
||||
case INLINE_ALIGNMENT_BASELINE_TO: {
|
||||
E.value.rect.position.x -= E.value.baseline;
|
||||
} break;
|
||||
case INLINE_ALIGNMENT_TOP_TO: {
|
||||
// NOP
|
||||
} break;
|
||||
|
|
|
@ -467,6 +467,7 @@ class TextServerAdvanced : public TextServerExtension {
|
|||
int pos = 0;
|
||||
InlineAlignment inline_align = INLINE_ALIGNMENT_CENTER;
|
||||
Rect2 rect;
|
||||
float baseline = 0;
|
||||
};
|
||||
HashMap<Variant, EmbeddedObject, VariantHasher, VariantComparator> objects;
|
||||
|
||||
|
@ -868,8 +869,8 @@ public:
|
|||
MODBIND2RC(int64_t, shaped_text_get_spacing, const RID &, SpacingType);
|
||||
|
||||
MODBIND7R(bool, shaped_text_add_string, const RID &, const String &, const TypedArray<RID> &, int64_t, const Dictionary &, const String &, const Variant &);
|
||||
MODBIND5R(bool, shaped_text_add_object, const RID &, const Variant &, const Size2 &, InlineAlignment, int64_t);
|
||||
MODBIND4R(bool, shaped_text_resize_object, const RID &, const Variant &, const Size2 &, InlineAlignment);
|
||||
MODBIND6R(bool, shaped_text_add_object, const RID &, const Variant &, const Size2 &, InlineAlignment, int64_t, float);
|
||||
MODBIND5R(bool, shaped_text_resize_object, const RID &, const Variant &, const Size2 &, InlineAlignment, float);
|
||||
|
||||
MODBIND1RC(int64_t, shaped_get_span_count, const RID &);
|
||||
MODBIND2RC(Variant, shaped_get_span_meta, const RID &, int64_t);
|
||||
|
|
|
@ -2917,7 +2917,7 @@ bool TextServerFallback::_shaped_text_add_string(const RID &p_shaped, const Stri
|
|||
return true;
|
||||
}
|
||||
|
||||
bool TextServerFallback::_shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length) {
|
||||
bool TextServerFallback::_shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length, float p_baseline) {
|
||||
ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped);
|
||||
ERR_FAIL_COND_V(!sd, false);
|
||||
|
||||
|
@ -2938,6 +2938,7 @@ bool TextServerFallback::_shaped_text_add_object(const RID &p_shaped, const Vari
|
|||
obj.inline_align = p_inline_align;
|
||||
obj.rect.size = p_size;
|
||||
obj.pos = span.start;
|
||||
obj.baseline = p_baseline;
|
||||
|
||||
sd->spans.push_back(span);
|
||||
sd->text = sd->text + String::chr(0xfffc).repeat(p_length);
|
||||
|
@ -2948,7 +2949,7 @@ bool TextServerFallback::_shaped_text_add_object(const RID &p_shaped, const Vari
|
|||
return true;
|
||||
}
|
||||
|
||||
bool TextServerFallback::_shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align) {
|
||||
bool TextServerFallback::_shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, float p_baseline) {
|
||||
ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped);
|
||||
ERR_FAIL_COND_V(!sd, false);
|
||||
|
||||
|
@ -2956,6 +2957,7 @@ bool TextServerFallback::_shaped_text_resize_object(const RID &p_shaped, const V
|
|||
ERR_FAIL_COND_V(!sd->objects.has(p_key), false);
|
||||
sd->objects[p_key].rect.size = p_size;
|
||||
sd->objects[p_key].inline_align = p_inline_align;
|
||||
sd->objects[p_key].baseline = p_baseline;
|
||||
if (sd->valid) {
|
||||
// Recalc string metrics.
|
||||
sd->ascent = 0;
|
||||
|
@ -3042,6 +3044,9 @@ void TextServerFallback::_realign(ShapedTextDataFallback *p_sd) const {
|
|||
case INLINE_ALIGNMENT_CENTER_TO: {
|
||||
E.value.rect.position.y -= E.value.rect.size.y / 2;
|
||||
} break;
|
||||
case INLINE_ALIGNMENT_BASELINE_TO: {
|
||||
E.value.rect.position.y -= E.value.baseline;
|
||||
} break;
|
||||
case INLINE_ALIGNMENT_TOP_TO: {
|
||||
// NOP
|
||||
} break;
|
||||
|
@ -3070,6 +3075,9 @@ void TextServerFallback::_realign(ShapedTextDataFallback *p_sd) const {
|
|||
case INLINE_ALIGNMENT_CENTER_TO: {
|
||||
E.value.rect.position.x -= E.value.rect.size.x / 2;
|
||||
} break;
|
||||
case INLINE_ALIGNMENT_BASELINE_TO: {
|
||||
E.value.rect.position.x -= E.value.baseline;
|
||||
} break;
|
||||
case INLINE_ALIGNMENT_TOP_TO: {
|
||||
// NOP
|
||||
} break;
|
||||
|
|
|
@ -417,6 +417,7 @@ class TextServerFallback : public TextServerExtension {
|
|||
int pos = 0;
|
||||
InlineAlignment inline_align = INLINE_ALIGNMENT_CENTER;
|
||||
Rect2 rect;
|
||||
float baseline = 0;
|
||||
};
|
||||
HashMap<Variant, EmbeddedObject, VariantHasher, VariantComparator> objects;
|
||||
|
||||
|
@ -743,8 +744,8 @@ public:
|
|||
MODBIND2RC(int64_t, shaped_text_get_spacing, const RID &, SpacingType);
|
||||
|
||||
MODBIND7R(bool, shaped_text_add_string, const RID &, const String &, const TypedArray<RID> &, int64_t, const Dictionary &, const String &, const Variant &);
|
||||
MODBIND5R(bool, shaped_text_add_object, const RID &, const Variant &, const Size2 &, InlineAlignment, int64_t);
|
||||
MODBIND4R(bool, shaped_text_resize_object, const RID &, const Variant &, const Size2 &, InlineAlignment);
|
||||
MODBIND6R(bool, shaped_text_add_object, const RID &, const Variant &, const Size2 &, InlineAlignment, int64_t, float);
|
||||
MODBIND5R(bool, shaped_text_resize_object, const RID &, const Variant &, const Size2 &, InlineAlignment, float);
|
||||
|
||||
MODBIND1RC(int64_t, shaped_get_span_count, const RID &);
|
||||
MODBIND2RC(Variant, shaped_get_span_meta, const RID &, int64_t);
|
||||
|
|
|
@ -375,6 +375,7 @@ float RichTextLabel::_resize_line(ItemFrame *p_frame, int p_line, const Ref<Font
|
|||
idx = 0;
|
||||
table->total_height = 0;
|
||||
table->rows.clear();
|
||||
table->rows_baseline.clear();
|
||||
|
||||
Vector2 offset;
|
||||
float row_height = 0.0;
|
||||
|
@ -388,6 +389,7 @@ float RichTextLabel::_resize_line(ItemFrame *p_frame, int p_line, const Ref<Font
|
|||
offset.x += frame->padding.position.x;
|
||||
float yofs = frame->padding.position.y;
|
||||
float prev_h = 0;
|
||||
float row_baseline = 0.0;
|
||||
for (int i = 0; i < (int)frame->lines.size(); i++) {
|
||||
MutexLock sub_lock(frame->lines[i].text_buf->get_mutex());
|
||||
frame->lines[i].text_buf->set_width(table->columns[column].width);
|
||||
|
@ -409,6 +411,7 @@ float RichTextLabel::_resize_line(ItemFrame *p_frame, int p_line, const Ref<Font
|
|||
prev_h = frame->lines[i].offset.y + frame->lines[i].text_buf->get_size().y + frame->lines[i].text_buf->get_line_count() * theme_cache.line_separation;
|
||||
|
||||
frame->lines[i].offset += offset;
|
||||
row_baseline = MAX(row_baseline, frame->lines[i].text_buf->get_line_ascent(frame->lines[i].text_buf->get_line_count() - 1));
|
||||
}
|
||||
yofs += frame->padding.size.y;
|
||||
offset.x += table->columns[column].width + theme_cache.table_h_separation + frame->padding.size.x;
|
||||
|
@ -420,11 +423,17 @@ float RichTextLabel::_resize_line(ItemFrame *p_frame, int p_line, const Ref<Font
|
|||
table->total_height += row_height;
|
||||
offset.y += row_height;
|
||||
table->rows.push_back(row_height);
|
||||
table->rows_baseline.push_back(table->total_height - row_height + row_baseline);
|
||||
row_height = 0;
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
l.text_buf->resize_object((uint64_t)it, Size2(table->total_width, table->total_height), table->inline_align);
|
||||
int row_idx = (table->align_to_row < 0) ? table->rows_baseline.size() - 1 : table->align_to_row;
|
||||
if (table->rows_baseline.size() != 0 && row_idx < (int)table->rows_baseline.size() - 1) {
|
||||
l.text_buf->resize_object((uint64_t)it, Size2(table->total_width, table->total_height), table->inline_align, Math::round(table->rows_baseline[row_idx]));
|
||||
} else {
|
||||
l.text_buf->resize_object((uint64_t)it, Size2(table->total_width, table->total_height), table->inline_align);
|
||||
}
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
|
@ -655,6 +664,7 @@ float RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font>
|
|||
idx = 0;
|
||||
table->total_height = 0;
|
||||
table->rows.clear();
|
||||
table->rows_baseline.clear();
|
||||
|
||||
Vector2 offset;
|
||||
float row_height = 0.0;
|
||||
|
@ -668,6 +678,7 @@ float RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font>
|
|||
offset.x += frame->padding.position.x;
|
||||
float yofs = frame->padding.position.y;
|
||||
float prev_h = 0;
|
||||
float row_baseline = 0.0;
|
||||
for (int i = 0; i < (int)frame->lines.size(); i++) {
|
||||
MutexLock sub_lock(frame->lines[i].text_buf->get_mutex());
|
||||
|
||||
|
@ -690,6 +701,7 @@ float RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font>
|
|||
prev_h = frame->lines[i].offset.y + frame->lines[i].text_buf->get_size().y + frame->lines[i].text_buf->get_line_count() * theme_cache.line_separation;
|
||||
|
||||
frame->lines[i].offset += offset;
|
||||
row_baseline = MAX(row_baseline, frame->lines[i].text_buf->get_line_ascent(frame->lines[i].text_buf->get_line_count() - 1));
|
||||
}
|
||||
yofs += frame->padding.size.y;
|
||||
offset.x += table->columns[column].width + theme_cache.table_h_separation + frame->padding.size.x;
|
||||
|
@ -702,12 +714,17 @@ float RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font>
|
|||
table->total_height += row_height;
|
||||
offset.y += row_height;
|
||||
table->rows.push_back(row_height);
|
||||
table->rows_baseline.push_back(table->total_height - row_height + row_baseline);
|
||||
row_height = 0;
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
|
||||
l.text_buf->add_object((uint64_t)it, Size2(table->total_width, table->total_height), table->inline_align, t_char_count);
|
||||
int row_idx = (table->align_to_row < 0) ? table->rows_baseline.size() - 1 : table->align_to_row;
|
||||
if (table->rows_baseline.size() != 0 && row_idx < (int)table->rows_baseline.size() - 1) {
|
||||
l.text_buf->add_object((uint64_t)it, Size2(table->total_width, table->total_height), table->inline_align, t_char_count, Math::round(table->rows_baseline[row_idx]));
|
||||
} else {
|
||||
l.text_buf->add_object((uint64_t)it, Size2(table->total_width, table->total_height), table->inline_align, t_char_count);
|
||||
}
|
||||
txt += String::chr(0xfffc).repeat(t_char_count);
|
||||
} break;
|
||||
default:
|
||||
|
@ -3313,7 +3330,7 @@ void RichTextLabel::push_hint(const String &p_string) {
|
|||
_add_item(item, true);
|
||||
}
|
||||
|
||||
void RichTextLabel::push_table(int p_columns, InlineAlignment p_alignment) {
|
||||
void RichTextLabel::push_table(int p_columns, InlineAlignment p_alignment, int p_align_to_row) {
|
||||
_stop_thread();
|
||||
MutexLock data_lock(data_mutex);
|
||||
|
||||
|
@ -3323,6 +3340,7 @@ void RichTextLabel::push_table(int p_columns, InlineAlignment p_alignment) {
|
|||
item->columns.resize(p_columns);
|
||||
item->total_width = 0;
|
||||
item->inline_align = p_alignment;
|
||||
item->align_to_row = p_align_to_row;
|
||||
for (int i = 0; i < (int)item->columns.size(); i++) {
|
||||
item->columns[i].expand = false;
|
||||
item->columns[i].expand_ratio = 1;
|
||||
|
@ -3803,6 +3821,8 @@ void RichTextLabel::append_text(const String &p_bbcode) {
|
|||
alignment = INLINE_ALIGNMENT_TOP_TO;
|
||||
} else if (subtag[1] == "center" || subtag[1] == "c") {
|
||||
alignment = INLINE_ALIGNMENT_CENTER_TO;
|
||||
} else if (subtag[1] == "baseline" || subtag[1] == "l") {
|
||||
alignment = INLINE_ALIGNMENT_BASELINE_TO;
|
||||
} else if (subtag[1] == "bottom" || subtag[1] == "b") {
|
||||
alignment = INLINE_ALIGNMENT_BOTTOM_TO;
|
||||
}
|
||||
|
@ -3824,8 +3844,12 @@ void RichTextLabel::append_text(const String &p_bbcode) {
|
|||
alignment = INLINE_ALIGNMENT_BOTTOM;
|
||||
}
|
||||
}
|
||||
int row = -1;
|
||||
if (subtag.size() > 3) {
|
||||
row = subtag[3].to_int();
|
||||
}
|
||||
|
||||
push_table(columns, (InlineAlignment)alignment);
|
||||
push_table(columns, (InlineAlignment)alignment, row);
|
||||
pos = brk_end + 1;
|
||||
tag_stack.push_front("table");
|
||||
} else if (tag == "cell") {
|
||||
|
@ -3877,6 +3901,11 @@ void RichTextLabel::append_text(const String &p_bbcode) {
|
|||
Color color1 = Color::from_string(subtag_a[1], fallback_color);
|
||||
set_cell_row_background_color(color1, color1);
|
||||
}
|
||||
} else if (subtag_a[0] == "padding") {
|
||||
Vector<String> subtag_b = subtag_a[1].split(",");
|
||||
if (subtag_b.size() == 4) {
|
||||
set_cell_padding(Rect2(subtag_b[0].to_float(), subtag_b[1].to_float(), subtag_b[2].to_float(), subtag_b[3].to_float()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5302,7 +5331,7 @@ void RichTextLabel::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("push_hint", "description"), &RichTextLabel::push_hint);
|
||||
ClassDB::bind_method(D_METHOD("push_underline"), &RichTextLabel::push_underline);
|
||||
ClassDB::bind_method(D_METHOD("push_strikethrough"), &RichTextLabel::push_strikethrough);
|
||||
ClassDB::bind_method(D_METHOD("push_table", "columns", "inline_align"), &RichTextLabel::push_table, DEFVAL(INLINE_ALIGNMENT_TOP));
|
||||
ClassDB::bind_method(D_METHOD("push_table", "columns", "inline_align", "align_to_row"), &RichTextLabel::push_table, DEFVAL(INLINE_ALIGNMENT_TOP), DEFVAL(-1));
|
||||
ClassDB::bind_method(D_METHOD("push_dropcap", "string", "font", "size", "dropcap_margins", "color", "outline_size", "outline_color"), &RichTextLabel::push_dropcap, DEFVAL(Rect2()), DEFVAL(Color(1, 1, 1)), DEFVAL(0), DEFVAL(Color(0, 0, 0, 0)));
|
||||
ClassDB::bind_method(D_METHOD("set_table_column_expand", "column", "expand", "ratio"), &RichTextLabel::set_table_column_expand);
|
||||
ClassDB::bind_method(D_METHOD("set_cell_row_background_color", "odd_row_bg", "even_row_bg"), &RichTextLabel::set_cell_row_background_color);
|
||||
|
|
|
@ -268,7 +268,9 @@ private:
|
|||
|
||||
LocalVector<Column> columns;
|
||||
LocalVector<float> rows;
|
||||
LocalVector<float> rows_baseline;
|
||||
|
||||
int align_to_row = -1;
|
||||
int total_width = 0;
|
||||
int total_height = 0;
|
||||
InlineAlignment inline_align = INLINE_ALIGNMENT_TOP;
|
||||
|
@ -592,7 +594,7 @@ public:
|
|||
void push_list(int p_level, ListType p_list, bool p_capitalize);
|
||||
void push_meta(const Variant &p_meta);
|
||||
void push_hint(const String &p_string);
|
||||
void push_table(int p_columns, InlineAlignment p_alignment = INLINE_ALIGNMENT_TOP);
|
||||
void push_table(int p_columns, InlineAlignment p_alignment = INLINE_ALIGNMENT_TOP, int p_align_to_row = -1);
|
||||
void push_fade(int p_start_index, int p_length);
|
||||
void push_shake(int p_strength, float p_rate, bool p_connected);
|
||||
void push_wave(float p_frequency, float p_amplitude, bool p_connected);
|
||||
|
|
|
@ -56,8 +56,8 @@ void TextLine::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_bidi_override", "override"), &TextLine::set_bidi_override);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("add_string", "text", "font", "font_size", "language", "meta"), &TextLine::add_string, DEFVAL(""), DEFVAL(Variant()));
|
||||
ClassDB::bind_method(D_METHOD("add_object", "key", "size", "inline_align", "length"), &TextLine::add_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(1));
|
||||
ClassDB::bind_method(D_METHOD("resize_object", "key", "size", "inline_align"), &TextLine::resize_object, DEFVAL(INLINE_ALIGNMENT_CENTER));
|
||||
ClassDB::bind_method(D_METHOD("add_object", "key", "size", "inline_align", "length", "baseline"), &TextLine::add_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(1), DEFVAL(0.0));
|
||||
ClassDB::bind_method(D_METHOD("resize_object", "key", "size", "inline_align", "baseline"), &TextLine::resize_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(0.0));
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_width", "width"), &TextLine::set_width);
|
||||
ClassDB::bind_method(D_METHOD("get_width"), &TextLine::get_width);
|
||||
|
@ -202,15 +202,15 @@ bool TextLine::add_string(const String &p_text, const Ref<Font> &p_font, int p_f
|
|||
return res;
|
||||
}
|
||||
|
||||
bool TextLine::add_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align, int p_length) {
|
||||
bool res = TS->shaped_text_add_object(rid, p_key, p_size, p_inline_align, p_length);
|
||||
bool TextLine::add_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align, int p_length, float p_baseline) {
|
||||
bool res = TS->shaped_text_add_object(rid, p_key, p_size, p_inline_align, p_length, p_baseline);
|
||||
dirty = true;
|
||||
return res;
|
||||
}
|
||||
|
||||
bool TextLine::resize_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align) {
|
||||
bool TextLine::resize_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align, float p_baseline) {
|
||||
const_cast<TextLine *>(this)->_shape();
|
||||
return TS->shaped_text_resize_object(rid, p_key, p_size, p_inline_align);
|
||||
return TS->shaped_text_resize_object(rid, p_key, p_size, p_inline_align, p_baseline);
|
||||
}
|
||||
|
||||
Array TextLine::get_objects() const {
|
||||
|
|
|
@ -76,8 +76,8 @@ public:
|
|||
bool get_preserve_control() const;
|
||||
|
||||
bool add_string(const String &p_text, const Ref<Font> &p_font, int p_font_size, const String &p_language = "", const Variant &p_meta = Variant());
|
||||
bool add_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int p_length = 1);
|
||||
bool resize_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER);
|
||||
bool add_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int p_length = 1, float p_baseline = 0.0);
|
||||
bool resize_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, float p_baseline = 0.0);
|
||||
|
||||
void set_horizontal_alignment(HorizontalAlignment p_alignment);
|
||||
HorizontalAlignment get_horizontal_alignment() const;
|
||||
|
|
|
@ -64,8 +64,8 @@ void TextParagraph::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("clear_dropcap"), &TextParagraph::clear_dropcap);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("add_string", "text", "font", "font_size", "language", "meta"), &TextParagraph::add_string, DEFVAL(""), DEFVAL(Variant()));
|
||||
ClassDB::bind_method(D_METHOD("add_object", "key", "size", "inline_align", "length"), &TextParagraph::add_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(1));
|
||||
ClassDB::bind_method(D_METHOD("resize_object", "key", "size", "inline_align"), &TextParagraph::resize_object, DEFVAL(INLINE_ALIGNMENT_CENTER));
|
||||
ClassDB::bind_method(D_METHOD("add_object", "key", "size", "inline_align", "length", "baseline"), &TextParagraph::add_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(1), DEFVAL(0.0));
|
||||
ClassDB::bind_method(D_METHOD("resize_object", "key", "size", "inline_align", "baseline"), &TextParagraph::resize_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(0.0));
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_alignment", "alignment"), &TextParagraph::set_alignment);
|
||||
ClassDB::bind_method(D_METHOD("get_alignment"), &TextParagraph::get_alignment);
|
||||
|
@ -385,18 +385,18 @@ void TextParagraph::set_bidi_override(const Array &p_override) {
|
|||
lines_dirty = true;
|
||||
}
|
||||
|
||||
bool TextParagraph::add_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align, int p_length) {
|
||||
bool TextParagraph::add_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align, int p_length, float p_baseline) {
|
||||
_THREAD_SAFE_METHOD_
|
||||
|
||||
bool res = TS->shaped_text_add_object(rid, p_key, p_size, p_inline_align, p_length);
|
||||
bool res = TS->shaped_text_add_object(rid, p_key, p_size, p_inline_align, p_length, p_baseline);
|
||||
lines_dirty = true;
|
||||
return res;
|
||||
}
|
||||
|
||||
bool TextParagraph::resize_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align) {
|
||||
bool TextParagraph::resize_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align, float p_baseline) {
|
||||
_THREAD_SAFE_METHOD_
|
||||
|
||||
bool res = TS->shaped_text_resize_object(rid, p_key, p_size, p_inline_align);
|
||||
bool res = TS->shaped_text_resize_object(rid, p_key, p_size, p_inline_align, p_baseline);
|
||||
lines_dirty = true;
|
||||
return res;
|
||||
}
|
||||
|
|
|
@ -95,8 +95,8 @@ public:
|
|||
void clear_dropcap();
|
||||
|
||||
bool add_string(const String &p_text, const Ref<Font> &p_font, int p_font_size, const String &p_language = "", const Variant &p_meta = Variant());
|
||||
bool add_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int p_length = 1);
|
||||
bool resize_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER);
|
||||
bool add_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int p_length = 1, float p_baseline = 0.0);
|
||||
bool resize_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, float p_baseline = 0.0);
|
||||
|
||||
void set_alignment(HorizontalAlignment p_alignment);
|
||||
HorizontalAlignment get_alignment() const;
|
||||
|
|
|
@ -240,8 +240,8 @@ void TextServerExtension::_bind_methods() {
|
|||
GDVIRTUAL_BIND(_shaped_text_get_spacing, "shaped", "spacing");
|
||||
|
||||
GDVIRTUAL_BIND(_shaped_text_add_string, "shaped", "text", "fonts", "size", "opentype_features", "language", "meta");
|
||||
GDVIRTUAL_BIND(_shaped_text_add_object, "shaped", "key", "size", "inline_align", "length");
|
||||
GDVIRTUAL_BIND(_shaped_text_resize_object, "shaped", "key", "size", "inline_align");
|
||||
GDVIRTUAL_BIND(_shaped_text_add_object, "shaped", "key", "size", "inline_align", "length", "baseline");
|
||||
GDVIRTUAL_BIND(_shaped_text_resize_object, "shaped", "key", "size", "inline_align", "baseline");
|
||||
|
||||
GDVIRTUAL_BIND(_shaped_get_span_count, "shaped");
|
||||
GDVIRTUAL_BIND(_shaped_get_span_meta, "shaped", "index");
|
||||
|
@ -1041,15 +1041,15 @@ bool TextServerExtension::shaped_text_add_string(const RID &p_shaped, const Stri
|
|||
return ret;
|
||||
}
|
||||
|
||||
bool TextServerExtension::shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length) {
|
||||
bool TextServerExtension::shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length, float p_baseline) {
|
||||
bool ret = false;
|
||||
GDVIRTUAL_CALL(_shaped_text_add_object, p_shaped, p_key, p_size, p_inline_align, p_length, ret);
|
||||
GDVIRTUAL_CALL(_shaped_text_add_object, p_shaped, p_key, p_size, p_inline_align, p_length, p_baseline, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool TextServerExtension::shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align) {
|
||||
bool TextServerExtension::shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, float p_baseline) {
|
||||
bool ret = false;
|
||||
GDVIRTUAL_CALL(_shaped_text_resize_object, p_shaped, p_key, p_size, p_inline_align, ret);
|
||||
GDVIRTUAL_CALL(_shaped_text_resize_object, p_shaped, p_key, p_size, p_inline_align, p_baseline, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -395,11 +395,11 @@ public:
|
|||
GDVIRTUAL2RC(int64_t, _shaped_text_get_spacing, RID, SpacingType);
|
||||
|
||||
virtual bool shaped_text_add_string(const RID &p_shaped, const String &p_text, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features = Dictionary(), const String &p_language = "", const Variant &p_meta = Variant()) override;
|
||||
virtual bool shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int64_t p_length = 1) override;
|
||||
virtual bool shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER) override;
|
||||
virtual bool shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int64_t p_length = 1, float p_baseline = 0.0) override;
|
||||
virtual bool shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, float p_baseline = 0.0) override;
|
||||
GDVIRTUAL7R(bool, _shaped_text_add_string, RID, const String &, const TypedArray<RID> &, int64_t, const Dictionary &, const String &, const Variant &);
|
||||
GDVIRTUAL5R(bool, _shaped_text_add_object, RID, const Variant &, const Size2 &, InlineAlignment, int64_t);
|
||||
GDVIRTUAL4R(bool, _shaped_text_resize_object, RID, const Variant &, const Size2 &, InlineAlignment);
|
||||
GDVIRTUAL6R(bool, _shaped_text_add_object, RID, const Variant &, const Size2 &, InlineAlignment, int64_t, float);
|
||||
GDVIRTUAL5R(bool, _shaped_text_resize_object, RID, const Variant &, const Size2 &, InlineAlignment, float);
|
||||
|
||||
virtual int64_t shaped_get_span_count(const RID &p_shaped) const override;
|
||||
virtual Variant shaped_get_span_meta(const RID &p_shaped, int64_t p_index) const override;
|
||||
|
|
|
@ -394,8 +394,8 @@ void TextServer::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("shaped_text_get_spacing", "shaped", "spacing"), &TextServer::shaped_text_get_spacing);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("shaped_text_add_string", "shaped", "text", "fonts", "size", "opentype_features", "language", "meta"), &TextServer::shaped_text_add_string, DEFVAL(Dictionary()), DEFVAL(""), DEFVAL(Variant()));
|
||||
ClassDB::bind_method(D_METHOD("shaped_text_add_object", "shaped", "key", "size", "inline_align", "length"), &TextServer::shaped_text_add_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(1));
|
||||
ClassDB::bind_method(D_METHOD("shaped_text_resize_object", "shaped", "key", "size", "inline_align"), &TextServer::shaped_text_resize_object, DEFVAL(INLINE_ALIGNMENT_CENTER));
|
||||
ClassDB::bind_method(D_METHOD("shaped_text_add_object", "shaped", "key", "size", "inline_align", "length", "baseline"), &TextServer::shaped_text_add_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(1), DEFVAL(0.0));
|
||||
ClassDB::bind_method(D_METHOD("shaped_text_resize_object", "shaped", "key", "size", "inline_align", "baseline"), &TextServer::shaped_text_resize_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(0.0));
|
||||
|
||||
ClassDB::bind_method(D_METHOD("shaped_get_span_count", "shaped"), &TextServer::shaped_get_span_count);
|
||||
ClassDB::bind_method(D_METHOD("shaped_get_span_meta", "shaped", "index"), &TextServer::shaped_get_span_meta);
|
||||
|
|
|
@ -420,8 +420,8 @@ public:
|
|||
virtual int64_t shaped_text_get_spacing(const RID &p_shaped, SpacingType p_spacing) const = 0;
|
||||
|
||||
virtual bool shaped_text_add_string(const RID &p_shaped, const String &p_text, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features = Dictionary(), const String &p_language = "", const Variant &p_meta = Variant()) = 0;
|
||||
virtual bool shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int64_t p_length = 1) = 0;
|
||||
virtual bool shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER) = 0;
|
||||
virtual bool shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int64_t p_length = 1, float p_baseline = 0.0) = 0;
|
||||
virtual bool shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, float p_baseline = 0.0) = 0;
|
||||
|
||||
virtual int64_t shaped_get_span_count(const RID &p_shaped) const = 0;
|
||||
virtual Variant shaped_get_span_meta(const RID &p_shaped, int64_t p_index) const = 0;
|
||||
|
|
Loading…
Reference in a new issue