Files
JJBB/Assets/Project/Script/GUI/Base/UISubScollMenu.cs
2024-08-23 15:49:34 +08:00

460 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using System.Collections;
using System.Collections.Generic;
using System;
public class UISubScollMenu : UIBase
{
public RectTransform MenuContainer;
public RectTransform _ContainerBG;
public GameObject Sub1BtnPrefab;
public GameObject Sub2BtnPrefab;
public bool IsReverse = true; //默认逆序
private bool autoSelect = true; // 当点开菜单时是否默认点击第一个子菜单ture点击false不点击
public bool AutoSelect
{
set { autoSelect = value; }
}
private Dictionary<UISubMenuItem, List<UISubMenuItem>> _SubBtns = new Dictionary<UISubMenuItem, List<UISubMenuItem>>();
public Dictionary<UISubMenuItem, List<UISubMenuItem>> SubBtns
{
get
{
return _SubBtns;
}
}
private UISubMenuItem _SelectedSub1;
public object SelectedSub1
{
get
{
if (_SelectedSub1 == null)
return null;
return _SelectedSub1.MenuObj;
}
}
private UISubMenuItem _SelectedSub2;
public object SelectedSub2
{
get
{
if (_SelectedSub2 == null)
return null;
return _SelectedSub2.MenuObj;
}
}
private Queue<UISubMenuItem> _Prefabs1 = new Queue<UISubMenuItem>();
private Queue<UISubMenuItem> _Prefabs2 = new Queue<UISubMenuItem>();
private int subIndex = 0;
[Serializable]
public class MenuClickEvent : UnityEvent<object>
{
public MenuClickEvent()
{
}
}
[SerializeField]
private MenuClickEvent _MenuClick;
void Update()
{
SetBGRect();
}
public void Clear()
{
subIndex = 0;
foreach (var keyValue in _SubBtns)
{
_Prefabs1.Enqueue(keyValue.Key);
keyValue.Key.gameObject.SetActive(false);
foreach (var item in keyValue.Value)
{
_Prefabs2.Enqueue(item);
item.gameObject.SetActive(false);
}
}
MenuContainer.sizeDelta = Vector2.zero;
_IsInitBG = false;
_SubBtns.Clear();
_SelectedSub1 = null;
_SelectedSub2 = null;
}
public void PushMenu(object sub1Tx)
{
PushMenu(sub1Tx, new object[] { });
}
public void PushMenu(object sub1Tx, int[] sub2Txs)
{
var sub1 = CreateNewMenu(sub1Tx, 1);
sub1.gameObject.SetActive(true);
sub1.SubLevel = 1;
sub1.UnSelected();
sub1.CloseSubGO();
List<UISubMenuItem> sub2 = new List<UISubMenuItem>();
foreach (var sub2Tx in sub2Txs)
{
var sub2Item = CreateNewMenu(sub2Tx, 2);
sub2Item.SubLevel = 2;
sub2Item.gameObject.SetActive(false);
sub2Item.UnSelected();
sub2Item.CloseSubGO();
sub2.Add(sub2Item);
}
_SubBtns.Add(sub1, sub2);
}
public void PushMenu(object sub1Tx, object[] sub2Txs)
{
var sub1 = CreateNewMenu(sub1Tx, 1);
sub1.gameObject.SetActive(true);
sub1.SubLevel = 1;
sub1.UnSelected();
sub1.CloseSubGO();
// 部分菜单按钮是什么?
List<UISubMenuItem> sub2 = new List<UISubMenuItem>();
foreach (var sub2Tx in sub2Txs)
{
var sub2Item = CreateNewMenu(sub2Tx, 2);
sub2Item.SubLevel = 2;
sub2Item.gameObject.SetActive(false);
sub2Item.UnSelected();
sub2Item.CloseSubGO();
sub2.Add(sub2Item);
}
sub2.Reverse();
_SubBtns.Add(sub1, sub2);
}
public void ShowDefaultFirst()
{
//_SelectedSub1 = null;
//_SelectedSub2 = null;
if (_SubBtns.Count > 0)
{
foreach (var keyValue in _SubBtns)
{
if (!keyValue.Key.isActiveAndEnabled)
continue;
MenuClick(keyValue.Key);
//if (keyValue.Value != null && keyValue.Value.Count > 0)
//{
// for(int i = 0; i< keyValue.Value.Count; ++i)
// {
// if (!keyValue.Value[i].ShowMenu())
// continue;
// MenuClick(keyValue.Value[i]);
// break;
// }
//}
break;
}
}
else
{
MenuClick(null);
}
}
public void CloseAllSub()
{
}
public void HightLightMenu(object showObj)
{
if (_SubBtns.Count > 0)
{
foreach (var keyValue in _SubBtns)
{
if (showObj == keyValue.Key.MenuObj)
{
keyValue.Key.Selected();
}
else
{
keyValue.Key.UnSelected();
}
}
}
}
public void ShowMenu(object showObj, object showsubObj = null)
{
if (showObj == null)
return;
//Debug.LogError("ShowObj : " + showObj);
if (_SubBtns.Count > 0)
{
foreach (var keyValue in _SubBtns)
{
// Debug.LogError("keyValue.Key.MenuObj : " + keyValue.Key.MenuObj);
if (showObj.Equals(keyValue.Key.MenuObj))
{
//Debug.LogError("MenuClick : " + showObj);
//MenuClick(keyValue.Key);
UISubMenuItem selectedSubMenu = null;
if (keyValue.Value.Count > 0)
{
foreach (var subMenu in keyValue.Value)
{
if (showsubObj.Equals(subMenu.MenuObj))
{
selectedSubMenu = subMenu;
//MenuClick(subMenu);
break;
}
}
}
if (showsubObj != null && selectedSubMenu != null)
{
MenuClick(keyValue.Key);
MenuClick(selectedSubMenu);
break;
}
else if (showsubObj == null)
{
MenuClick(keyValue.Key);
break;
}
}
}
}
else
{
MenuClick(null);
}
}
public void ShowMenu(object showObj, bool isSpecial)
{
if (_SubBtns.Count > 0)
{
foreach (var keyValue in _SubBtns)
{
if (keyValue.Value.Count > 0)
{
foreach (var subMenu in keyValue.Value)
{
if (showObj == subMenu.MenuObj)
{
MenuClick(keyValue.Key);
MenuClick(subMenu);
break;
}
}
}
else
{
if (showObj == keyValue.Key.MenuObj)
{
MenuClick(keyValue.Key);
break;
}
}
}
}
else
{
MenuClick(null);
}
}
public void Refresh()
{
foreach (var menuBtn in _SubBtns)
{
menuBtn.Key.Refresh();
foreach (var subMenu in menuBtn.Value)
{
subMenu.Refresh();
}
}
}
private UISubMenuItem CreateNewMenu(object tx, int level)
{
GameObject go;
UISubMenuItem menuScript;
if (level == 1)
{
if (_Prefabs1.Count > 0)
{
menuScript = _Prefabs1.Dequeue();
go = menuScript.gameObject;
}
else
{
go = GameObject.Instantiate<GameObject>(Sub1BtnPrefab.gameObject);
menuScript = go.GetComponent<UISubMenuItem>();
}
}
else
{
if (_Prefabs2.Count > 0)
{
menuScript = _Prefabs2.Dequeue();
go = menuScript.gameObject;
}
else
{
go = GameObject.Instantiate<GameObject>(Sub2BtnPrefab.gameObject);
menuScript = go.GetComponent<UISubMenuItem>();
}
}
menuScript.InitMenu(tx);
go.transform.SetParent(MenuContainer.transform);
go.transform.SetSiblingIndex(subIndex);
++subIndex;
go.transform.localScale = Vector3.one;
menuScript._PanelClickEvent = MenuClick;
return menuScript;
}
public void MenuClick(UIItemBase itemBase)
{
UISubMenuItem menuItem = itemBase as UISubMenuItem;
if (menuItem == null)
return;
if (menuItem.SubLevel == 1)
{
if (menuItem != _SelectedSub1)
{
ClearSelect(1);
ClearSelect(2);
_SelectedSub1 = menuItem;
_SelectedSub1.Selected();
if (_SubBtns[_SelectedSub1].Count > 0)
{
_SelectedSub1.OpenSubGO();
//foreach (var sub2 in _SubBtns[_SelectedSub1])
//{
// sub2.ShowMenu();
//}
for (int i = 0; i < _SubBtns[_SelectedSub1].Count; ++i)
{
if (!_SubBtns[_SelectedSub1][i].ShowMenu())
continue;
if(!IsReverse)
{//正序第一个
if(_SelectedSub2 == null)
_SelectedSub2 = _SubBtns[_SelectedSub1][i];
}
else
{
//逆序 倒数第一个
//if(_SelectedSub2 == null)
_SelectedSub2 = _SubBtns[_SelectedSub1][i];
}
}
if (_SelectedSub2 != null && autoSelect == true)
{
MenuClick(_SelectedSub2);
_SelectedSub2.Selected();
_MenuClick.Invoke(_SelectedSub2.MenuObj);
return;
}
}
}
else if(_SubBtns[_SelectedSub1].Count > 0)
{
ClearSelect(1);
}
}
else
{
if (menuItem != _SelectedSub2)
{
ClearSelect(2);
_SelectedSub2 = menuItem;
_SelectedSub2.Selected();
}
}
_MenuClick.Invoke(menuItem.MenuObj);
}
public void ShowSubFirstItem()
{
if (_SubBtns[_SelectedSub1].Count > 0)
{
_SelectedSub2 = _SubBtns[_SelectedSub1][0];
MenuClick(_SelectedSub2);
_SelectedSub2.Selected();
_MenuClick.Invoke(_SelectedSub2.MenuObj);
}
}
public void ClearSelect(int layer)
{
if (layer == 2 && _SelectedSub2 != null)
{
_SelectedSub2.CloseSubGO();
_SelectedSub2.UnSelected();
_SelectedSub2 = null;
}
if (layer == 1 && _SelectedSub1 != null)
{
_SelectedSub1.CloseSubGO();
_SelectedSub1.UnSelected();
foreach (var sub2 in _SubBtns[_SelectedSub1])
{
sub2.gameObject.SetActive(false);
}
_SelectedSub1 = null;
}
}
#region bg
private bool _IsInitBG = false;
public void SetBGRect()
{
if (_ContainerBG == null)
return;
if (_IsInitBG)
return;
if (MenuContainer.sizeDelta.y > 1)
{
_IsInitBG = true;
_ContainerBG.sizeDelta = new Vector2(_ContainerBG.sizeDelta.x, MenuContainer.sizeDelta.y + 10);
}
}
#endregion
}