Merge pull request #46524 from kuruk-mm/lineedit_triple_click

LineEdit: Now double click to select a word, and triple click to sele…
This commit is contained in:
Rémi Verschelde 2021-03-04 10:18:20 +01:00 committed by GitHub
commit dd1881ae19
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 23 deletions

View file

@ -255,11 +255,30 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) {
selection.creating = true;
} else {
if (b->is_doubleclick() && selecting_enabled) {
selection.enabled = true;
selection.begin = 0;
selection.end = text.length();
selection.doubleclick = true;
if (selecting_enabled) {
if (!b->is_doubleclick() && (OS::get_singleton()->get_ticks_msec() - selection.last_dblclk) < 600) {
// Triple-click select all.
selection.enabled = true;
selection.begin = 0;
selection.end = text.length();
selection.doubleclick = true;
selection.last_dblclk = 0;
cursor_pos = selection.begin;
} else if (b->is_doubleclick()) {
// Double-click select word.
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text_rid);
for (int i = 0; i < words.size(); i++) {
if (words[i].x < cursor_pos && words[i].y > cursor_pos) {
selection.enabled = true;
selection.begin = words[i].x;
selection.end = words[i].y;
selection.doubleclick = true;
selection.last_dblclk = OS::get_singleton()->get_ticks_msec();
cursor_pos = selection.end;
break;
}
}
}
}
selection.drag_attempt = false;

View file

@ -136,6 +136,7 @@ private:
bool creating = false;
bool doubleclick = false;
bool drag_attempt = false;
uint64_t last_dblclk = 0;
} selection;
struct TextOperation {

View file

@ -412,25 +412,16 @@ void TextEdit::_update_selection_mode_word() {
_get_mouse_pos(Point2i(mp.x, mp.y), row, col);
String line = text[row];
int beg = CLAMP(col, 0, line.length());
// If its the first selection and on whitespace make sure we grab the word instead.
if (!selection.active) {
while (beg > 0 && line[beg] <= 32) {
beg--;
}
}
int cursor_pos = CLAMP(col, 0, line.length());
int beg = cursor_pos;
int end = beg;
bool symbol = beg < line.length() && _is_symbol(line[beg]);
// Get the word end and begin points.
while (beg > 0 && line[beg - 1] > 32 && (symbol == _is_symbol(line[beg - 1]))) {
beg--;
}
while (end < line.length() && line[end + 1] > 32 && (symbol == _is_symbol(line[end + 1]))) {
end++;
}
if (end < line.length()) {
end += 1;
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text.get_line_data(row)->get_rid());
for (int i = 0; i < words.size(); i++) {
if (words[i].x < cursor_pos && words[i].y > cursor_pos) {
beg = words[i].x;
end = words[i].y;
break;
}
}
// Initial selection.