|
|
|
@@ -8,7 +8,7 @@ using MuHua;
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// UI快捷菜单
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class UIShortcutMenu : ModuleUISingle<UIShortcutMenu> {
|
|
|
|
|
public class UIShortcutMenu : ModuleUIPanel, UIControl {
|
|
|
|
|
/// <summary> 菜单模板 </summary>
|
|
|
|
|
public VisualTreeAsset menuTreeAsset;
|
|
|
|
|
/// <summary> 项目模板 </summary>
|
|
|
|
@@ -19,18 +19,20 @@ public class UIShortcutMenu : ModuleUISingle<UIShortcutMenu> {
|
|
|
|
|
/// <summary> 控件列表 </summary>
|
|
|
|
|
public static List<UIControl> controls = new List<UIControl>();
|
|
|
|
|
|
|
|
|
|
public override VisualElement Element => root.Q<VisualElement>("ShortcutMenu");
|
|
|
|
|
public UIShortcutMenu(VisualElement element, VisualTreeAsset menuTreeAsset, VisualTreeAsset itemTreeAsset) : base(element) {
|
|
|
|
|
this.menuTreeAsset = menuTreeAsset;
|
|
|
|
|
this.itemTreeAsset = itemTreeAsset;
|
|
|
|
|
ModuleUI.AddControl(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void Awake() => NoReplace(false);
|
|
|
|
|
public void Update() => controls.ForEach(control => control.Update());
|
|
|
|
|
|
|
|
|
|
private void Update() => controls.ForEach(control => control.Update());
|
|
|
|
|
|
|
|
|
|
private void OnDestroy() => controls.ForEach(control => control.Dispose());
|
|
|
|
|
public void Dispose() => controls.ForEach(control => control.Dispose());
|
|
|
|
|
|
|
|
|
|
/// <summary> 打开菜单 </summary>
|
|
|
|
|
public void Open() {
|
|
|
|
|
Close();
|
|
|
|
|
Vector3 position = UITool.GetMousePosition(Element);
|
|
|
|
|
Vector3 position = UITool.GetMousePosition(element);
|
|
|
|
|
UIMenuPanel menuPanel = Create();
|
|
|
|
|
menuPanel.Settings(position, datas);
|
|
|
|
|
}
|
|
|
|
@@ -38,15 +40,15 @@ public class UIShortcutMenu : ModuleUISingle<UIShortcutMenu> {
|
|
|
|
|
public void Close() {
|
|
|
|
|
controls.ForEach(control => control.Dispose());
|
|
|
|
|
controls.Clear();
|
|
|
|
|
Element.Clear();
|
|
|
|
|
element.Clear();
|
|
|
|
|
}
|
|
|
|
|
/// <summary> 创建子菜单 </summary>
|
|
|
|
|
public UIMenuPanel Create() {
|
|
|
|
|
// 创建菜单元素
|
|
|
|
|
VisualElement element = menuTreeAsset.Instantiate();
|
|
|
|
|
element.EnableInClassList("menu", true);
|
|
|
|
|
Element.Add(element);
|
|
|
|
|
UIMenuPanel menuPanel = new UIMenuPanel(element, itemTreeAsset);
|
|
|
|
|
VisualElement menu = menuTreeAsset.Instantiate();
|
|
|
|
|
menu.EnableInClassList("menu", true);
|
|
|
|
|
element.Add(menu);
|
|
|
|
|
UIMenuPanel menuPanel = new UIMenuPanel(menu, itemTreeAsset, this);
|
|
|
|
|
controls.Add(menuPanel);
|
|
|
|
|
return menuPanel;
|
|
|
|
|
}
|
|
|
|
@@ -57,59 +59,55 @@ public class UIShortcutMenu : ModuleUISingle<UIShortcutMenu> {
|
|
|
|
|
|
|
|
|
|
List<DataMenuItem> 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);
|
|
|
|
|
}
|
|
|
|
|
DataMenuItem item = Find(names[i], datas);
|
|
|
|
|
datas = item.items;
|
|
|
|
|
if (i == names.Length - 1) { item.callback = callback; }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/// <summary> 移除菜单项 </summary>
|
|
|
|
|
public void Remove(string name) {
|
|
|
|
|
string[] names = name.Split('/');
|
|
|
|
|
List<DataMenuItem> 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;
|
|
|
|
|
DataMenuItem item = Find(names[i], datas, false);
|
|
|
|
|
// 未找到,直接返回
|
|
|
|
|
if (item == null) { return; }
|
|
|
|
|
// 找到要移除的项
|
|
|
|
|
if (i == names.Length - 1) { datas.Remove(item); }
|
|
|
|
|
datas = item.items;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/// <summary> 查询菜单项 </summary>
|
|
|
|
|
public DataMenuItem Find(string name, List<DataMenuItem> 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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// UI快捷菜单面板
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class UIMenuPanel : ModuleUIPanel, UIControl {
|
|
|
|
|
|
|
|
|
|
public readonly UIShortcutMenu parent;
|
|
|
|
|
public UIMenuPanel menuPanel;
|
|
|
|
|
public VisualElement submenu;
|
|
|
|
|
public ModuleUIItems<UIItem, DataMenuItem> items;
|
|
|
|
|
|
|
|
|
|
public VisualElement Container => Q<VisualElement>("Container");
|
|
|
|
|
|
|
|
|
|
public UIMenuPanel(VisualElement element, VisualTreeAsset templateAsset) : base(element) {
|
|
|
|
|
public UIMenuPanel(VisualElement element, VisualTreeAsset templateAsset, UIShortcutMenu parent) : base(element) {
|
|
|
|
|
this.parent = parent;
|
|
|
|
|
items = new ModuleUIItems<UIItem, DataMenuItem>(Container, templateAsset,
|
|
|
|
|
(data, element) => new UIItem(data, element, this));
|
|
|
|
|
}
|
|
|
|
|
public void Update() {
|
|
|
|
|
// throw new NotImplementedException();
|
|
|
|
|
}
|
|
|
|
|
public void Dispose() {
|
|
|
|
|
items.Release();
|
|
|
|
|
(data, element) => new UIItem(data, element, this, parent));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Update() { }
|
|
|
|
|
|
|
|
|
|
public void Dispose() => items.Release();
|
|
|
|
|
|
|
|
|
|
public void Settings(Vector3 position, List<DataMenuItem> datas) {
|
|
|
|
|
items.Create(datas);
|
|
|
|
|
element.transform.position = position;
|
|
|
|
@@ -120,7 +118,7 @@ public class UIMenuPanel : ModuleUIPanel, UIControl {
|
|
|
|
|
if (this.submenu == submenu) { return; }
|
|
|
|
|
// 更新子菜单
|
|
|
|
|
this.submenu = submenu;
|
|
|
|
|
if (menuPanel == null) { menuPanel = UIShortcutMenu.I.Create(); }
|
|
|
|
|
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);
|
|
|
|
@@ -136,12 +134,15 @@ public class UIMenuPanel : ModuleUIPanel, UIControl {
|
|
|
|
|
/// <summary> UI项目 </summary>
|
|
|
|
|
public class UIItem : ModuleUIItem<DataMenuItem> {
|
|
|
|
|
public readonly UIMenuPanel parent;
|
|
|
|
|
public readonly UIShortcutMenu shortcutMenu;
|
|
|
|
|
|
|
|
|
|
public Label Name => element.Q<Label>("Name");
|
|
|
|
|
public VisualElement Arrow => element.Q<VisualElement>("Arrow");
|
|
|
|
|
|
|
|
|
|
public UIItem(DataMenuItem value, VisualElement element, UIMenuPanel parent) : base(value, element) {
|
|
|
|
|
public UIItem(DataMenuItem value, VisualElement element, UIMenuPanel parent, UIShortcutMenu shortcutMenu) : base(value, element) {
|
|
|
|
|
this.parent = parent;
|
|
|
|
|
this.shortcutMenu = shortcutMenu;
|
|
|
|
|
|
|
|
|
|
Name.text = value.name;
|
|
|
|
|
Arrow.EnableInClassList("menu-arrow-hide", value.items == null || value.items.Count == 0);
|
|
|
|
|
element.RegisterCallback<MouseDownEvent>(MouseDownEvent);
|
|
|
|
@@ -149,7 +150,7 @@ public class UIMenuPanel : ModuleUIPanel, UIControl {
|
|
|
|
|
}
|
|
|
|
|
private void MouseDownEvent(MouseDownEvent evt) {
|
|
|
|
|
value.callback?.Invoke();
|
|
|
|
|
UIShortcutMenu.I.Close();
|
|
|
|
|
shortcutMenu.Close();
|
|
|
|
|
}
|
|
|
|
|
private void MouseMoveEvent(MouseMoveEvent evt) {
|
|
|
|
|
parent.Open(element, value.items);
|
|
|
|
|