[Complex Test Layouts] Change String to use UTF-32 encoding on all platforms.

This commit is contained in:
bruvzg
2020-07-27 13:43:20 +03:00
parent 0864f12f0d
commit 80b8eff6aa
94 changed files with 4889 additions and 1686 deletions

View File

@ -44,23 +44,23 @@
#define TAB_PIXELS
inline bool _is_symbol(CharType c) {
inline bool _is_symbol(char32_t c) {
return is_symbol(c);
}
static bool _is_text_char(CharType c) {
static bool _is_text_char(char32_t c) {
return !is_symbol(c);
}
static bool _is_whitespace(CharType c) {
static bool _is_whitespace(char32_t c) {
return c == '\t' || c == ' ';
}
static bool _is_char(CharType c) {
static bool _is_char(char32_t c) {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_';
}
static bool _is_pair_right_symbol(CharType c) {
static bool _is_pair_right_symbol(char32_t c) {
return c == '"' ||
c == '\'' ||
c == ')' ||
@ -68,7 +68,7 @@ static bool _is_pair_right_symbol(CharType c) {
c == '}';
}
static bool _is_pair_left_symbol(CharType c) {
static bool _is_pair_left_symbol(char32_t c) {
return c == '"' ||
c == '\'' ||
c == '(' ||
@ -76,11 +76,11 @@ static bool _is_pair_left_symbol(CharType c) {
c == '{';
}
static bool _is_pair_symbol(CharType c) {
static bool _is_pair_symbol(char32_t c) {
return _is_pair_left_symbol(c) || _is_pair_right_symbol(c);
}
static CharType _get_right_pair_symbol(CharType c) {
static char32_t _get_right_pair_symbol(char32_t c) {
if (c == '"') {
return '"';
}
@ -119,7 +119,7 @@ void TextEdit::Text::_update_line_cache(int p_line) const {
int w = 0;
int len = text[p_line].data.length();
const CharType *str = text[p_line].data.c_str();
const char32_t *str = text[p_line].data.get_data();
// Update width.
@ -214,7 +214,7 @@ void TextEdit::Text::remove(int p_at) {
text.remove(p_at);
}
int TextEdit::Text::get_char_width(CharType c, CharType next_c, int px) const {
int TextEdit::Text::get_char_width(char32_t c, char32_t next_c, int px) const {
int tab_w = font->get_char_size(' ').width * indent_size;
int w = 0;
@ -654,8 +654,8 @@ void TextEdit::_notification(int p_what) {
if (brace_matching_enabled && cursor.line >= 0 && cursor.line < text.size() && cursor.column >= 0) {
if (cursor.column < text[cursor.line].length()) {
// Check for open.
CharType c = text[cursor.line][cursor.column];
CharType closec = 0;
char32_t c = text[cursor.line][cursor.column];
char32_t closec = 0;
if (c == '[') {
closec = ']';
@ -671,10 +671,10 @@ void TextEdit::_notification(int p_what) {
for (int i = cursor.line; i < text.size(); i++) {
int from = i == cursor.line ? cursor.column + 1 : 0;
for (int j = from; j < text[i].length(); j++) {
CharType cc = text[i][j];
char32_t cc = text[i][j];
// Ignore any brackets inside a string.
if (cc == '"' || cc == '\'') {
CharType quotation = cc;
char32_t quotation = cc;
do {
j++;
if (!(j < text[i].length())) {
@ -720,8 +720,8 @@ void TextEdit::_notification(int p_what) {
}
if (cursor.column > 0) {
CharType c = text[cursor.line][cursor.column - 1];
CharType closec = 0;
char32_t c = text[cursor.line][cursor.column - 1];
char32_t closec = 0;
if (c == ']') {
closec = '[';
@ -737,10 +737,10 @@ void TextEdit::_notification(int p_what) {
for (int i = cursor.line; i >= 0; i--) {
int from = i == cursor.line ? cursor.column - 2 : text[i].length() - 1;
for (int j = from; j >= 0; j--) {
CharType cc = text[i][j];
char32_t cc = text[i][j];
// Ignore any brackets inside a string.
if (cc == '"' || cc == '\'') {
CharType quotation = cc;
char32_t quotation = cc;
do {
j--;
if (!(j >= 0)) {
@ -1303,8 +1303,8 @@ void TextEdit::_notification(int p_what) {
break;
}
CharType cchar = ime_text[ofs];
CharType next = ime_text[ofs + 1];
char32_t cchar = ime_text[ofs];
char32_t next = ime_text[ofs + 1];
int im_char_width = cache.font->get_char_size(cchar, next).width;
if ((char_ofs + char_margin + im_char_width) >= xmargin_end) {
@ -1399,8 +1399,8 @@ void TextEdit::_notification(int p_what) {
break;
}
CharType cchar = ime_text[ofs];
CharType next = ime_text[ofs + 1];
char32_t cchar = ime_text[ofs];
char32_t next = ime_text[ofs + 1];
int im_char_width = cache.font->get_char_size(cchar, next).width;
if ((char_ofs + char_margin + im_char_width) >= xmargin_end) {
@ -1661,12 +1661,12 @@ void TextEdit::_notification(int p_what) {
}
}
void TextEdit::_consume_pair_symbol(CharType ch) {
void TextEdit::_consume_pair_symbol(char32_t ch) {
int cursor_position_to_move = cursor_get_column() + 1;
CharType ch_single[2] = { ch, 0 };
CharType ch_single_pair[2] = { _get_right_pair_symbol(ch), 0 };
CharType ch_pair[3] = { ch, _get_right_pair_symbol(ch), 0 };
char32_t ch_single[2] = { ch, 0 };
char32_t ch_single_pair[2] = { _get_right_pair_symbol(ch), 0 };
char32_t ch_pair[3] = { ch, _get_right_pair_symbol(ch), 0 };
if (is_selection_active()) {
int new_column, new_line;
@ -1771,8 +1771,8 @@ void TextEdit::_consume_backspace_for_pair_symbol(int prev_line, int prev_column
bool remove_right_symbol = false;
if (cursor.column < text[cursor.line].length() && cursor.column > 0) {
CharType left_char = text[cursor.line][cursor.column - 1];
CharType right_char = text[cursor.line][cursor.column];
char32_t left_char = text[cursor.line][cursor.column - 1];
char32_t right_char = text[cursor.line][cursor.column];
if (right_char == _get_right_pair_symbol(left_char)) {
remove_right_symbol = true;
@ -2540,7 +2540,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
if (k->get_unicode() > 32) {
_reset_caret_blink_timer();
const CharType chr[2] = { (CharType)k->get_unicode(), 0 };
const char32_t chr[2] = { (char32_t)k->get_unicode(), 0 };
if (auto_brace_completion_enabled && _is_pair_symbol(chr[0])) {
_consume_pair_symbol(chr[0]);
} else {
@ -2784,7 +2784,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
}
// No need to move the brace below if we are not taking the text with us.
char closing_char = _get_right_pair_symbol(indent_char);
char32_t closing_char = _get_right_pair_symbol(indent_char);
if ((closing_char != 0) && (closing_char == text[cursor.line][cursor.column]) && !k->get_command()) {
brace_indent = true;
ins += "\n" + ins.substr(1, ins.length() - 2);
@ -3312,7 +3312,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
// Compute whitespace symbols seq length.
int current_line_whitespace_len = 0;
while (current_line_whitespace_len < text[cursor.line].length()) {
CharType c = text[cursor.line][current_line_whitespace_len];
char32_t c = text[cursor.line][current_line_whitespace_len];
if (c != '\t' && c != ' ') {
break;
}
@ -3458,7 +3458,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
int current_line_whitespace_len = 0;
while (current_line_whitespace_len < text[cursor.line].length()) {
CharType c = text[cursor.line][current_line_whitespace_len];
char32_t c = text[cursor.line][current_line_whitespace_len];
if (c != '\t' && c != ' ')
break;
current_line_whitespace_len++;
@ -3624,7 +3624,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
}
}
const CharType chr[2] = { (CharType)k->get_unicode(), 0 };
const char32_t chr[2] = { (char32_t)k->get_unicode(), 0 };
if (completion_hint != "" && k->get_unicode() == ')') {
completion_hint = "";
@ -4251,7 +4251,7 @@ Vector<String> TextEdit::get_wrap_rows_text(int p_line) const {
}
while (col < line_text.length()) {
CharType c = line_text[col];
char32_t c = line_text[col];
int w = text.get_char_width(c, line_text[col + 1], px + word_px);
int indent_ofs = (cur_wrap_index != 0 ? tab_offset_px : 0);
@ -6115,9 +6115,9 @@ void TextEdit::_confirm_completion() {
// When inserted into the middle of an existing string/method, don't add an unnecessary quote/bracket.
String line = text[cursor.line];
CharType next_char = line[cursor.column];
CharType last_completion_char = completion_current.insert_text[completion_current.insert_text.length() - 1];
CharType last_completion_char_display = completion_current.display[completion_current.display.length() - 1];
char32_t next_char = line[cursor.column];
char32_t last_completion_char = completion_current.insert_text[completion_current.insert_text.length() - 1];
char32_t last_completion_char_display = completion_current.display[completion_current.display.length() - 1];
if ((last_completion_char == '"' || last_completion_char == '\'') && (last_completion_char == next_char || last_completion_char_display == next_char)) {
_remove_text(cursor.line, cursor.column, cursor.line, cursor.column + 1);
@ -6161,7 +6161,7 @@ void TextEdit::_cancel_completion() {
update();
}
static bool _is_completable(CharType c) {
static bool _is_completable(char32_t c) {
return !_is_symbol(c) || c == '"' || c == '\'';
}
@ -6292,14 +6292,14 @@ void TextEdit::_update_completion_candidates() {
String display_lower = option.display.to_lower();
const CharType *ssq = &s[0];
const CharType *ssq_lower = &s_lower[0];
const char32_t *ssq = &s[0];
const char32_t *ssq_lower = &s_lower[0];
const CharType *tgt = &option.display[0];
const CharType *tgt_lower = &display_lower[0];
const char32_t *tgt = &option.display[0];
const char32_t *tgt_lower = &display_lower[0];
const CharType *ssq_last_tgt = nullptr;
const CharType *ssq_lower_last_tgt = nullptr;
const char32_t *ssq_last_tgt = nullptr;
const char32_t *ssq_lower_last_tgt = nullptr;
for (; *tgt; tgt++, tgt_lower++) {
if (*ssq == *tgt) {
@ -6416,7 +6416,7 @@ String TextEdit::get_word_at_pos(const Vector2 &p_pos) const {
int beg, end;
if (select_word(s, col, beg, end)) {
bool inside_quotes = false;
CharType selected_quote = '\0';
char32_t selected_quote = '\0';
int qbegin = 0, qend = 0;
for (int i = 0; i < s.length(); i++) {
if (s[i] == '"' || s[i] == '\'') {