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()