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;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |