Browse Source

Update cached_width of the line_edit element when setting it to be secret

sumit0190 5 years ago
parent
commit
2e08578985
2 changed files with 16 additions and 18 deletions
  1. 15 18
      scene/gui/line_edit.cpp
  2. 1 0
      scene/gui/line_edit.h

+ 15 - 18
scene/gui/line_edit.cpp

@@ -240,15 +240,7 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) {
 
 						deselect();
 						text = text.substr(cursor_pos, text.length() - cursor_pos);
-
-						Ref<Font> font = get_font("font");
-
-						cached_width = 0;
-						if (font != NULL) {
-							for (int i = 0; i < text.length(); i++)
-								cached_width += font->get_char_size(text[i]).width;
-						}
-
+						update_cached_width();
 						set_cursor_position(0);
 						_text_changed();
 					}
@@ -1358,18 +1350,10 @@ void LineEdit::set_window_pos(int p_pos) {
 void LineEdit::append_at_cursor(String p_text) {
 
 	if ((max_length <= 0) || (text.length() + p_text.length() <= max_length)) {
-
-		Ref<Font> font = get_font("font");
-		if (font != NULL) {
-			for (int i = 0; i < p_text.length(); i++)
-				cached_width += font->get_char_size(p_text[i]).width;
-		} else {
-			cached_width = 0;
-		}
-
 		String pre = text.substr(0, cursor_pos);
 		String post = text.substr(cursor_pos, text.length() - cursor_pos);
 		text = pre + p_text + post;
+		update_cached_width();
 		set_cursor_position(cursor_pos + p_text.length());
 	} else {
 		emit_signal("text_change_rejected");
@@ -1499,6 +1483,7 @@ bool LineEdit::is_editable() const {
 void LineEdit::set_secret(bool p_secret) {
 
 	pass = p_secret;
+	update_cached_width();
 	update();
 }
 
@@ -1514,6 +1499,7 @@ void LineEdit::set_secret_character(const String &p_string) {
 	ERR_FAIL_COND_MSG(p_string.length() != 1, "Secret character must be exactly one character long (" + itos(p_string.length()) + " characters given).");
 
 	secret_character = p_string;
+	update_cached_width();
 	update();
 }
 
@@ -1685,6 +1671,17 @@ void LineEdit::_emit_text_change() {
 	text_changed_dirty = false;
 }
 
+void LineEdit::update_cached_width() {
+	Ref<Font> font = get_font("font");
+	cached_width = 0;
+	if (font != NULL) {
+		String text = get_text();
+		for (int i = 0; i < text.length(); i++) {
+			cached_width += font->get_char_size(pass ? secret_character[0] : text[i]).width;
+		}
+	}
+}
+
 void LineEdit::update_placeholder_width() {
 	if ((max_length <= 0) || (placeholder_translated.length() <= max_length)) {
 		Ref<Font> font = get_font("font");

+ 1 - 0
scene/gui/line_edit.h

@@ -132,6 +132,7 @@ private:
 	void _emit_text_change();
 	bool expand_to_text_length;
 
+	void update_cached_width();
 	void update_placeholder_width();
 
 	bool caret_blink_enabled;