diff options
Diffstat (limited to 'scene/gui/line_edit.cpp')
| -rw-r--r-- | scene/gui/line_edit.cpp | 22 | 
1 files changed, 15 insertions, 7 deletions
diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index f1f1a66b47..0cd5219f8f 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -565,6 +565,9 @@ void LineEdit::_notification(int p_what) {  #endif  		case NOTIFICATION_RESIZED: { +			if (expand_to_text_length) { +				window_pos = 0; //force scroll back since it's expanding to text length +			}  			set_cursor_position(get_cursor_position());  		} break; @@ -610,7 +613,8 @@ void LineEdit::_notification(int p_what) {  			}  			int x_ofs = 0; -			int cached_text_width = text.empty() ? cached_placeholder_width : cached_width; +			bool using_placeholder = text.empty(); +			int cached_text_width = using_placeholder ? cached_placeholder_width : cached_width;  			switch (align) { @@ -645,9 +649,9 @@ void LineEdit::_notification(int p_what) {  			Color font_color_selected = get_color("font_color_selected");  			Color cursor_color = get_color("cursor_color"); -			const String &t = text.empty() ? placeholder : text; +			const String &t = using_placeholder ? placeholder : text;  			// draw placeholder color -			if (text.empty()) +			if (using_placeholder)  				font_color.a *= placeholder_alpha;  			font_color.a *= disabled_alpha; @@ -756,7 +760,8 @@ void LineEdit::_notification(int p_what) {  			if (has_focus()) { -				OS::get_singleton()->set_ime_position(get_global_position() + Point2(x_ofs, y_ofs + caret_height)); +				OS::get_singleton()->set_ime_active(true); +				OS::get_singleton()->set_ime_position(get_global_position() + Point2(using_placeholder ? 0 : x_ofs, y_ofs + caret_height));  				OS::get_singleton()->set_ime_intermediate_text_callback(_ime_text_callback, this);  			}  		} break; @@ -766,6 +771,7 @@ void LineEdit::_notification(int p_what) {  				draw_caret = true;  			} +			OS::get_singleton()->set_ime_active(true);  			Point2 cursor_pos = Point2(get_cursor_position(), 1) * get_minimum_size().height;  			OS::get_singleton()->set_ime_position(get_global_position() + cursor_pos);  			OS::get_singleton()->set_ime_intermediate_text_callback(_ime_text_callback, this); @@ -778,6 +784,7 @@ void LineEdit::_notification(int p_what) {  			OS::get_singleton()->set_ime_position(Point2());  			OS::get_singleton()->set_ime_intermediate_text_callback(NULL, NULL); +			OS::get_singleton()->set_ime_active(false);  			ime_text = "";  			ime_selection = Point2(); @@ -1094,11 +1101,12 @@ void LineEdit::set_cursor_position(int p_pos) {  			for (int i = cursor_pos; i >= window_pos; i--) {  				if (i >= text.length()) { -					accum_width = font->get_char_size(' ').width; //anything should do +					//do not do this, because if the cursor is at the end, its just fine that it takes no space +					//accum_width = font->get_char_size(' ').width; //anything should do  				} else {  					accum_width += font->get_char_size(text[i], i + 1 < text.length() ? text[i + 1] : 0).width; //anything should do  				} -				if (accum_width >= window_width) +				if (accum_width > window_width)  					break;  				wp = i; @@ -1165,7 +1173,7 @@ Size2 LineEdit::get_minimum_size() const {  	int mstext = get_constant("minimum_spaces") * space_size;  	if (expand_to_text_length) { -		mstext = MAX(mstext, font->get_string_size(text).x + space_size); //add a spce because some fonts are too exact +		mstext = MAX(mstext, font->get_string_size(text).x + space_size); //add a spce because some fonts are too exact, and because cursor needs a bit more when at the end  	}  	min.width += mstext;  |