#if UGX_BRIDGE || UNITY_EDITOR
using System;
using Uigenx.Protocol;
namespace Uigenx.Bridge
{
/// Reports the screen stack to the studio whenever it changes.
public sealed class UgxScreenStateHandler : IDisposable
{
readonly UgxBridgeClient _client;
UgxScreenManager _manager;
bool _disposed;
public UgxScreenStateHandler(UgxBridgeClient client)
{
_client = client ?? throw new ArgumentNullException(nameof(client));
Rebind();
}
/// Main thread. Picks up a manager created after the bridge started.
public void Tick()
{
if (_disposed || ReferenceEquals(_manager, UgxScreenManager.Instance)) return;
Rebind();
SendState();
}
public void SendState()
{
var state = new UgxScreenState();
var manager = _manager;
if (manager != null)
{
var stack = manager.Stack;
for (int i = 0; i < stack.Count; i++)
state.Stack.Add(new UgxScreenStateEntry
{
Screen = stack[i].Key,
Layer = stack[i].Layer.ToWireName(),
});
}
_client.Send(UgxMessageTypes.ScreenState, state);
}
public void Dispose()
{
if (_disposed) return;
_disposed = true;
if (_manager != null) _manager.StackChanged -= SendState;
_manager = null;
}
void Rebind()
{
if (_manager != null) _manager.StackChanged -= SendState;
_manager = UgxScreenManager.Instance;
if (_manager != null) _manager.StackChanged += SendState;
}
}
}
#endif