#if UNITY_EDITOR using Code.Infrastructure.UI; using Unity.VisualScripting; using UnityCodeGen; using UnityEditor; namespace Code.Infrastructure.Generators { [Generator] public class UIPanelEventsGenerator : ICodeGenerator { public void Execute(GeneratorContext context) { GenerateStates(context); } private void GenerateStates(GeneratorContext context) { var states = TypeCache.GetTypesDerivedFrom(); foreach (var st in states) { var fireStatesCode = $@" public override void FireCreatedEvent() {{ _eventBus.RaiseEvent(h => h.{st.Name}Created(this)); }} public override void FireRemovedEvent() {{ _eventBus.RaiseEvent(h => h.{st.Name}Removed()); }} "; var fireStatesInterfacesCode = $@" public interface I{st.Name}CreatedHandle : IGlobalSubscriber {{ void {st.Name}Created(UIPanel panel); }} public interface I{st.Name}RemovedHandle : IGlobalSubscriber {{ void {st.Name}Removed(); }} "; if(st.HasAttribute(typeof(UIEventOpenClose))) { fireStatesCode += $@" private void FireOpenedEvent() {{ _eventBus.RaiseEvent(h => h.{st.Name}Opened(this)); }} private void FireClosedEvent() {{ _eventBus.RaiseEvent(h => h.{st.Name}Closed()); }} "; fireStatesInterfacesCode += $@" public interface I{st.Name}OpenedHandle : IGlobalSubscriber {{ void {st.Name}Opened(UIPanel panel); }} public interface I{st.Name}ClosedHandle : IGlobalSubscriber {{ void {st.Name}Closed(); }} "; } var statesCode = $@" // retard-generated using Code.Infrastructure.UI; using Code.Infrastructure.EventBus; using Code.Infrastructure.StateMachine; namespace {st.Namespace} {{ public partial class {st.Name} {{ {fireStatesCode} }} {fireStatesInterfacesCode} }} "; context.AddCode($"{st.FullName}Events.Generated.cs", statesCode); } } } } #endif