using System; using UnityEditor; using UnityEditor.IMGUI.Controls; using UnityEngine; namespace XNodeEditor { /// /// Menu Popup Window /// public class MenuPopupWindow : PopupWindowContent { public Vector2 OpenBeforeMousePos; private SearchField _search; private MenuTreeView _menuTree; public Action OnCloseA; public MenuPopupWindow() { _search = new SearchField(); _menuTree = new MenuTreeView(); } private bool _isInit; /// /// Add Item /// /// Item Path /// /// Path separator /// Automatically close window after selecting an item public void AddItem(string menuPath, Action onClick, char symbol = '/',bool autoClose = true) { _menuTree.AddItem(menuPath, () => { onClick?.Invoke(); if (autoClose) { editorWindow.Close(); } },symbol); } /// /// Init or Reload Tree /// public void Init() { _menuTree.Reload(); _isInit = true; } public override void OnOpen() { _search.SetFocus(); } public override void OnClose() { OnCloseA?.Invoke(); } private string _str; public override void OnGUI(Rect rect) { if (!_isInit) { Init(); } _action(); EditorGUI.BeginChangeCheck(); { _str = _search.OnGUI(new Rect(rect.position, new Vector2(rect.width, 20)),_str); } if (EditorGUI.EndChangeCheck()) { _menuTree.searchString = _str; } _menuTree.OnGUI(new Rect(new Vector2(0,25),rect.size - new Vector2(0,20))); } private void _action() { Event e = Event.current; switch (e.type) { case EventType.KeyDown: if (e.keyCode == KeyCode.DownArrow && !_menuTree.HasFocus()) { _menuTree.SetFocusAndEnsureSelectedItem(); e.Use(); } break; } } } }