Add signal for LineEdit overflow event

This commit is contained in:
Tomasz Chabora 2020-01-10 21:07:00 +01:00
parent 4b3123104c
commit 60cd3df337
2 changed files with 14 additions and 2 deletions

View file

@ -145,6 +145,11 @@
Emitted when the text changes. Emitted when the text changes.
</description> </description>
</signal> </signal>
<signal name="text_change_rejected">
<description>
Emitted when trying to append text that would overflow the [member max_length].
</description>
</signal>
<signal name="text_entered"> <signal name="text_entered">
<argument index="0" name="new_text" type="String"> <argument index="0" name="new_text" type="String">
</argument> </argument>

View file

@ -557,8 +557,11 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) {
if (editable) { if (editable) {
selection_delete(); selection_delete();
CharType ucodestr[2] = { (CharType)k->get_unicode(), 0 }; CharType ucodestr[2] = { (CharType)k->get_unicode(), 0 };
int prev_len = text.length();
append_at_cursor(ucodestr); append_at_cursor(ucodestr);
_text_changed(); if (text.length() != prev_len) {
_text_changed();
}
accept_event(); accept_event();
} }
@ -961,11 +964,12 @@ void LineEdit::paste_text() {
if (paste_buffer != "") { if (paste_buffer != "") {
int prev_len = text.length();
if (selection.enabled) selection_delete(); if (selection.enabled) selection_delete();
append_at_cursor(paste_buffer); append_at_cursor(paste_buffer);
if (!text_changed_dirty) { if (!text_changed_dirty) {
if (is_inside_tree()) { if (is_inside_tree() && text.length() != prev_len) {
MessageQueue::get_singleton()->push_call(this, "_text_changed"); MessageQueue::get_singleton()->push_call(this, "_text_changed");
} }
text_changed_dirty = true; text_changed_dirty = true;
@ -1362,6 +1366,8 @@ void LineEdit::append_at_cursor(String p_text) {
String post = text.substr(cursor_pos, text.length() - cursor_pos); String post = text.substr(cursor_pos, text.length() - cursor_pos);
text = pre + p_text + post; text = pre + p_text + post;
set_cursor_position(cursor_pos + p_text.length()); set_cursor_position(cursor_pos + p_text.length());
} else {
emit_signal("text_change_rejected");
} }
} }
@ -1781,6 +1787,7 @@ void LineEdit::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_right_icon"), &LineEdit::get_right_icon); ClassDB::bind_method(D_METHOD("get_right_icon"), &LineEdit::get_right_icon);
ADD_SIGNAL(MethodInfo("text_changed", PropertyInfo(Variant::STRING, "new_text"))); ADD_SIGNAL(MethodInfo("text_changed", PropertyInfo(Variant::STRING, "new_text")));
ADD_SIGNAL(MethodInfo("text_change_rejected"));
ADD_SIGNAL(MethodInfo("text_entered", PropertyInfo(Variant::STRING, "new_text"))); ADD_SIGNAL(MethodInfo("text_entered", PropertyInfo(Variant::STRING, "new_text")));
BIND_ENUM_CONSTANT(ALIGN_LEFT); BIND_ENUM_CONSTANT(ALIGN_LEFT);