using System; using System.Collections.Generic; using System.Linq; using Robust.Client.Animations; using Robust.Shared.Collections; using Robust.Shared.Timing; using static Robust.Client.Animations.AnimationPlaybackShared; namespace Robust.Client.UserInterface { public partial class Control { private Dictionary? _playingAnimations; public Action? AnimationStarted; public Action? AnimationCompleted; /// /// Start playing an animation. /// /// The animation to play. /// /// The key for this animation play. This key can be used to stop playback short later. /// public void PlayAnimation(Animation animation, string key) { var playback = new AnimationPlayback(animation); _playingAnimations ??= new Dictionary(); _playingAnimations.Add(key, playback); AnimationStarted?.Invoke(key); } public bool HasRunningAnimation(string key) { return _playingAnimations?.ContainsKey(key) ?? false; } public void StopAnimation(string key) { _playingAnimations?.Remove(key); } private void ProcessAnimations(FrameEventArgs args) { if (_playingAnimations == null || _playingAnimations.Count == 0) { return; } var toRemove = new ValueList(); foreach (var (key, playback) in _playingAnimations) { var keep = UpdatePlayback(this, playback, args.DeltaSeconds); if (keep) continue; toRemove.Add(key); } foreach (var key in toRemove.Span) { _playingAnimations.Remove(key); AnimationCompleted?.Invoke(key); } } } }