/// #pkgName FGUI包名
/// #panelName UIPanel名字
/// #UIName = $"{#pkgName}{#panelName}" UIKey名字
/// 该脚本由模板创建
/// created by cb 2024
using FairyGUI;
using System.Collections.Generic;
using XGame;
using XGame.Framework;
using XGame.Framework.UI;
namespace FL.FGUI
{
///
/// UI逻辑处理类
///
///
public partial class MainHomeBottomPanelCtrl : UIController
{
private UIKey _tempKey;
///
/// 已开启的Normal层UI队列
///
private List _normalUIs = new();
protected override void OnEnable(object intent)
{
AddUIListenres();
VM.BtnCtrl.onChanged.Add(OnBtnCtrlChanged);
FrameworkEvent.Instance.AddListener(XGame.Framework.EventDefine.UI_OPENED, OnUIOpened);
FrameworkEvent.Instance.AddListener(XGame.Framework.EventDefine.UI_CLOSED, OnUIClosed);
Mock();
}
protected override void OnDisable()
{
RemoveUIListenres();
VM.BtnCtrl.onChanged.Remove(OnBtnCtrlChanged);
FrameworkEvent.Instance.RemoveListener(XGame.Framework.EventDefine.UI_OPENED, OnUIOpened);
FrameworkEvent.Instance.RemoveListener(XGame.Framework.EventDefine.UI_CLOSED, OnUIClosed);
_tempKey = null;
_normalUIs.Clear();
}
#region UI事件
private void AddUIListenres()
{
VM.ClosePanelBtn.onClick.Add(OnClickClosePanelBtn);
}
private void RemoveUIListenres()
{
VM.ClosePanelBtn.onClick.Remove(OnClickClosePanelBtn);
}
private void OnClickClosePanelBtn(EventContext context)
{
if (_normalUIs.Count > 0)
{
var uikey = _normalUIs[0];
_normalUIs.RemoveAt(0);
Context.UI.Close(uikey);
return;
}
VM.BtnCtrl.selectedIndex = 0;
}
#endregion
private void Mock()
{ //TODO 临时代码
VM.SetUnlockState(4, false, "主线4\r解锁");
VM.SetUnlockState(5, false, "主线5\r解锁");
}
#region UI开启/关闭监听事件
private bool IsUnlock(int index)
{ //TODO 临时代码
return index switch
{
4 => false,
5 => false,
_ => true
};
}
private UIKey IndexToKey(int index)
{
return index switch
{
1 => UIKeys.PlayerMainPanel,
2 => UIKeys.PartnerMainPanel,
3 => UIKeys.PartnerEpiMainPanel,
6 => UIKeys.DragonEggTreasurePanel,
_ => null,
};
}
private int KeyToIndex(UIKey uiKey)
{
if (uiKey == UIKeys.PlayerMainPanel) return 1;
if (uiKey == UIKeys.PartnerMainPanel) return 2;
if (uiKey == UIKeys.PartnerEpiMainPanel) return 3;
if (uiKey == UIKeys.DragonEggTreasurePanel) return 6;
return -1;
}
private void OnBtnCtrlChanged(EventContext context)
{
Log.Debug($"OnBtnCtrlChanged. previousIndex:{VM.BtnCtrl.previousIndex} selectedIndex:{VM.BtnCtrl.selectedIndex}");
if (VM.BtnCtrl.selectedIndex == 7)
{ // 7为单独显示返回按钮
return;
}
CloseAllNormalUI();
var lastUIKey = IndexToKey(VM.BtnCtrl.previousIndex);
if (lastUIKey != null)
{
_tempKey = lastUIKey;
Context.UI.Close(lastUIKey);
}
_tempKey = null;
if (!IsUnlock(VM.BtnCtrl.selectedIndex))
{
Context.ShowTips("功能未解锁!");
VM.BtnCtrl.selectedIndex = 0;
return;
}
var nextUIKey = IndexToKey(VM.BtnCtrl.selectedIndex);
if (nextUIKey != null)
{
_tempKey = nextUIKey;
var async = Context.UI.OpenAsync(nextUIKey);
async.On(_ =>
{
_tempKey = null;
});
}
}
private void OnUIOpened(int eventId, object args)
{
var uikey = args as UIKey;
Log.Debug($"收到UI开启事件 UIKey:{uikey} selectedIndex:{VM.BtnCtrl.selectedIndex}");
if (uikey == _tempKey) return; // 避免重复监听
var index = KeyToIndex(uikey);
if (index != -1)
{ // 是控制器关联的UI
if (index != VM.BtnCtrl.selectedIndex)
{ // 控制器索引不一致
VM.BtnCtrl.selectedIndex = index;
}
return;
}
if (_normalUIs.Contains(uikey))
{
Log.Error($"重复记录UI开启事件. UIKey:{uikey}");
return;
}
var layer = UIKeys.GetLayer(uikey);
if (layer != UILayer.Normal)
return;
if (VM.BtnCtrl.selectedIndex == 0)
{// 7为单独显示返回按钮
VM.BtnCtrl.selectedIndex = 7;
}
_normalUIs.Insert(0, uikey);
}
private void OnUIClosed(int eventId, object args)
{
var uikey = args as UIKey;
Log.Debug($"收到UI关闭事件 UIKey:{uikey} selectedIndex:{VM.BtnCtrl.selectedIndex}");
if (uikey == _tempKey) return; // 避免重复监听
if (UIKeys.GetLayer(uikey) == UILayer.Normal)
{
_normalUIs.Remove(uikey);
}
var index = KeyToIndex(uikey);
if (index != -1)
{ // 是控制器关联的UI
if (index == VM.BtnCtrl.selectedIndex)
{ // 控制器索引是当前关闭的UI
VM.BtnCtrl.selectedIndex = 0;
}
}
}
///
/// 关闭所有的Normal层UI
///
private void CloseAllNormalUI()
{
if (_normalUIs.Count == 0)
return;
for(var i = _normalUIs.Count - 1; i >= 0; i--)
{
var uikey = _normalUIs[i];
_normalUIs.RemoveAt(i);
_tempKey = uikey;
Context.UI.Close(uikey);
}
_tempKey = null;
}
#endregion
}
}