UnityGame/Library/PackageCache/com.unity.collab-proxy/Editor/PlasticSCM/UI/Tree/DrawTreeViewItem.cs
2024-10-27 10:53:47 +03:00

287 lines
8.0 KiB
C#

using UnityEditor;
using UnityEditor.IMGUI.Controls;
using UnityEngine;
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 ForCategoryItem(
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 bool ForCheckableCategoryItem(
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)
{
if (depth == -1)
return 0;
return 16 + (depth * 16);
}
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;
}
}