aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordam <dam@gudinoff>2022-03-20 17:11:36 +0000
committerdam <dam@gudinoff>2022-03-20 17:11:36 +0000
commit0c705c18900f8b12fd147937584e5228776e8469 (patch)
treed2f0d71833a0238ec6de1fb600de15aea27b4075
parent2b170c12ba10103adf42404b2efc43f6da5bd2ba (diff)
downloadsurgery-log-0c705c18900f8b12fd147937584e5228776e8469.tar.zst
surgery-log-0c705c18900f8b12fd147937584e5228776e8469.zip
WIP of prototype of option set list component: vscrollbar control.
-rw-r--r--option_set/option_set_list.gd46
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
+