305 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			305 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using UnityEditor; | |||
|  | using UnityEditor.IMGUI.Controls; | |||
|  | using UnityEngine; | |||
|  | #if UNITY_6000_2_OR_NEWER | |||
|  | using TreeView = UnityEditor.IMGUI.Controls.TreeView<int>; | |||
|  | #endif | |||
|  | 
 | |||
|  | namespace Unity.PlasticSCM.Editor.UI.Tree | |||
|  | { | |||
|  |     internal static class DrawTreeViewItem | |||
|  |     { | |||
|  |         internal static void InitializeStyles() | |||
|  |         { | |||
|  |             if (EditorStyles.label == null) | |||
|  |                 return; | |||
|  | 
 | |||
|  |             TreeView.DefaultStyles.label = UnityStyles.Tree.Label; | |||
|  |             TreeView.DefaultStyles.boldLabel = UnityStyles.Tree.BoldLabel; | |||
|  |         } | |||
|  | 
 | |||
|  |         internal static void ForIndentedItem( | |||
|  |             Rect rowRect, | |||
|  |             int depth, | |||
|  |             string label, | |||
|  |             string infoLabel, | |||
|  |             bool isSelected, | |||
|  |             bool isFocused) | |||
|  |         { | |||
|  |             float indent = GetIndent(depth); | |||
|  | 
 | |||
|  |             rowRect.x += indent; | |||
|  |             rowRect.width -= indent; | |||
|  | 
 | |||
|  |             //add a little indentation | |||
|  |             rowRect.x += 5; | |||
|  |             rowRect.width -= 5; | |||
|  | 
 | |||
|  |             TreeView.DefaultGUI.Label(rowRect, label, isSelected, isFocused); | |||
|  | 
 | |||
|  |             if (!string.IsNullOrEmpty(infoLabel)) | |||
|  |                 DrawInfolabel(rowRect, label, infoLabel); | |||
|  |         } | |||
|  | 
 | |||
|  |         internal static void ForIndentedItemWithIcon( | |||
|  |             Rect rowRect, | |||
|  |             int depth, | |||
|  |             string label, | |||
|  |             string infoLabel, | |||
|  |             Texture icon) | |||
|  |         { | |||
|  |             float indent = GetIndent(depth); | |||
|  | 
 | |||
|  |             rowRect.x += indent; | |||
|  |             rowRect.width -= indent; | |||
|  | 
 | |||
|  |             EditorGUI.LabelField(rowRect, new GUIContent(label, icon), UnityStyles.Tree.IconStyle); | |||
|  | 
 | |||
|  |             if (!string.IsNullOrEmpty(infoLabel)) | |||
|  |                 DrawInfolabel(rowRect, label, infoLabel); | |||
|  |         } | |||
|  | 
 | |||
|  |         internal static bool ForCheckableIndentedItem( | |||
|  |             Rect rowRect, | |||
|  |             float rowHeight, | |||
|  |             int depth, | |||
|  |             string label, | |||
|  |             string infoLabel, | |||
|  |             bool isSelected, | |||
|  |             bool isFocused, | |||
|  |             bool wasChecked, | |||
|  |             bool hadCheckedChildren, | |||
|  |             bool hadPartiallyCheckedChildren) | |||
|  |         { | |||
|  |             float indent = GetIndent(depth); | |||
|  | 
 | |||
|  |             rowRect.x += indent; | |||
|  |             rowRect.width -= indent; | |||
|  | 
 | |||
|  |             Rect checkRect = GetCheckboxRect(rowRect, rowHeight); | |||
|  | 
 | |||
|  |             if (!wasChecked && (hadCheckedChildren || hadPartiallyCheckedChildren)) | |||
|  |                 EditorGUI.showMixedValue = true; | |||
|  | 
 | |||
|  |             bool isChecked = EditorGUI.Toggle(checkRect, wasChecked); | |||
|  |             EditorGUI.showMixedValue = false; | |||
|  | 
 | |||
|  |             rowRect.x = checkRect.xMax - 4; | |||
|  |             rowRect.width -= checkRect.width; | |||
|  | 
 | |||
|  |             //add a little indentation | |||
|  |             rowRect.x += 5; | |||
|  |             rowRect.width -= 5; | |||
|  | 
 | |||
|  |             TreeView.DefaultGUI.Label(rowRect, label, isSelected, isFocused); | |||
|  | 
 | |||
|  |             if (!string.IsNullOrEmpty(infoLabel)) | |||
|  |                 DrawInfolabel(rowRect, label, infoLabel); | |||
|  | 
 | |||
|  |             return isChecked; | |||
|  |         } | |||
|  | 
 | |||
|  |         internal static void ForItemCell( | |||
|  |             Rect rect, | |||
|  |             float rowHeight, | |||
|  |             int depth, | |||
|  |             Texture icon, | |||
|  |             Texture overlayIcon, | |||
|  |             string label, | |||
|  |             bool isSelected, | |||
|  |             bool isFocused, | |||
|  |             bool isBoldText, | |||
|  |             bool isSecondaryLabel) | |||
|  |         { | |||
|  |             float indent = GetIndent(depth); | |||
|  | 
 | |||
|  |             rect.x += indent; | |||
|  |             rect.width -= indent; | |||
|  | 
 | |||
|  |             rect = DrawIconLeft( | |||
|  |                rect, rowHeight, icon, overlayIcon); | |||
|  | 
 | |||
|  |             if (isSecondaryLabel) | |||
|  |             { | |||
|  |                 ForSecondaryLabel(rect, label, isSelected, isFocused, isBoldText); | |||
|  |                 return; | |||
|  |             } | |||
|  | 
 | |||
|  |             ForLabel(rect, label, isSelected, isFocused, isBoldText); | |||
|  |         } | |||
|  | 
 | |||
|  |         internal static bool ForCheckableItemCell( | |||
|  |             Rect rect, | |||
|  |             float rowHeight, | |||
|  |             int depth, | |||
|  |             Texture icon, | |||
|  |             Texture overlayIcon, | |||
|  |             string label, | |||
|  |             bool isSelected, | |||
|  |             bool isFocused, | |||
|  |             bool isHighlighted, | |||
|  |             bool wasChecked) | |||
|  |         { | |||
|  |             float indent = GetIndent(depth); | |||
|  | 
 | |||
|  |             rect.x += indent; | |||
|  |             rect.width -= indent; | |||
|  | 
 | |||
|  |             Rect checkRect = GetCheckboxRect(rect, rowHeight); | |||
|  | 
 | |||
|  |             bool isChecked = EditorGUI.Toggle(checkRect, wasChecked); | |||
|  | 
 | |||
|  |             rect.x = checkRect.xMax; | |||
|  |             rect.width -= checkRect.width; | |||
|  | 
 | |||
|  |             rect = DrawIconLeft( | |||
|  |                 rect, rowHeight, icon, overlayIcon); | |||
|  | 
 | |||
|  |             if (isHighlighted) | |||
|  |                 TreeView.DefaultGUI.BoldLabel(rect, label, isSelected, isFocused); | |||
|  |             else | |||
|  |                 TreeView.DefaultGUI.Label(rect, label, isSelected, isFocused); | |||
|  | 
 | |||
|  |             return isChecked; | |||
|  |         } | |||
|  | 
 | |||
|  |         internal static Rect DrawIconLeft( | |||
|  |             Rect rect, | |||
|  |             float rowHeight, | |||
|  |             Texture icon, | |||
|  |             Texture overlayIcon) | |||
|  |         { | |||
|  |             if (icon == null) | |||
|  |                 return rect; | |||
|  | 
 | |||
|  |             float iconWidth = rowHeight * ((float)icon.width / icon.height); | |||
|  | 
 | |||
|  |             Rect iconRect = new Rect(rect.x, rect.y, iconWidth, rowHeight); | |||
|  | 
 | |||
|  |             EditorGUI.LabelField(iconRect, new GUIContent(icon), UnityStyles.Tree.IconStyle); | |||
|  | 
 | |||
|  |             if (overlayIcon != null) | |||
|  |             { | |||
|  |                 Rect overlayIconRect = OverlayRect.GetOverlayRect( | |||
|  |                     iconRect, | |||
|  |                     OVERLAY_ICON_OFFSET); | |||
|  | 
 | |||
|  |                 GUI.DrawTexture( | |||
|  |                     overlayIconRect, overlayIcon, | |||
|  |                     ScaleMode.ScaleToFit); | |||
|  |             } | |||
|  | 
 | |||
|  |             rect.x += iconRect.width; | |||
|  |             rect.width -= iconRect.width; | |||
|  | 
 | |||
|  |             return rect; | |||
|  |         } | |||
|  | 
 | |||
|  |         static void DrawInfolabel( | |||
|  |             Rect rect, | |||
|  |             string label, | |||
|  |             string infoLabel) | |||
|  |         { | |||
|  |             Vector2 labelSize = ((GUIStyle)UnityStyles.Tree.Label) | |||
|  |                 .CalcSize(new GUIContent(label)); | |||
|  | 
 | |||
|  |             rect.x += labelSize.x; | |||
|  | 
 | |||
|  |             GUI.Label(rect, infoLabel, UnityStyles.Tree.InfoLabel); | |||
|  |         } | |||
|  | 
 | |||
|  |         static Rect GetCheckboxRect(Rect rect, float rowHeight) | |||
|  |         { | |||
|  |             return new Rect( | |||
|  |                 rect.x, | |||
|  |                 rect.y + UnityConstants.TREEVIEW_CHECKBOX_Y_OFFSET, | |||
|  |                 UnityConstants.TREEVIEW_CHECKBOX_SIZE, | |||
|  |                 rect.height); | |||
|  |         } | |||
|  | 
 | |||
|  |         static float GetIndent(int depth) | |||
|  |         { | |||
|  |             return 16 * (depth + 1); | |||
|  |         } | |||
|  | 
 | |||
|  |         internal static void ForSecondaryLabelRightAligned( | |||
|  |             Rect rect, | |||
|  |             string label, | |||
|  |             bool isSelected, | |||
|  |             bool isFocused, | |||
|  |             bool isBoldText) | |||
|  |         { | |||
|  |             if (Event.current.type != EventType.Repaint) | |||
|  |                 return; | |||
|  | 
 | |||
|  |             if (isBoldText) | |||
|  |             { | |||
|  |                 GUIStyle secondaryBoldRightAligned = | |||
|  |                     UnityStyles.Tree.SecondaryLabelBoldRightAligned; | |||
|  |                 secondaryBoldRightAligned.Draw( | |||
|  |                     rect, label, false, true, isSelected, isFocused); | |||
|  |                 return; | |||
|  |             } | |||
|  | 
 | |||
|  |             GUIStyle secondaryLabelRightAligned = | |||
|  |                 UnityStyles.Tree.SecondaryLabelRightAligned; | |||
|  |             secondaryLabelRightAligned.Draw( | |||
|  |                 rect, label, false, true, isSelected, isFocused); | |||
|  |         } | |||
|  | 
 | |||
|  |         internal static void ForSecondaryLabel( | |||
|  |             Rect rect, | |||
|  |             string label, | |||
|  |             bool isSelected, | |||
|  |             bool isFocused, | |||
|  |             bool isBoldText) | |||
|  |         { | |||
|  |             if (Event.current.type != EventType.Repaint) | |||
|  |                 return; | |||
|  | 
 | |||
|  |             if (isBoldText) | |||
|  |             { | |||
|  |                 GUIStyle secondaryBoldLabel = | |||
|  |                     UnityStyles.Tree.SecondaryBoldLabel; | |||
|  | 
 | |||
|  |                 secondaryBoldLabel.normal.textColor = Color.red; | |||
|  | 
 | |||
|  |                 secondaryBoldLabel.Draw( | |||
|  |                     rect, label, false, true, isSelected, isFocused); | |||
|  |                 return; | |||
|  |             } | |||
|  | 
 | |||
|  |             GUIStyle secondaryLabel = | |||
|  |                 UnityStyles.Tree.SecondaryLabel; | |||
|  | 
 | |||
|  |             secondaryLabel.Draw( | |||
|  |                 rect, label, false, true, isSelected, isFocused); | |||
|  |         } | |||
|  | 
 | |||
|  |         internal static void ForLabel( | |||
|  |             Rect rect, | |||
|  |             string label, | |||
|  |             bool isSelected, | |||
|  |             bool isFocused, | |||
|  |             bool isBoldText) | |||
|  |         { | |||
|  |             if (Event.current.type != EventType.Repaint) | |||
|  |                 return; | |||
|  | 
 | |||
|  |             if (isBoldText) | |||
|  |             { | |||
|  |                 GUIStyle boldLabel = UnityStyles.Tree.BoldLabel; | |||
|  |                 boldLabel.Draw( | |||
|  |                     rect, label, false, true, isSelected, isFocused); | |||
|  |                 return; | |||
|  |             } | |||
|  | 
 | |||
|  |             GUIStyle normalLabel = UnityStyles.Tree.Label; | |||
|  |             normalLabel.Draw( | |||
|  |                 rect, label, false, true, isSelected, isFocused); | |||
|  |         } | |||
|  | 
 | |||
|  |         const float OVERLAY_ICON_OFFSET = 16f; | |||
|  |     } | |||
|  | } |