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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
extends Control
onready var font: Font = get_font("font")
var labels: Array
var items: Array = [
"item 1",
"item 22",
"item 333",
"item 4444",
"item 55555",
"item 666666",
"item 7777777",
"item 88888888",
"item 999999999",
"This is the longest item of all, but eventually stops.",
"item 1",
"item 22",
"item 333",
"item 4444",
"item 55555",
"item 666666",
"item 7777777",
"item 88888888",
"item 999999999",
"This is the longest item of all, but eventually stops.",
"item 1",
"item 22",
"item 333",
"item 4444",
"item 55555",
"item 666666",
"item 7777777",
"item 88888888",
"item 999999999",
"This is the longest item of all, but eventually stops.",
]
var limit := 60
var labels_pool: Array
func _ready():
var num_labels := max_required_labels()
var labels_pool_size = int(ceil(num_labels * 1.10))
for idx in range(labels_pool_size):
var label := Label.new()
label.autowrap = true
label.anchor_left = 0.0
label.anchor_right = 1.0
label.valign = Label.VALIGN_CENTER
labels_pool.push_back(label)
for idx in range(min(num_labels, items.size())):
var label = labels_pool.pop_back()
label.text = items[idx]
labels.append(label)
add_child(label)
# for it in items:
# var label := Label.new()
# label.text = it
# label.autowrap = true
# label.anchor_left = 0.0
# label.anchor_right = 1.0
# label.valign = Label.VALIGN_CENTER
# labels.push_back(label)
# add_child(label)
func _process(delta):
var num_labels = max_required_labels()
var difference = num_labels - labels.size()
if difference > 0:
for idx in range(difference):
var label = labels_pool.pop_back()
labels.append(label)
add_child(label)
elif difference < 0:
for idx in range(abs(difference)):
var label = labels.pop_back()
labels_pool.append(label)
remove_child(label)
if difference != 0:
for idx in range(min(num_labels, items.size())):
labels[idx].text = items[idx]
print_debug("> %s" % labels.size())
var position := Vector2.ZERO
for it in labels:
it.rect_position = position
it.rect_size.y = 0
# var rect_size = font.get_wordwrap_string_size((it as Label).text, it.rect_size.x)
# it.rect_size.y = rect_size.y
position.y += it.rect_size.y
func max_required_labels() -> int:
var max_labels := ceil(rect_size.y / font.get_height()) + 1
return int(min(items.size(), max_labels))
#func _draw():
# var position := Vector2(0.0, font.get_height())
# for it in items:
# var p = font.get_wordwrap_string_size(it, limit)
# print_debug("> %s : %s" % [p, it])
# draw_string(font, position, it, Color.white, limit)
# font.get_string_size(it)
# position.y += p.y
|