1
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using MuHua;
|
||||
|
||||
/// <summary>
|
||||
/// 快捷菜单
|
||||
/// </summary>
|
||||
public class ShortcutMenu : Module<ShortcutMenu> {
|
||||
/// <summary> 数据列表 </summary>
|
||||
public List<ShortcutMenuItem> menuItems = new List<ShortcutMenuItem>();
|
||||
|
||||
/// <summary> 打开菜单 </summary>
|
||||
public void Open() => UIShortcutMenu.I?.Open(UIShortcutMenu.I.MousePosition, menuItems);
|
||||
|
||||
/// <summary> 关闭菜单 </summary>
|
||||
public void Close() => UIShortcutMenu.I?.Close();
|
||||
|
||||
/// <summary> 添加菜单项(1级菜单/2级菜单/3级菜单) </summary>
|
||||
public void Add(string name, Action callback) {
|
||||
string[] names = name.Split('/');
|
||||
ShortcutMenuItem item = Find(names[0], menuItems, true);
|
||||
for (int i = 1; i < names.Length; i++) {
|
||||
item = Find(names[i], item.menuItems, true);
|
||||
}
|
||||
item.callback = callback;
|
||||
}
|
||||
/// <summary> 移除菜单项(???/???/子级菜单) </summary>
|
||||
public void Remove(string name) {
|
||||
string[] names = name.Split('/');
|
||||
List<ShortcutMenuItem> menuItems = this.menuItems;
|
||||
ShortcutMenuItem item = Find(names[0], menuItems, false);
|
||||
for (int i = 1; i < names.Length; i++) {
|
||||
if (item == null) return;
|
||||
menuItems = item.menuItems;
|
||||
item = Find(names[i], menuItems, false);
|
||||
}
|
||||
menuItems.Remove(item);
|
||||
}
|
||||
|
||||
/// <summary> 子项目查找 </summary>
|
||||
private ShortcutMenuItem Find(string menu, List<ShortcutMenuItem> menuItems, bool isCreate) {
|
||||
ShortcutMenuItem item = menuItems.Find(obj => obj.name == menu);
|
||||
if (item != null || !isCreate) { return item; }
|
||||
item = new ShortcutMenuItem { name = menu };
|
||||
menuItems.Add(item);
|
||||
return item;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 23732e20aab811a4eba63cc0f810d659
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
/// 菜单项目
|
||||
/// </summary>
|
||||
public class ShortcutMenuItem {
|
||||
/// <summary> 名称 </summary>
|
||||
public string name;
|
||||
/// <summary> 回调 </summary>
|
||||
public Action callback;
|
||||
/// <summary> 子菜单项 </summary>
|
||||
public List<ShortcutMenuItem> menuItems = new List<ShortcutMenuItem>();
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fac2916b09800194a8389027d4b54ce8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,75 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UIElements;
|
||||
using MuHua;
|
||||
|
||||
/// <summary>
|
||||
/// UI快捷菜单面板
|
||||
/// </summary>
|
||||
public class UIMenuPanel : ModuleUIPanel, UIControl {
|
||||
|
||||
public UIMenuPanel menuPanel;
|
||||
public VisualElement submenu;
|
||||
public ModuleUIItems<UIItem, ShortcutMenuItem> items;
|
||||
|
||||
public VisualElement Container => Q<VisualElement>("Container");
|
||||
|
||||
public UIMenuPanel(VisualElement element, VisualTreeAsset templateAsset) : base(element) {
|
||||
items = new ModuleUIItems<UIItem, ShortcutMenuItem>(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<ShortcutMenuItem> datas) {
|
||||
items.Create(datas);
|
||||
element.transform.position = position;
|
||||
}
|
||||
|
||||
/// <summary> 打开子菜单 </summary>
|
||||
public void Open(VisualElement submenu, List<ShortcutMenuItem> 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 - 4;
|
||||
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);
|
||||
}
|
||||
|
||||
/// <summary> UI项目 </summary>
|
||||
public class UIItem : ModuleUIItem<ShortcutMenuItem> {
|
||||
public readonly UIMenuPanel parent;
|
||||
|
||||
public Label Name => element.Q<Label>("Name");
|
||||
public VisualElement Arrow => element.Q<VisualElement>("Arrow");
|
||||
|
||||
public UIItem(ShortcutMenuItem value, VisualElement element, UIMenuPanel parent) : base(value, element) {
|
||||
this.parent = parent;
|
||||
Name.text = value.name;
|
||||
Arrow.EnableInClassList("menu-arrow-hide", value.menuItems == null || value.menuItems.Count == 0);
|
||||
element.RegisterCallback<MouseDownEvent>(MouseDownEvent);
|
||||
element.RegisterCallback<MouseMoveEvent>(MouseMoveEvent);
|
||||
}
|
||||
private void MouseDownEvent(MouseDownEvent evt) {
|
||||
value.callback?.Invoke();
|
||||
UIShortcutMenu.I.Close();
|
||||
}
|
||||
private void MouseMoveEvent(MouseMoveEvent evt) {
|
||||
parent.Open(element, value.menuItems);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cbfff4523d382a14eb835f39d022b39d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,52 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UIElements;
|
||||
using MuHua;
|
||||
|
||||
/// <summary>
|
||||
/// UI快捷菜单
|
||||
/// </summary>
|
||||
public class UIShortcutMenu : ModuleUISingle<UIShortcutMenu> {
|
||||
/// <summary> 菜单模板 </summary>
|
||||
public VisualTreeAsset MenuPanel;
|
||||
/// <summary> 项目模板 </summary>
|
||||
public VisualTreeAsset MenuTemplate;
|
||||
|
||||
/// <summary> 控件列表 </summary>
|
||||
public static List<UIControl> controls = new List<UIControl>();
|
||||
|
||||
public Vector3 MousePosition => UITool.GetMousePosition(Element);
|
||||
|
||||
public override VisualElement Element => root.Q<VisualElement>("ShortcutMenu");
|
||||
|
||||
protected override void Awake() => NoReplace(false);
|
||||
|
||||
private void Update() => controls.ForEach(control => control.Update());
|
||||
|
||||
private void OnDestroy() => controls.ForEach(control => control.Dispose());
|
||||
|
||||
/// <summary> 打开菜单 </summary>
|
||||
public void Open(Vector3 position, List<ShortcutMenuItem> datas) {
|
||||
Close();
|
||||
UIMenuPanel menuPanel = Create();
|
||||
menuPanel.Settings(position, datas);
|
||||
}
|
||||
/// <summary> 关闭菜单 </summary>
|
||||
public void Close() {
|
||||
controls.ForEach(control => control.Dispose());
|
||||
controls.Clear();
|
||||
Element.Clear();
|
||||
}
|
||||
/// <summary> 创建子菜单 </summary>
|
||||
public UIMenuPanel Create() {
|
||||
// 创建菜单元素
|
||||
VisualElement element = MenuPanel.Instantiate();
|
||||
element.EnableInClassList("menu", true);
|
||||
Element.Add(element);
|
||||
UIMenuPanel menuPanel = new UIMenuPanel(element, MenuTemplate);
|
||||
controls.Add(menuPanel);
|
||||
return menuPanel;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 422a458e7229d6b4a8fff66af1840238
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences:
|
||||
- document: {instanceID: 0}
|
||||
- MenuPanel: {fileID: 9197481963319205126, guid: 5034a86c1b336b644968fdb3be5f851a, type: 3}
|
||||
- MenuTemplate: {fileID: 9197481963319205126, guid: 1ee167986f6e9a840a45450b4b6adfc2, type: 3}
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user