#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