using System.Drawing; using System.Numerics; using System.Threading; using System.Threading.Tasks; using GTweens.Delegates; using GTweens.TweenBehaviours; using GTweens.Tweeners; using GTweens.Tweens; namespace GTweens.Extensions { public static class GTweenExtensions { public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Tweener.Getter to, float duration, ValidationDelegates.Validation validation ) { InterpolationTweenBehaviour tweenBehaviour = new InterpolationTweenBehaviour(); tweenBehaviour.Add(new IntTweener(getter, setter, to, duration, validation)); return new GTween(tweenBehaviour); } public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, int to, float duration, ValidationDelegates.Validation validation ) => Tween(getter, setter, () => to, duration, validation); public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, int to, float duration ) => Tween(getter, setter, () => to, duration, ValidationExtensions.AlwaysValid); public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Tweener.Getter to, float duration, ValidationDelegates.Validation validation ) { InterpolationTweenBehaviour tweenBehaviour = new InterpolationTweenBehaviour(); tweenBehaviour.Add(new FloatTweener(getter, setter, to, duration, validation)); return new GTween(tweenBehaviour); } public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, float to, float duration, ValidationDelegates.Validation validation ) => Tween(getter, setter, () => to, duration, validation); public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, float to, float duration ) => Tween(getter, setter, to, duration, ValidationExtensions.AlwaysValid); public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Tweener.Getter to, float duration, ValidationDelegates.Validation validation ) { InterpolationTweenBehaviour tweenBehaviour = new InterpolationTweenBehaviour(); tweenBehaviour.Add(new SystemVector2Tweener(getter, setter, to, duration, validation)); return new GTween(tweenBehaviour); } public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Vector2 to, float duration, ValidationDelegates.Validation validation ) => Tween(getter, setter, () => to, duration, validation); public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Vector2 to, float duration ) => Tween(getter, setter, to, duration, ValidationExtensions.AlwaysValid); public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Tweener.Getter to, float duration, ValidationDelegates.Validation validation ) { InterpolationTweenBehaviour tweenBehaviour = new InterpolationTweenBehaviour(); tweenBehaviour.Add(new SystemVector3Tweener(getter, setter, to, duration, validation)); return new GTween(tweenBehaviour); } public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Vector3 to, float duration, ValidationDelegates.Validation validation ) => Tween(getter, setter, () => to, duration, validation); public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Vector3 to, float duration ) => Tween(getter, setter, to, duration, ValidationExtensions.AlwaysValid); public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Tweener.Getter to, float duration, ValidationDelegates.Validation validation ) { InterpolationTweenBehaviour tweenBehaviour = new InterpolationTweenBehaviour(); tweenBehaviour.Add(new SystemVector4Tweener(getter, setter, to, duration, validation)); return new GTween(tweenBehaviour); } public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Vector4 to, float duration, ValidationDelegates.Validation validation ) => Tween(getter, setter, () => to, duration, validation); public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Vector4 to, float duration ) => Tween(getter, setter, to, duration, ValidationExtensions.AlwaysValid); public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Tweener.Getter to, float duration, ValidationDelegates.Validation validation ) { InterpolationTweenBehaviour tweenBehaviour = new InterpolationTweenBehaviour(); tweenBehaviour.Add(new SystemColorTweener(getter, setter, to, duration, validation)); return new GTween(tweenBehaviour); } public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Color to, float duration, ValidationDelegates.Validation validation ) => Tween(getter, setter, () => to, duration, validation); public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Color to, float duration ) => Tween(getter, setter, to, duration, ValidationExtensions.AlwaysValid); public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Tweener.Getter to, float duration, ValidationDelegates.Validation validation ) { InterpolationTweenBehaviour tweenBehaviour = new InterpolationTweenBehaviour(); tweenBehaviour.Add(new SystemQuaternionTweener(getter, setter, to, duration, validation)); return new GTween(tweenBehaviour); } public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Quaternion to, float duration, ValidationDelegates.Validation validation ) => Tween(getter, setter, () => to, duration, validation); public static GTween Tween( Tweener.Getter getter, Tweener.Setter setter, Quaternion to, float duration ) => Tween(getter, setter, to, duration, ValidationExtensions.AlwaysValid); public static GTween Tween( int from, int to, Tweener.Setter setter, float duration ) { return Tween( () => from, setter, to, duration, ValidationExtensions.AlwaysValid ); } public static GTween Tween( float from, float to, Tweener.Setter setter, float duration ) { return Tween( () => from, setter, to, duration, ValidationExtensions.AlwaysValid ); } public static GTween TweenTimeScale(this GTween target, float to, float duration) { return Tween( () => target.TimeScale, current => target.SetTimeScale(current), to, duration ); } public static bool IsPlayingOrCompleted(this GTween gTween) { return gTween.IsPlaying || gTween.IsCompleted; } public static bool IsPlayingOrCompletedOrNested(this GTween gTween) { return gTween.IsPlaying || gTween.IsCompleted || gTween.IsNested; } /// /// Asynchronously waits for the completion of a GTween animation or cancellation through a CancellationToken. /// /// The GTween instance to monitor for completion. /// The CancellationToken that can be used to cancel the operation. /// /// A Task that represents the asynchronous operation. The Task completes when the GTween animation is complete, /// or when the CancellationToken is signaled for cancellation. /// public static Task AwaitCompleteOrKill(this GTween gTween, CancellationToken cancellationToken) { TaskCompletionSource taskCompletionSource = new(); if (!gTween.IsPlaying) { return Task.CompletedTask; } if (cancellationToken.IsCancellationRequested) { return Task.CompletedTask; } void OnCompleteOrKill() { gTween.OnCompleteOrKillAction -= OnCompleteOrKill; taskCompletionSource.TrySetResult(); } cancellationToken.Register(OnCompleteOrKill); gTween.OnCompleteOrKill(OnCompleteOrKill); return taskCompletionSource.Task; } } }