using CustomEvent; using Definition.Enum; using GameFramework.Event; using UnityGameFramework.Runtime; namespace UI { public class DisplayItemInfoFormController : UIFormControllerCommonBase< DisplayItemInfoFormContext, DisplayItemInfoForm> { protected override UIFormType UIFormTypeId => UIFormType.DisplayItemInfoForm; private bool _locked = false; protected override void SubscribeCustomEvents() { GameEntry.Event.Subscribe(DisplayItemInfoLockEventArgs.EventId, DisplayItemInfoLock); GameEntry.Event.Subscribe(DisplayItemInfoHideEventArgs.EventId, DisplayItemInfoHide); } protected override void UnsubscribeCustomEvents() { GameEntry.Event.Unsubscribe(DisplayItemInfoLockEventArgs.EventId, DisplayItemInfoLock); GameEntry.Event.Unsubscribe(DisplayItemInfoHideEventArgs.EventId, DisplayItemInfoHide); } protected override void RefreshUI(DisplayItemInfoForm form, DisplayItemInfoFormContext context) { form.RefreshUI(context); } protected override void CloseLoadedFormDirect(DisplayItemInfoForm form) { GameEntry.UI.CloseUIForm(form); } private static DisplayItemInfoFormContext BuildContext(DisplayItemInfoFormRawData rawData) { if (rawData == null) { return null; } return new DisplayItemInfoFormContext { Index = rawData.Index, IconAssetName = rawData.IconAssetName, Title = rawData.Title, Rarity = rawData.Rarity, TypeText = rawData.TypeText, Description = rawData.Description, Price = rawData.Price, IsWeapon = rawData.IsWeapon, TargetPos = rawData.TargetPos }; } public int? OpenUI(DisplayItemInfoFormRawData rawData) { _locked = false; DisplayItemInfoFormContext context = BuildContext(rawData); return OpenUIInternal(context); } public override int? OpenUI(object userData = null) { _locked = false; if (userData is DisplayItemInfoFormContext context) { return OpenUIInternal(context); } if (userData is DisplayItemInfoFormRawData rawData) { return OpenUI(rawData); } if (userData != null) { Log.Warning("DisplayItemInfoFormController.OpenUI() userData type is invalid."); return null; } return OpenUIInternal(Context); } public override void BindUseCase(IUIUseCase useCase) { if (!(useCase is DisplayItemInfoFormUseCase)) { Log.Error("DisplayItemInfoForm.BindUseCase() useCase is invalid."); } } #region Event Handlers private void DisplayItemInfoLock(object sender, GameEventArgs e) { if (!(e is DisplayItemInfoLockEventArgs)) return; _locked = true; } private void DisplayItemInfoHide(object sender, GameEventArgs e) { if (!(e is DisplayItemInfoHideEventArgs args)) return; if (!args.Force && _locked && sender is not DisplayItemInfoForm) return; GameEntry.UIRouter.CloseUI(UIFormType.DisplayItemInfoForm); _locked = false; } #endregion } }