Skip to content

Commit 47eac36

Browse files
committed
Add transition async operation result.
1 parent 233d444 commit 47eac36

File tree

5 files changed

+66
-28
lines changed

5 files changed

+66
-28
lines changed

src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/External/UniTask/Enums.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#if UNITYMVVMTOOLKIT_UNITASK_SUPPORT
2+
3+
namespace UnityMvvmToolkit.UniTask.Enums
4+
{
5+
public enum TransitionResult
6+
{
7+
Succeeded,
8+
Timeout,
9+
Missed,
10+
Canceled
11+
}
12+
}
13+
14+
#endif

src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/External/UniTask/Enums/TransitionResult.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/External/UniTask/TransitionAsyncExtensions.cs

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace UnityMvvmToolkit.UniTask
55
using System;
66
using System.Linq;
77
using System.Threading;
8+
using Enums;
89
using Interfaces;
910
using TransitionPredicates;
1011
using UnityEngine.UIElements;
@@ -27,20 +28,21 @@ public static UniTask WaitForLongestTransitionEnd(this VisualElement element,
2728
: UniTask.CompletedTask;
2829
}
2930

30-
public static UniTask WaitForTransitionEnd(this VisualElement element, int transitionIndex,
31+
public static UniTask<TransitionResult> WaitForTransitionEnd(this VisualElement element, int transitionIndex,
3132
int timeoutMs = DefaultTimeoutMs, CancellationToken cancellationToken = default)
3233
{
3334
return GetTransitionDuration(element, transitionIndex, out var stylePropertyName) > float.Epsilon
3435
? WaitForTransition(element, stylePropertyName, timeoutMs, cancellationToken)
35-
: UniTask.CompletedTask;
36+
: UniTask.FromResult(TransitionResult.Missed);
3637
}
3738

38-
public static UniTask WaitForTransitionEnd(this VisualElement element, StylePropertyName stylePropertyName,
39-
int timeoutMs = DefaultTimeoutMs, CancellationToken cancellationToken = default)
39+
public static UniTask<TransitionResult> WaitForTransitionEnd(this VisualElement element,
40+
StylePropertyName stylePropertyName, int timeoutMs = DefaultTimeoutMs,
41+
CancellationToken cancellationToken = default)
4042
{
4143
return GetTransitionDuration(element, stylePropertyName) > float.Epsilon
4244
? WaitForTransition(element, stylePropertyName, timeoutMs, cancellationToken)
43-
: UniTask.CompletedTask;
45+
: UniTask.FromResult(TransitionResult.Missed);
4446
}
4547

4648
/// <summary>
@@ -51,47 +53,48 @@ public static UniTask WaitForTransitionEnd(this VisualElement element, StyleProp
5153
/// <param name="timeoutMs"></param>
5254
/// <param name="cancellationToken"></param>
5355
/// <returns></returns>
54-
public static UniTask WaitForTransitionEnd(this VisualElement element, string propertyName,
56+
public static UniTask<TransitionResult> WaitForTransitionEnd(this VisualElement element, string propertyName,
5557
int timeoutMs = DefaultTimeoutMs, CancellationToken cancellationToken = default)
5658
{
5759
var transitionData = GetTransitionData(element, propertyName);
5860

5961
return transitionData is { Duration: { value: > float.Epsilon } }
6062
? WaitForTransition(element, transitionData.Value.StylePropertyName, timeoutMs, cancellationToken)
61-
: UniTask.CompletedTask;
63+
: UniTask.FromResult(TransitionResult.Missed);
6264
}
6365

64-
public static UniTask WaitForAnyTransitionEnd(this VisualElement element, int timeoutMs = DefaultTimeoutMs,
65-
CancellationToken cancellationToken = default)
66+
public static UniTask<TransitionResult> WaitForAnyTransitionEnd(this VisualElement element,
67+
int timeoutMs = DefaultTimeoutMs, CancellationToken cancellationToken = default)
6668
{
6769
return AnyTransitionHasDuration(element)
6870
? WaitForTransitionEnd(element, new TransitionAnyPredicate(), timeoutMs, cancellationToken)
69-
: UniTask.CompletedTask;
71+
: UniTask.FromResult(TransitionResult.Missed);
7072
}
7173

72-
public static UniTask WaitForAllTransitionsEnd(this VisualElement element, int timeoutMs = DefaultTimeoutMs,
73-
CancellationToken cancellationToken = default)
74+
public static UniTask<TransitionResult> WaitForAllTransitionsEnd(this VisualElement element,
75+
int timeoutMs = DefaultTimeoutMs, CancellationToken cancellationToken = default)
7476
{
7577
var transitionsCount = GetTransitionsWithDurationCount(element);
7678

7779
return transitionsCount == 0
78-
? UniTask.CompletedTask
80+
? UniTask.FromResult(TransitionResult.Missed)
7981
: WaitForTransitionEnd(element, new TransitionCounterPredicate(transitionsCount), timeoutMs,
8082
cancellationToken);
8183
}
8284

83-
public static UniTask WaitForTransitionEnd<T>(this VisualElement element, T transitionPredicate,
84-
int timeoutMs = DefaultTimeoutMs, CancellationToken cancellationToken = default)
85+
public static UniTask<TransitionResult> WaitForTransitionEnd<T>(this VisualElement element,
86+
T transitionPredicate, int timeoutMs = DefaultTimeoutMs, CancellationToken cancellationToken = default)
8587
where T : ITransitionPredicate
8688
{
87-
return new UniTask(
89+
return new UniTask<TransitionResult>(
8890
TransitionPromise<T>.Create(element, transitionPredicate, timeoutMs, PlayerLoopTiming.Update,
8991
cancellationToken, out var token), token);
9092
}
9193

9294
[MethodImpl(MethodImplOptions.AggressiveInlining)]
93-
private static UniTask WaitForTransition(this VisualElement element, StylePropertyName stylePropertyName,
94-
int timeoutMs = DefaultTimeoutMs, CancellationToken cancellationToken = default)
95+
private static UniTask<TransitionResult> WaitForTransition(this VisualElement element,
96+
StylePropertyName stylePropertyName, int timeoutMs = DefaultTimeoutMs,
97+
CancellationToken cancellationToken = default)
9598
{
9699
return WaitForTransitionEnd(element, new TransitionNamePredicate(stylePropertyName), timeoutMs,
97100
cancellationToken);

src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/External/UniTask/TransitionPromise.cs

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,20 @@
33
namespace UnityMvvmToolkit.UniTask
44
{
55
using System;
6+
using Enums;
67
using Interfaces;
78
using System.Threading;
89
using Cysharp.Threading.Tasks;
910
using UnityEngine;
1011
using UnityEngine.UIElements;
1112

12-
internal sealed class TransitionPromise<T> : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<TransitionPromise<T>>
13-
where T : ITransitionPredicate
13+
internal sealed class TransitionPromise<T> : IUniTaskSource<TransitionResult>, IPlayerLoopItem,
14+
ITaskPoolNode<TransitionPromise<T>> where T : ITransitionPredicate
1415
{
1516
private static TaskPool<TransitionPromise<T>> _pool;
1617

1718
private TransitionPromise<T> _nextNode;
18-
private UniTaskCompletionSourceCore<AsyncUnit> _core;
19+
private UniTaskCompletionSourceCore<TransitionResult> _core;
1920

2021
private int _initFrame;
2122
private float _elapsed;
@@ -42,12 +43,12 @@ static TransitionPromise()
4243
TaskPool.RegisterSizeGetter(typeof(TransitionPromise<T>), () => _pool.Size);
4344
}
4445

45-
public static IUniTaskSource Create(VisualElement visualElement, T predicate, int timeoutMs,
46+
public static IUniTaskSource<TransitionResult> Create(VisualElement visualElement, T predicate, int timeoutMs,
4647
PlayerLoopTiming timing, CancellationToken cancellationToken, out short token)
4748
{
4849
if (cancellationToken.IsCancellationRequested)
4950
{
50-
return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);
51+
return AutoResetUniTaskCompletionSource<TransitionResult>.CreateFromCanceled(cancellationToken, out token);
5152
}
5253

5354
if (_pool.TryPop(out var transitionPromise) == false)
@@ -93,7 +94,7 @@ private void OnTransitionEnd(TransitionEndEvent e)
9394
}
9495
else if (_predicate.TransitionEnd(e))
9596
{
96-
_core.TrySetResult(AsyncUnit.Default);
97+
_core.TrySetResult(TransitionResult.Succeeded);
9798
}
9899
}
99100

@@ -108,7 +109,15 @@ private void OnTransitionCancel(TransitionCancelEvent e)
108109
}
109110

110111
_completed = true;
111-
_core.TrySetCanceled(_cancellationToken.IsCancellationRequested ? _cancellationToken : default);
112+
113+
if (_cancellationToken.IsCancellationRequested)
114+
{
115+
_core.TrySetCanceled(_cancellationToken);
116+
}
117+
else
118+
{
119+
_core.TrySetResult(TransitionResult.Canceled);
120+
}
112121
}
113122

114123
private void UnregisterCallbacks()
@@ -117,9 +126,14 @@ private void UnregisterCallbacks()
117126
_visualElement.UnregisterCallback(_endCallback);
118127
}
119128

120-
public void GetResult(short token)
129+
public TransitionResult GetResult(short token)
121130
{
122-
_core.GetResult(token);
131+
return _core.GetResult(token);
132+
}
133+
134+
void IUniTaskSource.GetResult(short token)
135+
{
136+
GetResult(token);
123137
}
124138

125139
public UniTaskStatus GetStatus(short token)
@@ -165,7 +179,8 @@ public bool MoveNext()
165179
return true;
166180
}
167181

168-
_core.TrySetResult(AsyncUnit.Default);
182+
_completed = true;
183+
_core.TrySetResult(TransitionResult.Timeout);
169184

170185
return false;
171186
}

0 commit comments

Comments
 (0)