@tool extends Node class_name ControlAnimationPlayer signal animation_ended var on_animation = false @onready var target : Control = get_parent() var target_default_pos : Vector2 var target_default_modulate = Color.WHITE @export_tool_button("Test Shake", "Callable") var shake_action = shake @export_tool_button("Test Bounce", "Callable") var bounce_action = bounce @export_tool_button("Test Appear", "Callable") var appear_action = appear @export_tool_button("Test Disappear", "Callable") var disappear_action = disappear @export_tool_button("Test Slide In", "Callable") var slide_in_action = slide_in @export_tool_button("Test Slide Off", "Callable") var slide_off_action = slide_off @export_tool_button("Test Fade In", "Callable") var fade_in_action = fade_in @export_tool_button("Test Fade Out", "Callable") var fade_out_action = fade_out func _ready(): setup_default_values() get_tree().get_root().size_changed.connect(setup_default_values) func setup_default_values(): target_default_pos = target.global_position func start_anim(): on_animation = true func end_anim(): animation_ended.emit() on_animation = false func fade_in( duration : float = 0.3, transition_type: Tween.TransitionType = Tween.TransitionType.TRANS_LINEAR, ): start_anim() target.visible = true await add_tween( "modulate", target_default_modulate, duration, transition_type ).finished end_anim() func fade_out( duration : float = 0.3, transition_type: Tween.TransitionType = Tween.TransitionType.TRANS_LINEAR, ): start_anim() target.visible = true await add_tween( "modulate", Color.TRANSPARENT, duration, transition_type ).finished target.visible = false end_anim() func disappear( duration : float = 0.3, offset : int = 20, transition_type: Tween.TransitionType = Tween.TransitionType.TRANS_LINEAR, ): start_anim() add_tween( "modulate", Color.TRANSPARENT, duration, transition_type ) await add_tween( "position", target.position + Vector2.UP * offset, duration, transition_type ).finished target.position = target_default_pos end_anim() func appear( duration : float = 0.3, offset : int = 20, transition_type: Tween.TransitionType = Tween.TransitionType.TRANS_LINEAR, ): start_anim() target.modulate = Color.TRANSPARENT add_tween( "modulate", target_default_modulate, duration, transition_type ).finished target.position = target_default_pos + Vector2.UP * offset await add_tween( "position", target_default_pos, duration, transition_type ).finished target.position = target_default_pos end_anim() func slide_in( duration : float = 0.3, transition_type: Tween.TransitionType = Tween.TransitionType.TRANS_CUBIC, ): start_anim() target.position += Vector2.UP * target.size.y target.visible = true await add_tween( "position", target_default_pos, duration, transition_type ).finished end_anim() func slide_off( duration : float = 0.3, transition_type: Tween.TransitionType = Tween.TransitionType.TRANS_CUBIC, ): start_anim() await add_tween( "position", target.position - Vector2.UP * target.size.y, duration, transition_type ).finished target.visible = false target.position = target_default_pos end_anim() func bounce( duration : float = 0.4, amount : float = 10, direction : Vector2 = Vector2.UP, transition_type: Tween.TransitionType = Tween.TransitionType.TRANS_BOUNCE, ): start_anim() await add_tween( "position", target.position + direction * amount, duration/2, transition_type ).finished await add_tween( "position", target_default_pos, duration/2, transition_type ).finished end_anim() func shake( duration : float = 0.3, amount : float = 10, transition_type: Tween.TransitionType = Tween.TransitionType.TRANS_LINEAR, ): start_anim() await add_tween( "position", target.position + Vector2.RIGHT * amount/2, duration/3, transition_type ).finished await add_tween( "position", target.position + Vector2.LEFT * amount, duration/3, transition_type ).finished await add_tween( "position", target.position + Vector2.RIGHT * amount/2, duration/3, transition_type ).finished target.position = target_default_pos end_anim() func add_tween( property : String, value : Variant, seconds: float = 1., transition_type: Tween.TransitionType = Tween.TransitionType.TRANS_LINEAR ) -> Tween: var tween : Tween = get_tree().create_tween() tween.set_trans(transition_type) tween.tween_property(target, property, value, seconds) tween.set_pause_mode(Tween.TWEEN_PAUSE_PROCESS) return tween