geometry-tower-defense/Assets/GameMain/Scripts/UI/Menu/Controller/MenuFormController.cs

130 lines
4.1 KiB
C#

using GeometryTD.CustomEvent;
using GeometryTD.Definition;
using GeometryTD.Procedure;
using GameFramework.Event;
using UnityGameFramework.Runtime;
namespace GeometryTD.UI
{
public class MenuFormController : UIFormControllerCommonBase<MenuFormContext, MenuForm>
{
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
};
}
}
}