Merge pull request #35768 from Eoin-ONeill-Yokai/hiddenRichText
Fix to RichTextEffect `visibility` - Label Now Accounts for Skipped Characters.
This commit is contained in:
commit
ad2ceaade2
1 changed files with 12 additions and 3 deletions
|
@ -204,6 +204,8 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int &
|
|||
int line_ascent = cfont->get_ascent();
|
||||
int line_descent = cfont->get_descent();
|
||||
|
||||
int backtrack = 0; // for dynamic hidden content.
|
||||
|
||||
int nonblank_line_count = 0; //number of nonblank lines as counted during PROCESS_DRAW
|
||||
|
||||
Variant meta;
|
||||
|
@ -214,6 +216,7 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int &
|
|||
{ \
|
||||
if (p_mode != PROCESS_CACHE) { \
|
||||
line++; \
|
||||
backtrack = 0; \
|
||||
if (!line_is_blank) { \
|
||||
nonblank_line_count++; \
|
||||
} \
|
||||
|
@ -263,7 +266,7 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int &
|
|||
l.maximum_width = MAX(l.maximum_width, MIN(p_width, wofs + m_width)); \
|
||||
l.minimum_width = MAX(l.minimum_width, m_width); \
|
||||
} \
|
||||
if (wofs + m_width > p_width) { \
|
||||
if (wofs - backtrack + m_width > p_width) { \
|
||||
line_wrapped = true; \
|
||||
if (p_mode == PROCESS_CACHE) { \
|
||||
if (spaces > 0) \
|
||||
|
@ -390,6 +393,7 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int &
|
|||
int fw = 0;
|
||||
|
||||
lh = 0;
|
||||
|
||||
if (p_mode != PROCESS_CACHE) {
|
||||
lh = line < l.height_caches.size() ? l.height_caches[line] : 1;
|
||||
line_ascent = line < l.ascent_caches.size() ? l.ascent_caches[line] : 1;
|
||||
|
@ -432,13 +436,12 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int &
|
|||
|
||||
{
|
||||
|
||||
int ofs = 0;
|
||||
int ofs = 0 - backtrack;
|
||||
|
||||
for (int i = 0; i < end; i++) {
|
||||
int pofs = wofs + ofs;
|
||||
|
||||
if (p_mode == PROCESS_POINTER && r_click_char && p_click_pos.y >= p_ofs.y + y && p_click_pos.y <= p_ofs.y + y + lh) {
|
||||
//int o = (wofs+w)-p_click_pos.x;
|
||||
|
||||
int cw = font->get_char_size(c[i], c[i + 1]).x;
|
||||
|
||||
|
@ -481,7 +484,10 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int &
|
|||
bool visible = visible_characters < 0 || ((p_char_count < visible_characters && YRANGE_VISIBLE(y + lh - line_descent - line_ascent, line_ascent + line_descent)) &&
|
||||
faded_visibility > 0.0f);
|
||||
|
||||
const bool previously_visible = visible;
|
||||
|
||||
for (int j = 0; j < fx_stack.size(); j++) {
|
||||
|
||||
ItemFX *item_fx = fx_stack[j];
|
||||
|
||||
if (item_fx->type == ITEM_CUSTOMFX && custom_fx_ok) {
|
||||
|
@ -575,6 +581,8 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int &
|
|||
} else {
|
||||
cw = drawer.draw_char(ci, p_ofs + Point2(align_ofs + pofs, y + lh - line_descent) + fx_offset, fx_char, c[i + 1], fx_color);
|
||||
}
|
||||
} else if (previously_visible) {
|
||||
backtrack += font->get_char_size(fx_char, c[i + 1]).x;
|
||||
}
|
||||
|
||||
p_char_count++;
|
||||
|
@ -648,6 +656,7 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int &
|
|||
case ITEM_NEWLINE: {
|
||||
|
||||
lh = 0;
|
||||
|
||||
if (p_mode != PROCESS_CACHE) {
|
||||
lh = line < l.height_caches.size() ? l.height_caches[line] : 1;
|
||||
line_is_blank = true;
|
||||
|
|
Loading…
Reference in a new issue