46 lines
1.3 KiB
GDScript
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()
|