image from code wooo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class_name ShrinkingTextEdit
extends TextEdit

onready var font: DynamicFont = get_font("font")
var line_spacing
var line_height
var line_count = -1 setget set_line_count
var longest_line: String setget set_longest_line

export(int) var min_line_count := 5
onready var horizontal_min_size := rect_min_size.x - 57


func _ready():
	line_spacing = get_constant("line_spacing")
	line_height = font.get_height() + line_spacing
	connect("text_changed", self, "_on_text_changed")
	emit_signal("text_changed")
	yield(get_tree(), "idle_frame")
	update()


func set_line_count(count):
	if line_count != max(min_line_count, count):
		line_count = max(min_line_count, count)
		rect_min_size.y = (line_count * line_height) + 20
		update()


func set_longest_line(new_longest_line):
	if longest_line != new_longest_line:
		longest_line = new_longest_line
		rect_min_size.x = max(font.get_string_size(longest_line).x, horizontal_min_size) + 57
		update()


func _on_text_changed():
	self.line_count = get_line_count()
	self.longest_line = get_longest_line()


func get_longest_line():
	var longest: String
	for line in text.split("\n"):
		if len(line) > len(longest):
			longest = line
	return longest


func update():
	rect_size = rect_min_size
	.update()