class_name UiMotion extends RefCounted static func apply_empty_button_style(button: Button) -> void: if button == null: return var empty := StyleBoxEmpty.new() for state in ["normal", "hover", "pressed", "disabled", "focus"]: button.add_theme_stylebox_override(state, empty) button.add_theme_color_override("font_color", Color.TRANSPARENT) button.add_theme_color_override("font_hover_color", Color.TRANSPARENT) button.add_theme_color_override("font_pressed_color", Color.TRANSPARENT) static func play_click_pulse(owner: Node, target: Control) -> void: if owner == null or target == null: return var tween := owner.create_tween() tween.tween_property(target, "scale", Vector2(0.92, 0.92), 0.05).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT) tween.tween_property(target, "scale", Vector2.ONE, 0.12).set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT) static func play_press_scale(owner: Node, target: Control) -> void: if owner == null or target == null: return var tween := owner.create_tween() tween.tween_property(target, "scale", Vector2(0.9, 0.9), 0.06).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT) static func play_release_scale(owner: Node, target: Control) -> void: if owner == null or target == null: return var tween := owner.create_tween() tween.tween_property(target, "scale", Vector2.ONE, 0.12).set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT) static func play_patrol_loop(owner: Node, target: Control, start_position: Vector2, end_position: Vector2, options := {}) -> Tween: if owner == null or target == null: return null var tween := owner.create_tween().bind_node(target).set_loops() var start_delay := float(options.get("start_delay", 0.0)) if start_delay > 0.0: tween.tween_interval(start_delay) var before_forward: Callable = options.get("before_forward", Callable()) if before_forward.is_valid(): tween.tween_callback(before_forward) tween.tween_property(target, "position", end_position, float(options.get("forward_duration", 5.0))) var before_back: Callable = options.get("before_back", Callable()) if before_back.is_valid(): tween.tween_callback(before_back) tween.tween_property(target, "position", start_position, float(options.get("back_duration", 5.0))) var before_idle_tail: Callable = options.get("before_idle_tail", Callable()) if before_idle_tail.is_valid(): tween.tween_callback(before_idle_tail) var idle_delay := float(options.get("idle_delay", 0.0)) if idle_delay > 0.0: tween.tween_interval(idle_delay) var before_idle: Callable = options.get("before_idle", Callable()) if before_idle.is_valid(): tween.tween_callback(before_idle) target.set_meta(str(options.get("meta_name", "scene_tween")), tween) return tween