using GeometryTD.CustomEvent; using GeometryTD.Definition; using GeometryTD.Procedure; using GameFramework.Event; using UnityGameFramework.Runtime; namespace GeometryTD.UI { public class MenuFormController : UIFormControllerCommonBase { private MenuFormUseCase _useCase; protected override UIFormType UIFormTypeId => UIFormType.MenuForm; protected override void RefreshUI(MenuForm form, MenuFormContext context) { form.RefreshUI(context); } protected override void SubscribeCustomEvents() { GameEntry.Event.Subscribe(MenuStartRequestedEventArgs.EventId, OnStartRequested); GameEntry.Event.Subscribe(MenuSettingsRequestedEventArgs.EventId, OnSettingsRequested); GameEntry.Event.Subscribe(MenuExitRequestedEventArgs.EventId, OnExitRequested); } protected override void UnsubscribeCustomEvents() { GameEntry.Event.Unsubscribe(MenuStartRequestedEventArgs.EventId, OnStartRequested); GameEntry.Event.Unsubscribe(MenuSettingsRequestedEventArgs.EventId, OnSettingsRequested); GameEntry.Event.Unsubscribe(MenuExitRequestedEventArgs.EventId, OnExitRequested); } public override int? OpenUI(object userData = null) { if (userData is MenuFormContext context) { return OpenUIInternal(context); } if (userData is MenuFormRawData rawDataFromUserData) { return OpenUI(rawDataFromUserData); } if (userData != null) { Log.Warning("MenuFormController.OpenUI() userData type is invalid."); return null; } if (_useCase == null) { Log.Error("MenuFormController.OpenUI() useCase is null."); return null; } return OpenUI(_useCase.CreateInitialModel()); } public int? OpenUI(MenuFormRawData rawData) { return OpenUIInternal(BuildContext(rawData)); } public override void BindUseCase(IUIUseCase useCase) { if (!(useCase is MenuFormUseCase menuFormUseCase)) { Log.Error("MenuFormController.BindUseCase() useCase is invalid."); return; } _useCase = menuFormUseCase; } private void OnStartRequested(object sender, GameEventArgs e) { if (!IsCurrentFormEvent(sender) || !(e is MenuStartRequestedEventArgs)) { return; } if (GameEntry.Procedure.CurrentProcedure is ProcedureMenu procedureMenu) { procedureMenu.GameStart = true; return; } Log.Warning("MenuFormController received start request outside ProcedureMenu."); } private void OnSettingsRequested(object sender, GameEventArgs e) { if (!IsCurrentFormEvent(sender) || !(e is MenuSettingsRequestedEventArgs)) { return; } Log.Warning("Menu settings button click is TODO."); } private void OnExitRequested(object sender, GameEventArgs e) { if (!IsCurrentFormEvent(sender) || !(e is MenuExitRequestedEventArgs)) { return; } UnityGameFramework.Runtime.GameEntry.Shutdown(ShutdownType.Quit); } private bool IsCurrentFormEvent(object sender) { return Form != null && ReferenceEquals(sender, Form); } private static MenuFormContext BuildContext(MenuFormRawData rawData) { return new MenuFormContext { TitleText = rawData?.TitleText ?? string.Empty, StartButtonText = rawData?.StartButtonText ?? string.Empty, SettingsButtonText = rawData?.SettingsButtonText ?? string.Empty, ExitButtonText = rawData?.ExitButtonText ?? string.Empty }; } } }