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