48 lines
1.3 KiB
GDScript

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)