Răsfoiți Sursa

LineEdit: Now double click to select a word, and triple click to select all the content using the new TextServer
TextEdit: Update the method to search words with the new TextServer

Mateo Kuruk Miccino 4 ani în urmă
părinte
comite
a3db2fd46b
3 a modificat fișierele cu 34 adăugiri și 23 ștergeri
  1. 24 5
      scene/gui/line_edit.cpp
  2. 1 0
      scene/gui/line_edit.h
  3. 9 18
      scene/gui/text_edit.cpp

+ 24 - 5
scene/gui/line_edit.cpp

@@ -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;

+ 1 - 0
scene/gui/line_edit.h

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

+ 9 - 18
scene/gui/text_edit.cpp

@@ -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.