signalis-eb/godot/src/h_item_list.gd
2025-06-10 22:41:26 -04:00

46 lines
1.3 KiB
GDScript

class_name HItemList extends HBoxContainer
@export var item_scene: PackedScene
@export var max_items: int = 4
@export var buffered_items: int = 2
@onready var buffer_size = max_items + (buffered_items * 2)
var items: Array = []
var create_item: Callable = _create_item
var bind_item: Callable = _bind_item
var ring_buffer: RingBuffer
func _ready() -> void:
ring_buffer = RingBuffer.new(items.size(), buffer_size)
ring_buffer.updated.connect(_on_updated)
for _i in range(buffer_size):
add_child(create_item.call())
func _create_item() -> Node:
return item_scene.instantiate()
func _bind_item(node: Node, item: Item):
if node.has_method('bind'):
node.call('bind', item)
func _on_updated(_current_range: IntRange, _previous_range: IntRange):
_update_display()
func _update_display():
var indices: Array = ring_buffer.range().collect()
for i in range(min(indices.size(), max_items)):
var node = get_child(i + 1)
var item = items[indices[i]]
bind_item.call(node, item)
func add_item(item: Variant):
items.append(item)
ring_buffer.source_size = items.size()
_update_display()
func add_items(new_items: Array):
items.append_array(new_items)
ring_buffer.source_size = items.size()
_update_display()