Skip to content

Commit

Permalink
Add ISceneEntryPointLifecycleListener
Browse files Browse the repository at this point in the history
  • Loading branch information
mackysoft committed Nov 4, 2023
1 parent 3b7dcd0 commit dc740fd
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 17 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using Cysharp.Threading.Tasks;
using System;
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;

namespace MackySoft.Navigathena.SceneManagement.Tests
{
Expand All @@ -16,15 +17,15 @@ public enum SceneEntryPointCallbackFlags
OnFinalize = 1 << 3,
}

public sealed class SceneEntryPointCallbackFlagsStore
public interface ISceneEntryPointLifecycleListener
{
public SceneEntryPointCallbackFlags Value { get; set; }
void OnReceive (SceneEntryPointCallbackFlags flags);
}

public sealed class AnonymousSceneEntryPoint : SceneEntryPointBase
{

SceneEntryPointCallbackFlagsStore m_Flags = new();
readonly List<ISceneEntryPointLifecycleListener> m_Listeners = new();

Func<ISceneDataReader, IProgress<IProgressDataStore>, CancellationToken, UniTask> m_OnInitialize;
Func<ISceneDataReader, CancellationToken, UniTask> m_OnEnter;
Expand All @@ -44,33 +45,42 @@ public void SetCallbacks (
m_OnFinalize = onFinalize;
}

public void RegisterFlags (SceneEntryPointCallbackFlagsStore store)
public void Register (ISceneEntryPointLifecycleListener listener)
{
m_Flags = store;
m_Listeners.Add(listener);
}

protected override UniTask OnInitialize (ISceneDataReader reader, IProgress<IProgressDataStore> progress, CancellationToken cancellationToken)
{
m_Flags.Value |= SceneEntryPointCallbackFlags.OnInitialize;
Send(SceneEntryPointCallbackFlags.OnInitialize);
return m_OnInitialize?.Invoke(reader, progress, cancellationToken) ?? UniTask.CompletedTask;
}

protected override UniTask OnEnter (ISceneDataReader reader, CancellationToken cancellationToken)
{
m_Flags.Value |= SceneEntryPointCallbackFlags.OnEnter;
Send(SceneEntryPointCallbackFlags.OnEnter);
return m_OnEnter?.Invoke(reader, cancellationToken) ?? UniTask.CompletedTask;
}

protected override UniTask OnExit (ISceneDataWriter writer, CancellationToken cancellationToken)
{
m_Flags.Value |= SceneEntryPointCallbackFlags.OnExit;
Send(SceneEntryPointCallbackFlags.OnExit);
return m_OnExit?.Invoke(writer, cancellationToken) ?? UniTask.CompletedTask;
}

protected override UniTask OnFinalize (ISceneDataWriter writer, IProgress<IProgressDataStore> progress, CancellationToken cancellationToken)
{
m_Flags.Value |= SceneEntryPointCallbackFlags.OnFinalize;
Send(SceneEntryPointCallbackFlags.OnFinalize);
return m_OnFinalize?.Invoke(writer, progress, cancellationToken) ?? UniTask.CompletedTask;
}

void Send (SceneEntryPointCallbackFlags flags)
{
for (int i = 0; i < m_Listeners.Count; i++)
{
ISceneEntryPointLifecycleListener listener = m_Listeners[i];
listener.OnReceive(flags);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace MackySoft.Navigathena.SceneManagement.Tests
{
public sealed class SceneEntryPointCallbackFlagsStore : ISceneEntryPointLifecycleListener
{
public SceneEntryPointCallbackFlags Value { get; private set; }

void ISceneEntryPointLifecycleListener.OnReceive (SceneEntryPointCallbackFlags flags)
{
Value |= flags;
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public IEnumerator Throw_if_already_initialized () => UniTask.ToCoroutine(async
public IEnumerator Push_successfully () => UniTask.ToCoroutine(async () =>
{
SceneEntryPointCallbackFlagsStore flags = new();
var firstSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("FirstScene", x => x.RegisterFlags(flags));
var firstSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("FirstScene", x => x.Register(flags));
await m_Navigator.Initialize();

await m_Navigator.Push(firstSceneIdentifier);
Expand Down Expand Up @@ -130,7 +130,7 @@ public IEnumerator Pop_successfully () => UniTask.ToCoroutine(async () =>
{
SceneEntryPointCallbackFlagsStore flags = new();
var firstSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("FirstScene");
var secondSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("SecondScene", x => x.RegisterFlags(flags));
var secondSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("SecondScene", x => x.Register(flags));

await m_Navigator.Initialize();

Expand Down Expand Up @@ -188,8 +188,8 @@ public IEnumerator Pop_successfully_if_interrupt_pop () => UniTask.ToCoroutine(a
SceneEntryPointCallbackFlagsStore secondFlags = new();
SceneEntryPointCallbackFlagsStore thirdFlags = new();
var firstSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("FirstScene");
var secondSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("SecondScene", x => x.RegisterFlags(secondFlags));
var thirdSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("ThirdScene", x => x.RegisterFlags(thirdFlags));
var secondSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("SecondScene", x => x.Register(secondFlags));
var thirdSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("ThirdScene", x => x.Register(thirdFlags));

await m_Navigator.Initialize();

Expand Down Expand Up @@ -221,7 +221,7 @@ public IEnumerator Change_successfully () => UniTask.ToCoroutine(async () =>
{
SceneEntryPointCallbackFlagsStore flags = new();
var firstSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("FirstScene");
var secondSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("SecondScene", x => x.RegisterFlags(flags));
var secondSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("SecondScene", x => x.Register(flags));

await m_Navigator.Initialize();

Expand All @@ -239,7 +239,7 @@ public IEnumerator Change_successfully_if_interrupt_change () => UniTask.ToCorou
{
SceneEntryPointCallbackFlagsStore secondFlags = new();
var firstSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("FirstScene");
var secondSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("SecondScene", x => x.RegisterFlags(secondFlags));
var secondSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("SecondScene", x => x.Register(secondFlags));
var thirdSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("ThirdScene");

await m_Navigator.Initialize();
Expand Down

0 comments on commit dc740fd

Please sign in to comment.