195 lines
5.9 KiB
C#
195 lines
5.9 KiB
C#
using Cysharp.Threading.Tasks;
|
|
using SepCore.Event;
|
|
using SepCore.Definition;
|
|
using SepCore.CustomUtility;
|
|
using GameFramework.Event;
|
|
using UnityEngine;
|
|
using UnityGameFramework.Runtime;
|
|
|
|
namespace SepCore.UI
|
|
{
|
|
public class SelectRoleController : UIControllerBase<SelectRoleContext, SelectRoleForm>
|
|
{
|
|
private SelectRoleUseCase _useCase;
|
|
|
|
protected override UIFormType UIFormType => UIFormType.SelectRoleForm;
|
|
|
|
protected override void RefreshUI(SelectRoleForm form, SelectRoleContext context)
|
|
{
|
|
form.RefreshUI(context);
|
|
}
|
|
|
|
protected override void SubscribeCustomEvents()
|
|
{
|
|
GameEntry.Event.Subscribe(SelectRoleReturnEventArgs.EventId, OnSelectRoleReturn);
|
|
GameEntry.Event.Subscribe(SelectRoleHoverEventArgs.EventId, OnSelectRoleHover);
|
|
GameEntry.Event.Subscribe(SelectRoleConfirmEventArgs.EventId, OnSelectRoleConfirm);
|
|
}
|
|
|
|
protected override void UnsubscribeCustomEvents()
|
|
{
|
|
GameEntry.Event.Unsubscribe(SelectRoleReturnEventArgs.EventId, OnSelectRoleReturn);
|
|
GameEntry.Event.Unsubscribe(SelectRoleHoverEventArgs.EventId, OnSelectRoleHover);
|
|
GameEntry.Event.Unsubscribe(SelectRoleConfirmEventArgs.EventId, OnSelectRoleConfirm);
|
|
}
|
|
|
|
private static SelectRoleContext BuildContext(SelectRoleRawData rawData)
|
|
{
|
|
if (rawData == null)
|
|
{
|
|
Log.Error("SelectRoleController.BuildContext() rawData is null.");
|
|
return null;
|
|
}
|
|
|
|
int count = rawData.RoleItems?.Length ?? 0;
|
|
RoleItemContext[] roleItems = new RoleItemContext[count];
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
RoleItemRawData itemRawData = rawData.RoleItems[i];
|
|
roleItems[i] = new RoleItemContext
|
|
{
|
|
RoleId = itemRawData.RoleId,
|
|
IconName = itemRawData.IconName
|
|
};
|
|
}
|
|
|
|
RolePropertyAreaContext propertyContext = null;
|
|
if (rawData.SelectedRole != null)
|
|
{
|
|
propertyContext = new RolePropertyAreaContext
|
|
{
|
|
RoleName = rawData.SelectedRole.RoleName,
|
|
InitialPropertyText = ItemDescUtility.CreatePropDescription(rawData.SelectedRole.InitialProperties)
|
|
?? string.Empty
|
|
};
|
|
}
|
|
|
|
return new SelectRoleContext
|
|
{
|
|
RoleItemContexts = roleItems,
|
|
RolePropertyAreaContext = propertyContext,
|
|
ShowRoleProperty = propertyContext != null
|
|
};
|
|
}
|
|
|
|
public override async UniTask OpenUIAsync(object userData = null, float timeout = 30f)
|
|
{
|
|
if (userData is SelectRoleRawData rawData)
|
|
{
|
|
await OpenUIAsync(rawData, timeout);
|
|
return;
|
|
}
|
|
|
|
if (userData != null)
|
|
{
|
|
Log.Warning("SelectRoleController.OpenUIAsync() userData type is invalid.");
|
|
return;
|
|
}
|
|
|
|
if (_useCase == null)
|
|
{
|
|
Log.Error("SelectRoleController.OpenUIAsync() useCase is null.");
|
|
return;
|
|
}
|
|
|
|
SelectRoleRawData initialRawData = _useCase.CreateModel();
|
|
await OpenUIAsync(initialRawData, timeout);
|
|
}
|
|
|
|
public async UniTask OpenUIAsync(SelectRoleRawData rawData, float timeout = 30f)
|
|
{
|
|
SelectRoleContext context = BuildContext(rawData);
|
|
await OpenFormAsync(context, timeout);
|
|
}
|
|
|
|
public override void BindUseCase(IUIUseCase useCase)
|
|
{
|
|
if (useCase is not SelectRoleUseCase selectRoleUseCase)
|
|
{
|
|
Log.Error("SelectRoleController.BindUseCase() useCase is invalid.");
|
|
return;
|
|
}
|
|
|
|
_useCase = selectRoleUseCase;
|
|
}
|
|
|
|
private bool IsCurrentFormEventSender(object sender)
|
|
{
|
|
if (sender is SelectRoleForm selectRoleForm)
|
|
{
|
|
return selectRoleForm == Form;
|
|
}
|
|
|
|
if (sender is Component component && Form != null)
|
|
{
|
|
return component.transform.IsChildOf(Form.transform);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private void OnSelectRoleReturn(object sender, GameEventArgs e)
|
|
{
|
|
if (e is not SelectRoleReturnEventArgs)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!IsCurrentFormEventSender(sender))
|
|
{
|
|
return;
|
|
}
|
|
|
|
CloseUIAsync().Forget();
|
|
}
|
|
|
|
private void OnSelectRoleHover(object sender, GameEventArgs e)
|
|
{
|
|
if (e is not SelectRoleHoverEventArgs args)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!IsCurrentFormEventSender(sender))
|
|
{
|
|
return;
|
|
}
|
|
|
|
OnSelectRoleHoverAsync(args).Forget();
|
|
}
|
|
|
|
private async UniTaskVoid OnSelectRoleHoverAsync(SelectRoleHoverEventArgs args)
|
|
{
|
|
if (_useCase == null)
|
|
{
|
|
Log.Error("SelectRoleController.OnSelectRoleHoverAsync() useCase is null.");
|
|
return;
|
|
}
|
|
|
|
SelectRoleRawData rawData = _useCase.SelectRole(args.RoleId);
|
|
await OpenUIAsync(rawData);
|
|
}
|
|
|
|
private void OnSelectRoleConfirm(object sender, GameEventArgs e)
|
|
{
|
|
if (e is not SelectRoleConfirmEventArgs)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!IsCurrentFormEventSender(sender))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (_useCase == null)
|
|
{
|
|
Log.Error("SelectRoleController.OnSelectRoleConfirm() useCase is null.");
|
|
return;
|
|
}
|
|
|
|
_useCase.ConfirmSelectedRole();
|
|
}
|
|
}
|
|
}
|