Files
Infratest/Assets/Code/Infrastructure/Generators/UIPanelEventsGenerator.cs
T

98 lines
2.4 KiB
C#

#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<UIPanel>();
foreach (var st in states)
{
var fireStatesCode = $@"
public override void FireCreatedEvent()
{{
_eventBus.RaiseEvent<I{st.Name}CreatedHandle>(h => h.{st.Name}Created(this));
}}
public override void FireRemovedEvent()
{{
_eventBus.RaiseEvent<I{st.Name}RemovedHandle>(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<I{st.Name}OpenedHandle>(h => h.{st.Name}Opened(this));
}}
private void FireClosedEvent()
{{
_eventBus.RaiseEvent<I{st.Name}ClosedHandle>(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