online multiplayer chess game (note server currently down)
Diffstat (limited to 'ui/chat/ExpandableTextEdit.gd')
| -rw-r--r-- | ui/chat/ExpandableTextEdit.gd | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/ui/chat/ExpandableTextEdit.gd b/ui/chat/ExpandableTextEdit.gd new file mode 100644 index 0000000..2e338f5 --- /dev/null +++ b/ui/chat/ExpandableTextEdit.gd @@ -0,0 +1,76 @@ +# https://gist.github.com/MattUV/469ad2be96961c0afe8dfc1bf0932f76 +class_name ExpandableTextEdit +extends TextEdit + +export(bool) var expand := true +export(int) var max_lines := 5 + +var scroll_bar + +onready var font = get_font("font") +var line_spacing +var line_height +var line_count = -1 + + +func _ready(): + scroll_bar = _get_vscroll_bar() + line_spacing = _get_line_spacing() + line_height = font.get_height() + line_spacing + line_count = _get_real_line_count() + _update_height(line_count) + + connect("text_changed", self, "_text_changed") + + +func _get_line_spacing(): + var spacing = 4 + if get_constant("linespacing") != null: + spacing = get_constant("line_spacing") + + return spacing + + +func _get_real_line_count(): + var count = get_line_count() + var lines_to_add = 0 + var scroll_size = scroll_bar.rect_size.x if scroll_bar.visible else 0 + + # Loop over every actual line in the TextEdit + for i in count: + var line = get_line(i) # Get the string of the line + var width = font.get_string_size(line).x + if width > rect_size.x - scroll_size: + lines_to_add += int(width / (rect_size.x - scroll_size)) + + return count + lines_to_add + + +func _get_vscroll_bar(): + for c in get_children(): + if c is VScrollBar: + return c + + +func _update_height(count): + if !expand: + return + + var lines_to_show = count + if lines_to_show > max_lines: + lines_to_show = max_lines + + rect_min_size.y = lines_to_show * (line_height + line_spacing * 1.45) + rect_size.y = rect_min_size.y + update() + + +func _text_changed(): + _on_text_changed(false) + + +func _on_text_changed(force = false): + var new_line_count = _get_real_line_count() + if force or line_count != new_line_count: + line_count = new_line_count + _update_height(new_line_count) |