diff options
| author | dam <dam@gudinoff> | 2022-03-20 17:11:36 +0000 |
|---|---|---|
| committer | dam <dam@gudinoff> | 2022-03-20 17:11:36 +0000 |
| commit | 0c705c18900f8b12fd147937584e5228776e8469 (patch) | |
| tree | d2f0d71833a0238ec6de1fb600de15aea27b4075 /option_set | |
| parent | 2b170c12ba10103adf42404b2efc43f6da5bd2ba (diff) | |
| download | surgery-log-0c705c18900f8b12fd147937584e5228776e8469.tar.zst surgery-log-0c705c18900f8b12fd147937584e5228776e8469.zip | |
WIP of prototype of option set list component: vscrollbar control.
Diffstat (limited to 'option_set')
| -rw-r--r-- | option_set/option_set_list.gd | 46 |
1 files changed, 40 insertions, 6 deletions
diff --git a/option_set/option_set_list.gd b/option_set/option_set_list.gd index dc6b29a..4114ae1 100644 --- a/option_set/option_set_list.gd +++ b/option_set/option_set_list.gd @@ -1,6 +1,6 @@ extends Control -onready var font: Font = get_font("font") +var vscrollbar: VScrollBar var labels: Array var items: Array = [ "item 1", @@ -38,6 +38,17 @@ var items: Array = [ var limit := 60 var labels_pool: Array +onready var font: Font = get_font("font") + +func _init(): + vscrollbar = VScrollBar.new() + vscrollbar.anchor_left = 1.0 + vscrollbar.anchor_bottom = 1.0 + vscrollbar.grow_horizontal = Control.GROW_DIRECTION_BEGIN + vscrollbar.name = "vscrollbar" + add_child(vscrollbar) + + func _ready(): var num_labels := max_required_labels() var labels_pool_size = int(ceil(num_labels * 1.10)) @@ -82,19 +93,41 @@ func _process(delta): labels_pool.append(label) remove_child(label) - if difference != 0: - for idx in range(min(num_labels, items.size())): - labels[idx].text = items[idx] + WIP + # @DAM Since the items may have different heights, we must look at the edge items + # in order to update the offsets. + vscrollbar.min_value = 0 + var offset := vscrollbar.value + var offset_idx := int(floor(offset * items.size() / vscrollbar.max_value)) + +# offset_idx = 0 + for idx in range(min(num_labels, items.size())): + labels[idx].text = items[idx + offset_idx] - print_debug("> %s" % labels.size()) +# if difference != 0: +# for idx in range(min(num_labels, items.size())): +# labels[idx].text = items[idx] - var position := Vector2.ZERO + if Engine.get_idle_frames() % 30 == 1: + print_debug("> %s | %5.3f | %d " % [labels.size(), offset, offset_idx]) + + var position := Vector2(0.0, -offset) 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 + + # Adapt scrollbar according to options and drawable size. + # @DAM This does not take into consideration the items that are wrapped. + var ratio := rect_size.y / (items.size() * font.get_height()) + vscrollbar.visible = ratio < 1.0 + vscrollbar.page = ratio * (vscrollbar.max_value - vscrollbar.min_value) + + vscrollbar.max_value = rect_size.y + + func max_required_labels() -> int: var max_labels := ceil(rect_size.y / font.get_height()) + 1 @@ -109,3 +142,4 @@ func max_required_labels() -> int: # font.get_string_size(it) # position.y += p.y + |
