using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UIElements; using MuHua; /// /// UI快捷菜单 /// public class UIShortcutMenu : ModuleUISingle { /// 菜单模板 public VisualTreeAsset menuTreeAsset; /// 项目模板 public VisualTreeAsset itemTreeAsset; /// 数据列表 public List datas = new List(); /// 控件列表 public static List controls = new List(); public override VisualElement Element => root.Q("ShortcutMenu"); protected override void Awake() => NoReplace(false); private void Update() => controls.ForEach(control => control.Update()); private void OnDestroy() => controls.ForEach(control => control.Dispose()); /// 打开菜单 public void Open() { Close(); Vector3 position = UITool.GetMousePosition(Element); UIMenuPanel menuPanel = Create(); menuPanel.Settings(position, datas); } /// 关闭菜单 public void Close() { controls.ForEach(control => control.Dispose()); controls.Clear(); Element.Clear(); } /// 创建子菜单 public UIMenuPanel Create() { // 创建菜单元素 VisualElement element = menuTreeAsset.Instantiate(); element.EnableInClassList("menu", true); Element.Add(element); UIMenuPanel menuPanel = new UIMenuPanel(element, itemTreeAsset); controls.Add(menuPanel); return menuPanel; } /// 添加菜单项(方法) public void Add(string name, Action callback) { string[] names = name.Split('/'); List datas = this.datas; for (int i = 0; i < names.Length; i++) { string menu = names[i]; DataMenuItem item = datas.Find(obj => obj.name == menu); if (item == null) { item = new DataMenuItem { name = menu }; if (i == names.Length - 1) { item.callback = callback; } datas.Add(item); } datas = item.items; } } /// 移除菜单项 public void Remove(string name) { string[] names = name.Split('/'); List datas = this.datas; DataMenuItem parent = null; DataMenuItem target = null; for (int i = 0; i < names.Length; i++) { string menu = names[i]; target = datas.Find(obj => obj.name == menu); if (target == null) return; // 未找到,直接返回 if (i == names.Length - 1) { // 找到要移除的项 datas.Remove(target); return; } parent = target; datas = target.items; } } } /// /// UI快捷菜单面板 /// public class UIMenuPanel : ModuleUIPanel, UIControl { public UIMenuPanel menuPanel; public VisualElement submenu; public ModuleUIItems items; public VisualElement Container => Q("Container"); public UIMenuPanel(VisualElement element, VisualTreeAsset templateAsset) : base(element) { items = new ModuleUIItems(Container, templateAsset, (data, element) => new UIItem(data, element, this)); } public void Update() { // throw new NotImplementedException(); } public void Dispose() { items.Release(); } public void Settings(Vector3 position, List datas) { items.Create(datas); element.transform.position = position; } /// 打开子菜单 public void Open(VisualElement submenu, List datas) { if (this.submenu == submenu) { return; } // 更新子菜单 this.submenu = submenu; if (menuPanel == null) { menuPanel = UIShortcutMenu.I.Create(); } float x = submenu.worldBound.position.x + submenu.resolvedStyle.width; float y = submenu.worldBound.position.y - 5; Vector3 position = new Vector3(x, y, 0); menuPanel.Settings(position, datas); bool isEnable = datas != null && datas.Count > 0; menuPanel.OpenSubmenu(isEnable); } public void OpenSubmenu(bool open) { element.EnableInClassList("menu-hide", !open); menuPanel?.OpenSubmenu(false); } /// UI项目 public class UIItem : ModuleUIItem { public readonly UIMenuPanel parent; public Label Name => element.Q