using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using MuHua;
///
/// UI快捷菜单
///
public class UIShortcutMenu : ModuleUIPanel, UIControl {
/// 菜单模板
public VisualTreeAsset menuTreeAsset;
/// 项目模板
public VisualTreeAsset itemTreeAsset;
/// 数据列表
public List datas = new List();
/// 控件列表
public static List controls = new List();
public UIShortcutMenu(VisualElement element, VisualTreeAsset menuTreeAsset, VisualTreeAsset itemTreeAsset) : base(element) {
this.menuTreeAsset = menuTreeAsset;
this.itemTreeAsset = itemTreeAsset;
ModuleUI.AddControl(this);
}
public void Update() => controls.ForEach(control => control.Update());
public void Dispose() => 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 menu = menuTreeAsset.Instantiate();
menu.EnableInClassList("menu", true);
element.Add(menu);
UIMenuPanel menuPanel = new UIMenuPanel(menu, itemTreeAsset, this);
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++) {
DataMenuItem item = Find(names[i], datas);
datas = item.items;
if (i == names.Length - 1) { item.callback = callback; }
}
}
/// 移除菜单项
public void Remove(string name) {
string[] names = name.Split('/');
List datas = this.datas;
for (int i = 0; i < names.Length; i++) {
DataMenuItem item = Find(names[i], datas, false);
// 未找到,直接返回
if (item == null) { return; }
// 找到要移除的项
if (i == names.Length - 1) { datas.Remove(item); }
datas = item.items;
}
}
/// 查询菜单项
public DataMenuItem Find(string name, List datas, bool isCreate = true) {
DataMenuItem item = datas.Find(obj => obj.name == name);
if (item != null || !isCreate) { return item; }
item = new DataMenuItem { name = name };
datas.Add(item);
return item;
}
}
///
/// UI快捷菜单面板
///
public class UIMenuPanel : ModuleUIPanel, UIControl {
public readonly UIShortcutMenu parent;
public UIMenuPanel menuPanel;
public VisualElement submenu;
public ModuleUIItems items;
public VisualElement Container => Q("Container");
public UIMenuPanel(VisualElement element, VisualTreeAsset templateAsset, UIShortcutMenu parent) : base(element) {
this.parent = parent;
items = new ModuleUIItems(Container, templateAsset,
(data, element) => new UIItem(data, element, this, parent));
}
public void Update() { }
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 = parent.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 readonly UIShortcutMenu shortcutMenu;
public Label Name => element.Q