128 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			128 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System.Collections.Generic; | ||
|  | using System.Linq; | ||
|  | using UnityEngine; | ||
|  | using UnityEngine.UI; | ||
|  | using System.Globalization; | ||
|  | 
 | ||
|  | namespace UnityEditor.Events | ||
|  | { | ||
|  |     [CustomPreview(typeof(GameObject))] | ||
|  |     /// <summary> | ||
|  |     ///   Custom preview drawing that will draw the layout properties of a given object. | ||
|  |     /// </summary> | ||
|  |     class LayoutPropertiesPreview : ObjectPreview | ||
|  |     { | ||
|  |         private const float kLabelWidth = 110; | ||
|  |         private const float kValueWidth = 100; | ||
|  | 
 | ||
|  |         class Styles | ||
|  |         { | ||
|  |             public GUIStyle labelStyle = new GUIStyle(EditorStyles.label); | ||
|  |             public GUIStyle headerStyle = new GUIStyle(EditorStyles.boldLabel); | ||
|  | 
 | ||
|  |             public Styles() | ||
|  |             { | ||
|  |                 labelStyle.padding.right += 4; | ||
|  |                 headerStyle.padding.right += 4; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         private GUIContent m_Title; | ||
|  |         private Styles m_Styles; | ||
|  | 
 | ||
|  |         public override void Initialize(UnityEngine.Object[] targets) | ||
|  |         { | ||
|  |             base.Initialize(targets); | ||
|  |         } | ||
|  | 
 | ||
|  |         public override GUIContent GetPreviewTitle() | ||
|  |         { | ||
|  |             if (m_Title == null) | ||
|  |             { | ||
|  |                 m_Title = EditorGUIUtility.TrTextContent("Layout Properties"); | ||
|  |             } | ||
|  |             return m_Title; | ||
|  |         } | ||
|  | 
 | ||
|  |         public override bool HasPreviewGUI() | ||
|  |         { | ||
|  |             GameObject go = target as GameObject; | ||
|  |             if (!go) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             // Prevent allocations in the editor by using TryGetComponent | ||
|  |             ILayoutElement layoutElement; | ||
|  |             return go.TryGetComponent(out layoutElement); | ||
|  |         } | ||
|  | 
 | ||
|  |         public override void OnPreviewGUI(Rect r, GUIStyle background) | ||
|  |         { | ||
|  |             if (Event.current.type != EventType.Repaint) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             if (m_Styles == null) | ||
|  |                 m_Styles = new Styles(); | ||
|  | 
 | ||
|  |             GameObject go = target as GameObject; | ||
|  |             RectTransform rect = go.transform as RectTransform; | ||
|  |             if (rect == null) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             // Apply padding | ||
|  |             RectOffset previewPadding = new RectOffset(-5, -5, -5, -5); | ||
|  |             r = previewPadding.Add(r); | ||
|  | 
 | ||
|  |             // Prepare rects for columns | ||
|  |             r.height = EditorGUIUtility.singleLineHeight; | ||
|  |             Rect labelRect = r; | ||
|  |             Rect valueRect = r; | ||
|  |             Rect sourceRect = r; | ||
|  |             labelRect.width = kLabelWidth; | ||
|  |             valueRect.xMin += kLabelWidth; | ||
|  |             valueRect.width = kValueWidth; | ||
|  |             sourceRect.xMin += kLabelWidth + kValueWidth; | ||
|  | 
 | ||
|  |             // Headers | ||
|  |             GUI.Label(labelRect, "Property", m_Styles.headerStyle); | ||
|  |             GUI.Label(valueRect, "Value", m_Styles.headerStyle); | ||
|  |             GUI.Label(sourceRect, "Source", m_Styles.headerStyle); | ||
|  |             labelRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; | ||
|  |             valueRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; | ||
|  |             sourceRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; | ||
|  | 
 | ||
|  |             // Prepare reusable variable for out argument | ||
|  |             ILayoutElement source = null; | ||
|  | 
 | ||
|  |             // Show properties | ||
|  | 
 | ||
|  |             ShowProp(ref labelRect, ref valueRect, ref sourceRect, "Min Width", LayoutUtility.GetLayoutProperty(rect, e => e.minWidth, 0, out source).ToString(CultureInfo.InvariantCulture.NumberFormat), source); | ||
|  |             ShowProp(ref labelRect, ref valueRect, ref sourceRect, "Min Height", LayoutUtility.GetLayoutProperty(rect, e => e.minHeight, 0, out source).ToString(CultureInfo.InvariantCulture.NumberFormat), source); | ||
|  |             ShowProp(ref labelRect, ref valueRect, ref sourceRect, "Preferred Width", LayoutUtility.GetLayoutProperty(rect, e => e.preferredWidth, 0, out source).ToString(CultureInfo.InvariantCulture.NumberFormat), source); | ||
|  |             ShowProp(ref labelRect, ref valueRect, ref sourceRect, "Preferred Height", LayoutUtility.GetLayoutProperty(rect, e => e.preferredHeight, 0, out source).ToString(CultureInfo.InvariantCulture.NumberFormat), source); | ||
|  | 
 | ||
|  |             float flexible = 0; | ||
|  | 
 | ||
|  |             flexible = LayoutUtility.GetLayoutProperty(rect, e => e.flexibleWidth, 0, out source); | ||
|  |             ShowProp(ref labelRect, ref valueRect, ref sourceRect, "Flexible Width", flexible > 0 ? ("enabled (" + flexible.ToString(CultureInfo.InvariantCulture.NumberFormat) + ")") : "disabled", source); | ||
|  |             flexible = LayoutUtility.GetLayoutProperty(rect, e => e.flexibleHeight, 0, out source); | ||
|  |             ShowProp(ref labelRect, ref valueRect, ref sourceRect, "Flexible Height", flexible > 0 ? ("enabled (" + flexible.ToString(CultureInfo.InvariantCulture.NumberFormat) + ")") : "disabled", source); | ||
|  | 
 | ||
|  |             if (!rect.GetComponent<LayoutElement>()) | ||
|  |             { | ||
|  |                 Rect noteRect = new Rect(labelRect.x, labelRect.y + 10, r.width, EditorGUIUtility.singleLineHeight); | ||
|  |                 GUI.Label(noteRect, "Add a LayoutElement to override values.", m_Styles.labelStyle); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         private void ShowProp(ref Rect labelRect, ref Rect valueRect, ref Rect sourceRect, string label, string value, ILayoutElement source) | ||
|  |         { | ||
|  |             GUI.Label(labelRect, label, m_Styles.labelStyle); | ||
|  |             GUI.Label(valueRect, value, m_Styles.labelStyle); | ||
|  |             GUI.Label(sourceRect, source == null ? "none" : source.GetType().Name, m_Styles.labelStyle); | ||
|  |             labelRect.y += EditorGUIUtility.singleLineHeight; | ||
|  |             valueRect.y += EditorGUIUtility.singleLineHeight; | ||
|  |             sourceRect.y += EditorGUIUtility.singleLineHeight; | ||
|  |         } | ||
|  |     } | ||
|  | } |