192 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C#
		
	
	
		
		
			
		
	
	
			192 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C#
		
	
	
|  | using System; | ||
|  | using System.Collections.Generic; | ||
|  | using System.Linq; | ||
|  | using UnityEditor; | ||
|  | using UnityEngine; | ||
|  | 
 | ||
|  | namespace Guru | ||
|  | { | ||
|  |     public static class EasyGUILayout | ||
|  |     { | ||
|  |         private const string K_BOX_STYPE = "Box"; | ||
|  |         public static GUIStyle BoxStyle => new GUIStyle(K_BOX_STYPE); | ||
|  | 
 | ||
|  |         private static ulong _genId = ulong.MinValue; | ||
|  |         private static ulong GenId | ||
|  |         { | ||
|  |             get | ||
|  |             { | ||
|  |                 if (_genId == ulong.MaxValue) _genId = ulong.MinValue; | ||
|  |                 _genId++; | ||
|  |                 return _genId; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public static void Label(string value, float width = 0, int fontSize = 0, FontStyle fontStyle = FontStyle.Normal,  TextAnchor anchor = TextAnchor.MiddleLeft, params GUILayoutOption[] options) | ||
|  |         { | ||
|  |             GUILayoutOption w = null; | ||
|  |             if (width > 0) | ||
|  |             { | ||
|  |                 w = GUILayout.Width(width); | ||
|  |             } | ||
|  |              | ||
|  |             GUIStyle s = null; | ||
|  |             if (fontSize > 0) | ||
|  |             { | ||
|  |                 s = new GUIStyle("Label"); | ||
|  |                 s.fontSize = fontSize; | ||
|  |                 s.alignment = anchor; | ||
|  |                 s.fontStyle = fontStyle; | ||
|  |             } | ||
|  | 
 | ||
|  |             List<GUILayoutOption> opts = new List<GUILayoutOption>(); | ||
|  |             if (w != null) opts.Add(w); | ||
|  |             if (options != null && options.Length > 0) opts.AddRange(options); | ||
|  |              | ||
|  |             if (s == null) | ||
|  |             { | ||
|  |                 GUILayout.Label(value, opts.ToArray()); | ||
|  |                 return; | ||
|  |             } | ||
|  | 
 | ||
|  |             GUILayout.Label(value, s, opts.ToArray()); | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// 水平Box布局 | ||
|  |         /// </summary> | ||
|  |         /// <param name="content"></param> | ||
|  |         public static void HBox(Action content) | ||
|  |         { | ||
|  |             GUILayout.BeginHorizontal(BoxStyle); | ||
|  |             content?.Invoke(); | ||
|  |             GUILayout.EndHorizontal();  | ||
|  |         } | ||
|  |          | ||
|  |         /// <summary> | ||
|  |         /// 水平Box布局 | ||
|  |         /// </summary> | ||
|  |         /// <param name="content"></param> | ||
|  |         public static void VBox(Action content) | ||
|  |         { | ||
|  |             GUILayout.BeginVertical(BoxStyle); | ||
|  |             content?.Invoke(); | ||
|  |             GUILayout.EndVertical();  | ||
|  |         } | ||
|  | 
 | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// BoxLineItem 风格图框 | ||
|  |         /// </summary> | ||
|  |         /// <param name="label"></param> | ||
|  |         /// <param name="contents"></param> | ||
|  |         /// <param name="width"></param> | ||
|  |         /// <param name="fontSize"></param> | ||
|  |         public static void BoxLineItem(string label, float width = 60, int fontSize = 0, params Action[] contents) | ||
|  |         { | ||
|  |             HBox( | ||
|  |                 () => | ||
|  |                 { | ||
|  |                     Label(label, width, fontSize); | ||
|  |                     if (contents != null && contents.Length > 0) | ||
|  |                     { | ||
|  |                         for (int i = 0; i < contents.Length; i++) | ||
|  |                         { | ||
|  |                             contents[i]?.Invoke(); | ||
|  |                         } | ||
|  |                     } | ||
|  |                 } | ||
|  |             ); | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Text 文本框 | ||
|  |         /// </summary> | ||
|  |         /// <param name="value"></param> | ||
|  |         /// <param name="onValueChanged"></param> | ||
|  |         public static string Text(string value, Action<string> onValueChanged = null, params GUILayoutOption[] options) | ||
|  |         { | ||
|  |             return Text(value, "", null, onValueChanged, options);; | ||
|  |         } | ||
|  |          | ||
|  |         /// <summary> | ||
|  |         /// Text 文本框 | ||
|  |         /// </summary> | ||
|  |         /// <param name="value"></param> | ||
|  |         /// <param name="onValueChanged"></param> | ||
|  |         public static string Text(string value, string label, Action<string> onValueChanged = null, params GUILayoutOption[] options) | ||
|  |         { | ||
|  |             return Text(value, label, null, onValueChanged, options); | ||
|  |         } | ||
|  |          | ||
|  |         /// <summary> | ||
|  |         /// Text 文本框 | ||
|  |         /// </summary> | ||
|  |         /// <param name="value"></param> | ||
|  |         /// <param name="onValueChanged"></param> | ||
|  |         public static string Text(string value, GUIStyle style, Action<string> onValueChanged = null, params GUILayoutOption[] options) | ||
|  |         { | ||
|  |             return Text(value, "", style, onValueChanged, options); | ||
|  |         } | ||
|  |          | ||
|  |          | ||
|  |         /// <summary> | ||
|  |         /// Text 文本框 | ||
|  |         /// </summary> | ||
|  |         /// <param name="value"></param> | ||
|  |         /// <param name="onValueChanged"></param> | ||
|  |         public static string Text(string text , string label, GUIStyle style, Action<string> onValueChanged = null, params GUILayoutOption[] options) | ||
|  |         { | ||
|  |             string _cname = label; | ||
|  |             if (string.IsNullOrEmpty(_cname)) _cname = $"lab_{GenId}"; | ||
|  |             GUI.SetNextControlName(_cname); | ||
|  | 
 | ||
|  |             string newValue = ""; | ||
|  |             if (string.IsNullOrEmpty(label) && style == null) | ||
|  |             { | ||
|  |                 newValue = EditorGUILayout.TextField(text, options); | ||
|  |             } | ||
|  |             else if (string.IsNullOrEmpty(label)) | ||
|  |             { | ||
|  |                 newValue = EditorGUILayout.TextField(text, style, options); | ||
|  |             } | ||
|  |             else if (style == null) | ||
|  |             { | ||
|  |                 newValue = EditorGUILayout.TextField(label, text, options); | ||
|  |             } | ||
|  |             else | ||
|  |             { | ||
|  |                 newValue = EditorGUILayout.TextField(label, text, style, options); | ||
|  |             } | ||
|  |              | ||
|  |             if ( newValue != text ) | ||
|  |                 // && GUI.GetNameOfFocusedControl() != _cname) | ||
|  |             { | ||
|  |                 if (null != onValueChanged) | ||
|  |                 { | ||
|  |                     onValueChanged?.Invoke(newValue); | ||
|  |                 } | ||
|  |             } | ||
|  |             return newValue; | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Text 文本框 | ||
|  |         /// </summary> | ||
|  |         /// <param name="value"></param> | ||
|  |         /// <param name="onValueChanged"></param> | ||
|  |         public static bool Toggle(bool value, Action<bool> onValueChanged = null) | ||
|  |         { | ||
|  |             bool newValue = GUILayout.Toggle(value, ""); | ||
|  |             if (newValue != value) | ||
|  |             { | ||
|  |                 if (null != onValueChanged) | ||
|  |                 { | ||
|  |                     onValueChanged?.Invoke(newValue); | ||
|  |                 } | ||
|  |             } | ||
|  |             return newValue; | ||
|  |         } | ||
|  | 
 | ||
|  |     } | ||
|  | } |