using System; using System.Collections.Generic; using TyphoonGUIStyle; using UnityEditor; using UnityEngine; using Object = UnityEngine.Object; namespace TyphoonUI { public class UIObjectGUIDrawer : MonoBehaviour { public static Dictionary> OverrideDrawGUIFunc = new Dictionary>() { { "m_Script", (res) => { return true; } }, { nameof(UIObject.NameSpace), DrawProperty_NameSpace }, { nameof(UIObject.Nodes), DrawProperty_Nodes }, }; private static bool DrawProperty_Nodes(UIObject arg) { //绘制导出节点 var nodes = arg.Nodes; GUILayout.Label("导出元素:", Styles.TitleBar); foreach (var node in nodes) { EditorGUILayout.ObjectField(node, typeof(Object), true); } return true; } private static bool DrawProperty_NameSpace(UIObject arg) { GUIDrawer.DrawMessageBox("类名生成规则:\n优先采用预制物名(如果有),其次GameObject的名字", GUILayout.Height(44)); GUILayout.Label("命名空间:", Styles.BoldLabel); var txt = arg.NameSpace; if (string.IsNullOrEmpty(arg.NameSpace)) { txt = "默认"; } else { var own = !ViewNamespace.Default.Namespaces.Contains(arg.NameSpace); if (own) { txt += "(missing)"; } } GUILayout.BeginHorizontal(); var clickNameSpace = GUILayout.Button(txt, "PopUp", GUILayout.Height(22)); GUILayout.EndHorizontal(); if (clickNameSpace) { var namespaces = ViewNamespace.Default.Namespaces; var menu = new GenericMenu(); menu.AddItem(new GUIContent("添加新命名空间"), false, () => { TyphoonUIEditor.PingObject(ViewNamespace.Default); Selection.activeObject = ViewNamespace.Default; }); menu.AddItem(new GUIContent(), true, null); menu.AddItem(new GUIContent("默认"), false, () => { arg.NameSpace = string.Empty; arg.Save(); }); foreach (var element in namespaces) { if (string.IsNullOrEmpty(element)) { continue; } menu.AddItem(new GUIContent(element), false, () => { arg.NameSpace = element; arg.Save(); }); } menu.ShowAsContext(); } return true; } public static void DrawGUI(UIObject uiObject) { GUIDrawer.DrawProperty(uiObject, (property) => { if (OverrideDrawGUIFunc.TryGetValue(property, out var match)) { return match.Invoke(uiObject); } return false; }); } } }