From da6bacbc4a8802b3d87bb5cec6292dc1a3c23c68 Mon Sep 17 00:00:00 2001 From: HolonProduction Date: Tue, 5 Dec 2023 20:57:41 +0100 Subject: [PATCH] Allow dragging selection when selecting whole words in `LineEdit` --- scene/gui/line_edit.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index a6109a3925..1c5472beec 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -331,6 +331,8 @@ void LineEdit::gui_input(const Ref &p_event) { selection.begin = words[i]; selection.end = words[i + 1]; selection.double_click = true; + selection.creating = true; + selection.start_column = caret_column; set_caret_column(selection.end); break; } @@ -405,6 +407,27 @@ void LineEdit::gui_input(const Ref &p_event) { if (selection.creating) { set_caret_at_pixel_pos(m->get_position().x); selection_fill_at_caret(); + + if (selection.double_click) { + // Expand selection to whole words. + + PackedInt32Array words = TS->shaped_text_get_word_breaks(text_rid); + for (int i = 0; i < words.size(); i = i + 2) { + if ((words[i] < selection.begin && words[i + 1] > selection.begin) || (i == words.size() - 2 && selection.begin == words[i + 1])) { + selection.begin = words[i]; + } + if ((words[i] < selection.end && words[i + 1] > selection.end) || (i == words.size() - 2 && selection.end == words[i + 1])) { + selection.end = words[i + 1]; + selection.enabled = true; + break; + } + } + if (caret_column < selection.start_column) { + set_caret_column(selection.begin); + } else { + set_caret_column(selection.end); + } + } } }