LineEdit placeholder alignment, content margins, and overflow bugs

LineEdit doesn't correctly uses style margins nor use placeholders
width correctly, causing multiple rendering bugs.

(cherry picked from commit 53b51f68bf)
This commit is contained in:
robfram 2018-04-09 22:08:53 +02:00 committed by Hein-Pieter van Braam
parent 3bda257163
commit 7f64090401
2 changed files with 17 additions and 4 deletions

View file

@ -600,6 +600,7 @@ void LineEdit::_notification(int p_what) {
}
int x_ofs = 0;
int cached_text_width = text.empty() ? cached_placeholder_width : cached_width;
switch (align) {
@ -613,15 +614,15 @@ void LineEdit::_notification(int p_what) {
if (window_pos != 0)
x_ofs = style->get_offset().x;
else
x_ofs = int(size.width - (cached_width)) / 2;
x_ofs = MAX(style->get_margin(MARGIN_LEFT), int(size.width - (cached_text_width)) / 2);
} break;
case ALIGN_RIGHT: {
x_ofs = int(size.width - style->get_offset().x - (cached_width));
x_ofs = MAX(style->get_margin(MARGIN_LEFT), int(size.width - style->get_margin(MARGIN_RIGHT) - (cached_text_width)));
} break;
}
int ofs_max = width - style->get_minimum_size().width;
int ofs_max = width - style->get_margin(MARGIN_RIGHT);
int char_ofs = window_pos;
int y_area = height - style->get_minimum_size().height;
@ -879,7 +880,7 @@ void LineEdit::set_cursor_at_pixel_pos(int p_x) {
} break;
case ALIGN_RIGHT: {
pixel_ofs = int(size.width - style->get_offset().x - (cached_width));
pixel_ofs = int(size.width - style->get_margin(MARGIN_RIGHT) - (cached_width));
} break;
}
@ -1012,6 +1013,15 @@ String LineEdit::get_text() const {
void LineEdit::set_placeholder(String p_text) {
placeholder = tr(p_text);
if ((max_length <= 0) || (placeholder.length() <= max_length)) {
Ref<Font> font = get_font("font");
cached_placeholder_width = 0;
if (font != NULL) {
for (int i = 0; i < placeholder.length(); i++) {
cached_placeholder_width += font->get_char_size(placeholder[i]).width;
}
}
}
update();
}
@ -1125,6 +1135,7 @@ void LineEdit::clear_internal() {
_clear_undo_stack();
cached_width = 0;
cached_placeholder_width = 0;
cursor_pos = 0;
window_pos = 0;
undo_text = "";
@ -1466,6 +1477,7 @@ LineEdit::LineEdit() {
_create_undo_state();
align = ALIGN_LEFT;
cached_width = 0;
cached_placeholder_width = 0;
cursor_pos = 0;
window_pos = 0;
window_has_focus = true;

View file

@ -84,6 +84,7 @@ private:
int max_length; // 0 for no maximum
int cached_width;
int cached_placeholder_width;
struct Selection {