diff options
-rw-r--r-- | doc/classes/LineEdit.xml | 5 | ||||
-rw-r--r-- | scene/gui/line_edit.cpp | 11 |
2 files changed, 14 insertions, 2 deletions
diff --git a/doc/classes/LineEdit.xml b/doc/classes/LineEdit.xml index a360010b7e..d428c133af 100644 --- a/doc/classes/LineEdit.xml +++ b/doc/classes/LineEdit.xml @@ -145,6 +145,11 @@ Emitted when the text changes. </description> </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"> <argument index="0" name="new_text" type="String"> </argument> diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index 8f5f6beac3..5351b6cadc 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -557,8 +557,11 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { if (editable) { selection_delete(); CharType ucodestr[2] = { (CharType)k->get_unicode(), 0 }; + int prev_len = text.length(); append_at_cursor(ucodestr); - _text_changed(); + if (text.length() != prev_len) { + _text_changed(); + } accept_event(); } @@ -961,11 +964,12 @@ void LineEdit::paste_text() { if (paste_buffer != "") { + int prev_len = text.length(); if (selection.enabled) selection_delete(); append_at_cursor(paste_buffer); if (!text_changed_dirty) { - if (is_inside_tree()) { + if (is_inside_tree() && text.length() != prev_len) { MessageQueue::get_singleton()->push_call(this, "_text_changed"); } 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); text = pre + p_text + post; 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); 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"))); BIND_ENUM_CONSTANT(ALIGN_LEFT); |