vampire-like/Assets/GameMain/Scripts/UI/MenuScene/Controller/SelectRoleFormController.cs

157 lines
5.0 KiB
C#

using CustomEvent;
using Definition.Enum;
using GameFramework.Event;
using UnityGameFramework.Runtime;
namespace UI
{
public class SelectRoleFormController : UIFormControllerCommonBase<SelectRoleFormContext, SelectRoleForm>
{
private SelectRoleFormUseCase _useCase;
protected override UIFormType UIFormTypeId => UIFormType.SelectRoleForm;
protected override void RefreshUI(SelectRoleForm form, SelectRoleFormContext context)
{
form.RefreshUI(context);
}
protected override void SubscribeCustomEvents()
{
GameEntry.Event.Subscribe(MenuSelectRoleReturnEventArgs.EventId, OnMenuSelectRoleReturn);
GameEntry.Event.Subscribe(MenuSelectRoleSelectedEventArgs.EventId, OnMenuSelectRoleSelected);
GameEntry.Event.Subscribe(MenuSelectRoleConfirmEventArgs.EventId, OnMenuSelectRoleConfirm);
}
protected override void UnsubscribeCustomEvents()
{
GameEntry.Event.Unsubscribe(MenuSelectRoleReturnEventArgs.EventId, OnMenuSelectRoleReturn);
GameEntry.Event.Unsubscribe(MenuSelectRoleSelectedEventArgs.EventId, OnMenuSelectRoleSelected);
GameEntry.Event.Unsubscribe(MenuSelectRoleConfirmEventArgs.EventId, OnMenuSelectRoleConfirm);
}
private static SelectRoleFormContext BuildContext(SelectRoleFormRawData rawData)
{
if (rawData == null)
{
return null;
}
int count = rawData.RoleIds?.Length ?? 0;
RoleItemContext[] roleItems = new RoleItemContext[count];
for (int i = 0; i < count; i++)
{
string iconName = rawData.RoleIconNames != null && i < rawData.RoleIconNames.Length
? rawData.RoleIconNames[i]
: null;
roleItems[i] = new RoleItemContext
{
RoleId = rawData.RoleIds[i],
IconName = iconName
};
}
RolePropertyAreaContext propertyContext = null;
if (rawData.SelectedRoleId >= 0)
{
propertyContext = new RolePropertyAreaContext
{
RoleName = rawData.SelectedRoleName,
InitialPropertyText = rawData.SelectedRoleInitialPropertyText
};
}
return new SelectRoleFormContext
{
RoleItemContexts = roleItems,
RolePropertyAreaContext = propertyContext,
RoleIds = rawData.RoleIds
};
}
public override int? OpenUI(object userData = null)
{
if (userData is SelectRoleFormContext selectRoleFormContext)
{
return OpenUIInternal(selectRoleFormContext);
}
if (userData != null)
{
Log.Warning("SelectRoleFormController.OpenUI() userData type is invalid.");
return null;
}
if (_useCase == null)
{
Log.Error("SelectRoleFormController.OpenUI() useCase is null.");
return null;
}
SelectRoleFormRawData rawData = _useCase.CreateModel();
SelectRoleFormContext context = BuildContext(rawData);
return OpenUIInternal(context);
}
public override void BindUseCase(IUIUseCase useCase)
{
if (!(useCase is SelectRoleFormUseCase selectRoleUseCase))
{
Log.Error("SelectRoleUseCase.BindUseCase() useCase is invalid.");
return;
}
_useCase = selectRoleUseCase;
}
public void UpdateShowRole(RolePropertyAreaContext rolePropertyAreaContext)
{
if (Context != null)
{
Context.RolePropertyAreaContext = rolePropertyAreaContext;
}
Form?.UpdateShowRole(rolePropertyAreaContext);
}
private void OnMenuSelectRoleReturn(object sender, GameEventArgs e)
{
if (!(sender is SelectRoleForm) || !(e is MenuSelectRoleReturnEventArgs))
{
return;
}
CloseUI();
}
private void OnMenuSelectRoleSelected(object sender, GameEventArgs e)
{
if (!(e is MenuSelectRoleSelectedEventArgs args))
{
return;
}
SelectRoleFormRawData rawData = _useCase != null ? _useCase.SelectRole(args.RoleId) : null;
SelectRoleFormContext context = BuildContext(rawData);
if (context == null)
{
return;
}
SetContext(context);
UpdateShowRole(context.RolePropertyAreaContext);
}
private void OnMenuSelectRoleConfirm(object sender, GameEventArgs e)
{
if (!(e is MenuSelectRoleConfirmEventArgs))
{
return;
}
_useCase?.ConfirmSelectedRole();
}
}
}