using CustomEvent; using Definition.Enum; using GameFramework.Event; using UnityGameFramework.Runtime; namespace UI { public class SelectRoleFormController : UIFormControllerCommonBase { 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(); } } }