Triple click in text editor now uses last mouse position for validity

Previously, you would be able to double click a word, followed by
single-clicking another word on the same line, which would select the
entire line. Now, it will only select the whole line if the mouse
position has remained the same after the double click. This mimicks the
behavior in most third party text editors.

Fixes #51312.

(cherry picked from commit 408401a642)
This commit is contained in:
Melissa Geels 2021-08-11 09:54:44 +02:00 committed by Rémi Verschelde
parent 8190746066
commit ac40f5bb75
No known key found for this signature in database
GPG key ID: C3336907360768E1
2 changed files with 6 additions and 1 deletions

View file

@ -2477,7 +2477,10 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
selection.selecting_column = col; selection.selecting_column = col;
} }
if (!mb->is_doubleclick() && (OS::get_singleton()->get_ticks_msec() - last_dblclk) < 600 && cursor.line == prev_line) { const int triple_click_timeout = 600;
const int triple_click_tolerance = 5;
if (!mb->is_doubleclick() && (OS::get_singleton()->get_ticks_msec() - last_dblclk) < triple_click_timeout && mb->get_position().distance_to(last_dblclk_pos) < triple_click_tolerance) {
// Triple-click select line. // Triple-click select line.
selection.selecting_mode = Selection::MODE_LINE; selection.selecting_mode = Selection::MODE_LINE;
_update_selection_mode_line(); _update_selection_mode_line();
@ -2487,6 +2490,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
selection.selecting_mode = Selection::MODE_WORD; selection.selecting_mode = Selection::MODE_WORD;
_update_selection_mode_word(); _update_selection_mode_word();
last_dblclk = OS::get_singleton()->get_ticks_msec(); last_dblclk = OS::get_singleton()->get_ticks_msec();
last_dblclk_pos = mb->get_position();
} }
update(); update();

View file

@ -403,6 +403,7 @@ private:
String highlighted_word; String highlighted_word;
uint64_t last_dblclk; uint64_t last_dblclk;
Vector2 last_dblclk_pos;
Timer *idle_detect; Timer *idle_detect;
Timer *click_select_held; Timer *click_select_held;