Fix LineEdit and TextEdit composite character backspace delete.

This commit is contained in:
Koyper 2025-04-22 10:02:07 -05:00
parent 9f03bbf908
commit b668f45fd0
7 changed files with 139 additions and 5 deletions

View file

@ -1955,11 +1955,14 @@ void LineEdit::delete_char() {
if (text.is_empty() || caret_column == 0) {
return;
}
text = text.left(caret_column - 1) + text.substr(caret_column);
int delete_char_offset = 1;
if (!caret_mid_grapheme_enabled && backspace_deletes_composite_character_enabled) {
delete_char_offset = caret_column - get_previous_composite_character_column(caret_column);
}
text = text.left(caret_column - delete_char_offset) + text.substr(caret_column);
_shape();
set_caret_column(get_caret_column() - 1);
set_caret_column(get_caret_column() - delete_char_offset);
_text_changed();
}
@ -2213,6 +2216,24 @@ int LineEdit::get_caret_column() const {
return caret_column;
}
int LineEdit::get_next_composite_character_column(int p_column) const {
ERR_FAIL_INDEX_V(p_column, text.length() + 1, -1);
if (p_column == text.length()) {
return p_column;
} else {
return TS->shaped_text_next_character_pos(text_rid, p_column);
}
}
int LineEdit::get_previous_composite_character_column(int p_column) const {
ERR_FAIL_INDEX_V(p_column, text.length() + 1, -1);
if (p_column == 0) {
return 0;
} else {
return TS->shaped_text_prev_character_pos(text_rid, p_column);
}
}
void LineEdit::set_scroll_offset(float p_pos) {
scroll_offset = p_pos;
if (scroll_offset < 0.0) {
@ -2629,6 +2650,14 @@ bool LineEdit::is_emoji_menu_enabled() const {
return emoji_menu_enabled;
}
void LineEdit::set_backspace_deletes_composite_character_enabled(bool p_enabled) {
backspace_deletes_composite_character_enabled = p_enabled;
}
bool LineEdit::is_backspace_deletes_composite_character_enabled() const {
return backspace_deletes_composite_character_enabled;
}
bool LineEdit::is_menu_visible() const {
return menu && menu->is_visible();
}
@ -3092,6 +3121,8 @@ void LineEdit::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_placeholder"), &LineEdit::get_placeholder);
ClassDB::bind_method(D_METHOD("set_caret_column", "position"), &LineEdit::set_caret_column);
ClassDB::bind_method(D_METHOD("get_caret_column"), &LineEdit::get_caret_column);
ClassDB::bind_method(D_METHOD("get_next_composite_character_column", "column"), &LineEdit::get_next_composite_character_column);
ClassDB::bind_method(D_METHOD("get_previous_composite_character_column", "column"), &LineEdit::get_previous_composite_character_column);
ClassDB::bind_method(D_METHOD("get_scroll_offset"), &LineEdit::get_scroll_offset);
ClassDB::bind_method(D_METHOD("set_expand_to_text_length_enabled", "enabled"), &LineEdit::set_expand_to_text_length_enabled);
ClassDB::bind_method(D_METHOD("is_expand_to_text_length_enabled"), &LineEdit::is_expand_to_text_length_enabled);
@ -3124,6 +3155,8 @@ void LineEdit::_bind_methods() {
ClassDB::bind_method(D_METHOD("is_context_menu_enabled"), &LineEdit::is_context_menu_enabled);
ClassDB::bind_method(D_METHOD("set_emoji_menu_enabled", "enable"), &LineEdit::set_emoji_menu_enabled);
ClassDB::bind_method(D_METHOD("is_emoji_menu_enabled"), &LineEdit::is_emoji_menu_enabled);
ClassDB::bind_method(D_METHOD("set_backspace_deletes_composite_character_enabled", "enable"), &LineEdit::set_backspace_deletes_composite_character_enabled);
ClassDB::bind_method(D_METHOD("is_backspace_deletes_composite_character_enabled"), &LineEdit::is_backspace_deletes_composite_character_enabled);
ClassDB::bind_method(D_METHOD("set_virtual_keyboard_enabled", "enable"), &LineEdit::set_virtual_keyboard_enabled);
ClassDB::bind_method(D_METHOD("is_virtual_keyboard_enabled"), &LineEdit::is_virtual_keyboard_enabled);
ClassDB::bind_method(D_METHOD("set_virtual_keyboard_type", "type"), &LineEdit::set_virtual_keyboard_type);
@ -3203,6 +3236,7 @@ void LineEdit::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "expand_to_text_length"), "set_expand_to_text_length_enabled", "is_expand_to_text_length_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "context_menu_enabled"), "set_context_menu_enabled", "is_context_menu_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "emoji_menu_enabled"), "set_emoji_menu_enabled", "is_emoji_menu_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "backspace_deletes_composite_character_enabled"), "set_backspace_deletes_composite_character_enabled", "is_backspace_deletes_composite_character_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "virtual_keyboard_enabled"), "set_virtual_keyboard_enabled", "is_virtual_keyboard_enabled");
ADD_PROPERTY(PropertyInfo(Variant::INT, "virtual_keyboard_type", PROPERTY_HINT_ENUM, "Default,Multiline,Number,Decimal,Phone,Email,Password,URL"), "set_virtual_keyboard_type", "get_virtual_keyboard_type");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clear_button_enabled"), "set_clear_button_enabled", "is_clear_button_enabled");