Add get_character_line method for RichTextLabel

Adds the ability to get the line number of provided character position

Fix arg name

Add get_character_paragraph

Replaced glyph logic with code suggestions, added get_character_paragraph method

Run doctool

Use built-in method

Replace TS access with built in method
This commit is contained in:
markdibarry 2022-02-11 16:02:59 -05:00
parent c576075972
commit ae7eec53c0
3 changed files with 48 additions and 0 deletions

View File

@ -49,6 +49,20 @@
Clears the tag stack and sets [member text] to an empty string.
</description>
</method>
<method name="get_character_line">
<return type="int" />
<argument index="0" name="character" type="int" />
<description>
Returns the line number of the character position provided.
</description>
</method>
<method name="get_character_paragraph">
<return type="int" />
<argument index="0" name="character" type="int" />
<description>
Returns the paragraph number of the character position provided.
</description>
</method>
<method name="get_content_height" qualifiers="const">
<return type="int" />
<description>

View File

@ -4327,6 +4327,8 @@ void RichTextLabel::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_percent_visible", "percent_visible"), &RichTextLabel::set_percent_visible);
ClassDB::bind_method(D_METHOD("get_percent_visible"), &RichTextLabel::get_percent_visible);
ClassDB::bind_method(D_METHOD("get_character_line", "character"), &RichTextLabel::get_character_line);
ClassDB::bind_method(D_METHOD("get_character_paragraph", "character"), &RichTextLabel::get_character_paragraph);
ClassDB::bind_method(D_METHOD("get_total_character_count"), &RichTextLabel::get_total_character_count);
ClassDB::bind_method(D_METHOD("set_use_bbcode", "enable"), &RichTextLabel::set_use_bbcode);
@ -4459,6 +4461,36 @@ int RichTextLabel::get_visible_characters() const {
return visible_characters;
}
int RichTextLabel::get_character_line(int p_char) {
int line_count = 0;
for (int i = 0; i < main->lines.size(); i++) {
if (main->lines[i].char_offset < p_char && p_char <= main->lines[i].char_offset + main->lines[i].char_count) {
for (int j = 0; j < main->lines[i].text_buf->get_line_count(); j++) {
Vector2i range = main->lines[i].text_buf->get_line_range(j);
if (main->lines[i].char_offset + range.x < p_char && p_char <= main->lines[i].char_offset + range.y) {
return line_count;
}
line_count++;
}
} else {
line_count += main->lines[i].text_buf->get_line_count();
}
}
return -1;
}
int RichTextLabel::get_character_paragraph(int p_char) {
int para_count = 0;
for (int i = 0; i < main->lines.size(); i++) {
if (main->lines[i].char_offset < p_char && p_char <= main->lines[i].char_offset + main->lines[i].char_count) {
return para_count;
} else {
para_count++;
}
}
return -1;
}
int RichTextLabel::get_total_character_count() const {
// Note: Do not use line buffer "char_count", it includes only visible characters.
int tc = 0;

View File

@ -598,6 +598,8 @@ public:
void set_visible_characters(int p_visible);
int get_visible_characters() const;
int get_character_line(int p_char);
int get_character_paragraph(int p_char);
int get_total_character_count() const;
int get_total_glyph_count() const;