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 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(List datas) { 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); AddControl(menuPanel); return menuPanel; } /// 添加控件 public static void AddControl(UIControl control) => controls.Add(control); /// 移除控件 public static void RemoveControl(UIControl control) => controls.Remove(control); } /// /// 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