Skip to content

Commit 01b9208

Browse files
committed
LineEdit: now correctly emits text_changed on Unicode code-point and control character insertion.
1 parent 2043023 commit 01b9208

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

scene/gui/line_edit.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -819,6 +819,7 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) {
819819
if ((!k->is_pressed() && alt_start && k->get_keycode() == Key::ALT) || (alt_start_no_hold && (k->is_action("ui_text_submit", true) || k->is_action("ui_accept", true)))) {
820820
alt_start = false;
821821
alt_start_no_hold = false;
822+
int prev_len = text.length();
822823
if ((alt_code > 0x31 && alt_code < 0xd800) || (alt_code > 0xdfff)) {
823824
ime_text = String();
824825
ime_selection = Vector2i();
@@ -845,6 +846,13 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) {
845846
}
846847
}
847848
alt_mode = ALT_INPUT_NONE;
849+
// Mirror paste behavior: defer _text_changed once per frame while emitting text_changed signal.
850+
if (!text_changed_dirty) {
851+
if (is_inside_tree() && text.length() != prev_len) {
852+
callable_mp(this, &LineEdit::_text_changed).call_deferred();
853+
}
854+
text_changed_dirty = true;
855+
}
848856
} else {
849857
ime_text = String();
850858
ime_selection = Vector2i();
@@ -2589,6 +2597,8 @@ bool LineEdit::is_text_field() const {
25892597
}
25902598

25912599
void LineEdit::menu_option(int p_option) {
2600+
int prev_len = text.length();
2601+
bool inserted_control_char = false;
25922602
switch (p_option) {
25932603
case MENU_CUT: {
25942604
if (editable) {
@@ -2639,87 +2649,111 @@ void LineEdit::menu_option(int p_option) {
26392649
case MENU_INSERT_LRM: {
26402650
if (editable) {
26412651
insert_text_at_caret(String::chr(0x200E));
2652+
inserted_control_char = true;
26422653
}
26432654
} break;
26442655
case MENU_INSERT_RLM: {
26452656
if (editable) {
26462657
insert_text_at_caret(String::chr(0x200F));
2658+
inserted_control_char = true;
26472659
}
26482660
} break;
26492661
case MENU_INSERT_LRE: {
26502662
if (editable) {
26512663
insert_text_at_caret(String::chr(0x202A));
2664+
inserted_control_char = true;
26522665
}
26532666
} break;
26542667
case MENU_INSERT_RLE: {
26552668
if (editable) {
26562669
insert_text_at_caret(String::chr(0x202B));
2670+
inserted_control_char = true;
26572671
}
26582672
} break;
26592673
case MENU_INSERT_LRO: {
26602674
if (editable) {
26612675
insert_text_at_caret(String::chr(0x202D));
2676+
inserted_control_char = true;
26622677
}
26632678
} break;
26642679
case MENU_INSERT_RLO: {
26652680
if (editable) {
26662681
insert_text_at_caret(String::chr(0x202E));
2682+
inserted_control_char = true;
26672683
}
26682684
} break;
26692685
case MENU_INSERT_PDF: {
26702686
if (editable) {
26712687
insert_text_at_caret(String::chr(0x202C));
2688+
inserted_control_char = true;
26722689
}
26732690
} break;
26742691
case MENU_INSERT_ALM: {
26752692
if (editable) {
26762693
insert_text_at_caret(String::chr(0x061C));
2694+
inserted_control_char = true;
26772695
}
26782696
} break;
26792697
case MENU_INSERT_LRI: {
26802698
if (editable) {
26812699
insert_text_at_caret(String::chr(0x2066));
2700+
inserted_control_char = true;
26822701
}
26832702
} break;
26842703
case MENU_INSERT_RLI: {
26852704
if (editable) {
26862705
insert_text_at_caret(String::chr(0x2067));
2706+
inserted_control_char = true;
26872707
}
26882708
} break;
26892709
case MENU_INSERT_FSI: {
26902710
if (editable) {
26912711
insert_text_at_caret(String::chr(0x2068));
2712+
inserted_control_char = true;
26922713
}
26932714
} break;
26942715
case MENU_INSERT_PDI: {
26952716
if (editable) {
26962717
insert_text_at_caret(String::chr(0x2069));
2718+
inserted_control_char = true;
26972719
}
26982720
} break;
26992721
case MENU_INSERT_ZWJ: {
27002722
if (editable) {
27012723
insert_text_at_caret(String::chr(0x200D));
2724+
inserted_control_char = true;
27022725
}
27032726
} break;
27042727
case MENU_INSERT_ZWNJ: {
27052728
if (editable) {
27062729
insert_text_at_caret(String::chr(0x200C));
2730+
inserted_control_char = true;
27072731
}
27082732
} break;
27092733
case MENU_INSERT_WJ: {
27102734
if (editable) {
27112735
insert_text_at_caret(String::chr(0x2060));
2736+
inserted_control_char = true;
27122737
}
27132738
} break;
27142739
case MENU_INSERT_SHY: {
27152740
if (editable) {
27162741
insert_text_at_caret(String::chr(0x00AD));
2742+
inserted_control_char = true;
27172743
}
27182744
} break;
27192745
case MENU_EMOJI_AND_SYMBOL: {
27202746
show_emoji_and_symbol_picker();
27212747
} break;
27222748
}
2749+
2750+
// Mirror paste/drag behavior, emit text_changed signal if a control character was inserted.
2751+
if (inserted_control_char && !text_changed_dirty) {
2752+
if (is_inside_tree() && text.length() != prev_len) {
2753+
callable_mp(this, &LineEdit::_text_changed).call_deferred();
2754+
}
2755+
text_changed_dirty = true;
2756+
}
27232757
}
27242758

27252759
void LineEdit::set_context_menu_enabled(bool p_enable) {

0 commit comments

Comments
 (0)