diff --git a/Assets/ModuleCore/ModuleInput/InputControl/InputMenu.cs b/Assets/ModuleCore/ModuleInput/InputControl/InputMenu.cs
index f75af3e..2f34e66 100644
--- a/Assets/ModuleCore/ModuleInput/InputControl/InputMenu.cs
+++ b/Assets/ModuleCore/ModuleInput/InputControl/InputMenu.cs
@@ -9,8 +9,6 @@ using MuHua;
///
public class InputMenu : InputControl {
- private UIMenuPanel menu;
-
protected override void ModuleInput_OnInputMode(InputMode mode) {
// throw new System.NotImplementedException();
}
@@ -19,11 +17,11 @@ public class InputMenu : InputControl {
/// 鼠标左键
public void OnMouseLeft(InputValue inputValue) {
if (inputValue.isPressed) return;
- UIPopupManager.I.shortcutMenu.Close();
+ ShortcutMenu.I.Close();
}
/// 鼠标右键
public void OnMouseRight(InputValue inputValue) {
- UIPopupManager.I.shortcutMenu.Open();
+ ShortcutMenu.I.Open();
}
#endregion
}
diff --git a/Assets/ModuleUI/ModuleUIPanel/Component.meta b/Assets/ModuleCore/ModuleUISMenu.meta
similarity index 77%
rename from Assets/ModuleUI/ModuleUIPanel/Component.meta
rename to Assets/ModuleCore/ModuleUISMenu.meta
index 98138f4..bb7e7f4 100644
--- a/Assets/ModuleUI/ModuleUIPanel/Component.meta
+++ b/Assets/ModuleCore/ModuleUISMenu.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: 06f31db1c09e8a0409a8b3b960a13216
+guid: d73f0702f68e73243ab4c6940caafa59
folderAsset: yes
DefaultImporter:
externalObjects: {}
diff --git a/Assets/ModuleUI/ModuleUIPanel/Popup.meta b/Assets/ModuleCore/ModuleUISMenu/Runtime.meta
similarity index 77%
rename from Assets/ModuleUI/ModuleUIPanel/Popup.meta
rename to Assets/ModuleCore/ModuleUISMenu/Runtime.meta
index 9f89994..ae1e763 100644
--- a/Assets/ModuleUI/ModuleUIPanel/Popup.meta
+++ b/Assets/ModuleCore/ModuleUISMenu/Runtime.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: 1a20e449063139b4ea0d19bd0677c7d1
+guid: 6477bb920cf3e3a4fbaf3e01082e3ae3
folderAsset: yes
DefaultImporter:
externalObjects: {}
diff --git a/Assets/ModuleCore/ModuleUISMenu/Runtime/ShortcutMenu.cs b/Assets/ModuleCore/ModuleUISMenu/Runtime/ShortcutMenu.cs
new file mode 100644
index 0000000..4b5f404
--- /dev/null
+++ b/Assets/ModuleCore/ModuleUISMenu/Runtime/ShortcutMenu.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using MuHua;
+
+///
+/// 快捷菜单
+///
+public class ShortcutMenu : Module {
+ /// 数据列表
+ public List menuItems = new List();
+
+ /// 打开菜单
+ public void Open() => UIShortcutMenu.I?.Open();
+
+ /// 关闭菜单
+ public void Close() => UIShortcutMenu.I?.Close();
+
+ /// 添加菜单项(1级菜单/2级菜单/3级菜单)
+ 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;
+ }
+ /// 移除菜单项(???/???/子级菜单)
+ public void Remove(string name) {
+ string[] names = name.Split('/');
+ List 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);
+ }
+
+ /// 子项目查找
+ private ShortcutMenuItem Find(string menu, List 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;
+ }
+}
diff --git a/Assets/ModuleUI/ModuleUIPanel/Component/UIVideoPlayPanel.cs.meta b/Assets/ModuleCore/ModuleUISMenu/Runtime/ShortcutMenu.cs.meta
similarity index 83%
rename from Assets/ModuleUI/ModuleUIPanel/Component/UIVideoPlayPanel.cs.meta
rename to Assets/ModuleCore/ModuleUISMenu/Runtime/ShortcutMenu.cs.meta
index 52eabd7..5da2bd6 100644
--- a/Assets/ModuleUI/ModuleUIPanel/Component/UIVideoPlayPanel.cs.meta
+++ b/Assets/ModuleCore/ModuleUISMenu/Runtime/ShortcutMenu.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: 00c04ca4ef821d0469a77408648f5ff2
+guid: 23732e20aab811a4eba63cc0f810d659
MonoImporter:
externalObjects: {}
serializedVersion: 2
diff --git a/Assets/ModuleCore/ModuleUISMenu/Runtime/ShortcutMenuItem.cs b/Assets/ModuleCore/ModuleUISMenu/Runtime/ShortcutMenuItem.cs
new file mode 100644
index 0000000..2da80cb
--- /dev/null
+++ b/Assets/ModuleCore/ModuleUISMenu/Runtime/ShortcutMenuItem.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+///
+/// 菜单项目
+///
+public class ShortcutMenuItem {
+ /// 名称
+ public string name;
+ /// 回调
+ public Action callback;
+ /// 子菜单项
+ public List menuItems = new List();
+}
diff --git a/Assets/ModuleUI/ModuleUIPanel/Component/UIVector2.cs.meta b/Assets/ModuleCore/ModuleUISMenu/Runtime/ShortcutMenuItem.cs.meta
similarity index 83%
rename from Assets/ModuleUI/ModuleUIPanel/Component/UIVector2.cs.meta
rename to Assets/ModuleCore/ModuleUISMenu/Runtime/ShortcutMenuItem.cs.meta
index a5f97ba..4884b7b 100644
--- a/Assets/ModuleUI/ModuleUIPanel/Component/UIVector2.cs.meta
+++ b/Assets/ModuleCore/ModuleUISMenu/Runtime/ShortcutMenuItem.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: c0898288ac15d9a4e9a82e0d6d36ff17
+guid: fac2916b09800194a8389027d4b54ce8
MonoImporter:
externalObjects: {}
serializedVersion: 2
diff --git a/Assets/ModuleCore/ModuleUISMenu/Runtime/UIMenuPanel.cs b/Assets/ModuleCore/ModuleUISMenu/Runtime/UIMenuPanel.cs
new file mode 100644
index 0000000..2463bec
--- /dev/null
+++ b/Assets/ModuleCore/ModuleUISMenu/Runtime/UIMenuPanel.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UIElements;
+using MuHua;
+
+///
+/// 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 - 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);
+ }
+
+ /// UI项目
+ public class UIItem : ModuleUIItem {
+ public readonly UIMenuPanel parent;
+
+ public Label Name => element.Q