130 lines
4.1 KiB
C#
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
|
|
};
|
|
}
|
|
}
|
|
}
|