Explorar el Código

LineEdit: Now double click to select a word, and triple click to select all the content

Mateo Kuruk Miccino hace 4 años
padre
commit
74b3021691
Se han modificado 2 ficheros con 29 adiciones y 6 borrados
  1. 28 6
      scene/gui/line_edit.cpp
  2. 1 0
      scene/gui/line_edit.h

+ 28 - 6
scene/gui/line_edit.cpp

@@ -88,12 +88,34 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) {
 
 			} 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;
+					} else if (b->is_doubleclick()) {
+						// Double-click select word.
+						selection.enabled = true;
+						int beg = cursor_pos;
+						int end = beg;
+						bool symbol = beg < text.length() && is_symbol(text[beg]);
+						while (beg > 0 && text[beg - 1] > 32 && (symbol == is_symbol(text[beg - 1]))) {
+							beg--;
+						}
+						while (end < text.length() && text[end + 1] > 32 && (symbol == is_symbol(text[end + 1]))) {
+							end++;
+						}
+						if (end < text.length()) {
+							end += 1;
+						}
+						selection.begin = beg;
+						selection.end = end;
+						selection.doubleclick = true;
+						selection.last_dblclk = OS::get_singleton()->get_ticks_msec();
+					}
 				}
 
 				selection.drag_attempt = false;

+ 1 - 0
scene/gui/line_edit.h

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