class_name Fader extends Control
## A UI container which fades between child elements
## I don't want to write logic to check for non CanvasItems here so don't try it.

## Time in seconds for which an element will be shown before fading out.
@export var show_time := 2.0

## Time in seconds for an element to fade in or out.
@export var fade_time := 0.4

## Time in seconds for which an element will be hidden before fading in.
@export var hidden_time := 0.0

## Modulate color when fully visible
@export var visible_modulate := Color.WHITE

## Modulate color when fully hidden
@export var hidden_modulate := Color.TRANSPARENT

var _index := -1


func _ready() -> void:
	if get_child_count() == 0:
		return

	# Hide all children initially
	for child: Node in get_children():
		var canvas_item: CanvasItem = child
		canvas_item.hide()
		canvas_item.modulate = hidden_modulate

	# Start animation cycle
	_fade_next_child()


func _fade_next_child() -> void:
	_index = wrapi(_index + 1, 0, get_child_count())
	var child: CanvasItem = get_children()[_index]
	child.show()
	var tween := create_tween()
	tween.tween_property(child, "modulate", visible_modulate, fade_time)
	tween.tween_interval(show_time)
	tween.tween_property(child, "modulate", hidden_modulate, fade_time)
	tween.tween_interval(hidden_time)
	tween.tween_callback(child.hide)
	tween.tween_callback(_fade_next_child)
