Files
JJBB/Assets/Plugins/RuntimeInspector/Scripts/RuntimeHierarchy/HierarchyField.cs

213 lines
5.6 KiB
C#
Raw Normal View History

2024-09-03 19:56:21 +08:00
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace RuntimeInspectorNamespace
{
public class HierarchyField : RecycledListItem, ITooltipContent
{
private enum ExpandedState { Collapsed = 0, Expanded = 1, ArrowHidden = 2 };
private const float INACTIVE_ITEM_TEXT_ALPHA = 0.57f;
private const float TEXT_X_OFFSET = 35f;
#pragma warning disable 0649
[SerializeField]
private RectTransform contentTransform;
[SerializeField]
private Text nameText;
[SerializeField]
private PointerEventListener clickListener;
[SerializeField]
private PointerEventListener expandToggle;
[SerializeField]
private Image expandArrow;
[SerializeField]
private Toggle multiSelectionToggle;
[SerializeField]
private Image multiSelectionToggleBackground;
#pragma warning restore 0649
private RectTransform rectTransform;
private Image background;
private int m_skinVersion = 0;
private UISkin m_skin;
public UISkin Skin
{
get { return m_skin; }
set
{
if( m_skin != value || m_skinVersion != m_skin.Version )
{
m_skin = value;
m_skinVersion = m_skin.Version;
rectTransform.sizeDelta = new Vector2( 0f, Skin.LineHeight );
nameText.SetSkinText( Skin );
expandArrow.color = Skin.ExpandArrowColor;
nameText.rectTransform.anchoredPosition = new Vector2( Skin.ExpandArrowSpacing + Skin.LineHeight * 0.75f, 0f );
( (RectTransform) expandToggle.transform ).sizeDelta = new Vector2( Skin.LineHeight, Skin.LineHeight );
( (RectTransform) multiSelectionToggle.transform ).sizeDelta = new Vector2( Skin.LineHeight * 0.8f, Skin.LineHeight * 0.8f );
multiSelectionToggle.graphic.color = Skin.ToggleCheckmarkColor;
multiSelectionToggleBackground.color = Skin.InputFieldNormalBackgroundColor;
}
}
}
private bool m_isSelected;
public bool IsSelected
{
get { return m_isSelected; }
set
{
m_isSelected = value;
Color textColor;
if( m_isSelected )
{
background.color = Skin.SelectedItemBackgroundColor;
textColor = Skin.SelectedItemTextColor;
}
else
{
background.color = Data.Depth == 0 ? Skin.BackgroundColor.Tint( 0.075f ) : Color.clear;
textColor = Skin.TextColor;
}
textColor.a = m_isActive ? 1f : INACTIVE_ITEM_TEXT_ALPHA;
nameText.color = textColor;
multiSelectionToggle.isOn = m_isSelected;
}
}
private bool m_isActive;
private bool IsActive
{
get { return m_isActive; }
set
{
if( m_isActive != value )
{
m_isActive = value;
Color color = nameText.color;
color.a = m_isActive ? 1f : INACTIVE_ITEM_TEXT_ALPHA;
nameText.color = color;
}
}
}
public bool MultiSelectionToggleVisible
{
get { return multiSelectionToggle.gameObject.activeSelf; }
set
{
if( Data == null || Data.Depth <= 0 )
value = false;
if( multiSelectionToggle.gameObject.activeSelf != value )
{
multiSelectionToggle.gameObject.SetActive( value );
contentTransform.anchoredPosition = new Vector2( Skin.IndentAmount * Data.Depth + ( value ? Skin.LineHeight * 0.8f : 0f ), 0f );
}
}
}
private ExpandedState m_isExpanded = ExpandedState.Collapsed;
private ExpandedState IsExpanded
{
get { return m_isExpanded; }
set
{
if( m_isExpanded != value )
{
m_isExpanded = value;
if( m_isExpanded == ExpandedState.ArrowHidden )
expandToggle.gameObject.SetActive( false );
else
{
expandToggle.gameObject.SetActive( true );
expandArrow.rectTransform.localEulerAngles = m_isExpanded == ExpandedState.Expanded ? new Vector3( 0f, 0f, -90f ) : Vector3.zero;
}
}
}
}
bool ITooltipContent.IsActive { get { return this && gameObject.activeSelf; } }
string ITooltipContent.TooltipText { get { return Data.Name; } }
public float PreferredWidth { get; private set; }
public RuntimeHierarchy Hierarchy { get; private set; }
public HierarchyData Data { get; private set; }
public void Initialize( RuntimeHierarchy hierarchy )
{
Hierarchy = hierarchy;
rectTransform = (RectTransform) transform;
background = clickListener.GetComponent<Image>();
if( hierarchy.ShowTooltips )
clickListener.gameObject.AddComponent<TooltipArea>().Initialize( hierarchy.TooltipListener, this );
expandToggle.PointerClick += ( eventData ) => ToggleExpandedState();
clickListener.PointerClick += ( eventData ) => OnClick();
clickListener.PointerDown += OnPointerDown;
clickListener.PointerUp += OnPointerUp;
}
public void SetContent( HierarchyData data )
{
Data = data;
contentTransform.anchoredPosition = new Vector2( Skin.IndentAmount * data.Depth + ( MultiSelectionToggleVisible ? Skin.LineHeight * 0.8f : 0f ), 0f );
background.sprite = data.Depth == 0 ? Hierarchy.SceneDrawerBackground : Hierarchy.TransformDrawerBackground;
RefreshName();
}
private void ToggleExpandedState()
{
Data.IsExpanded = !Data.IsExpanded;
}
public void Refresh()
{
IsActive = Data.IsActive;
IsExpanded = Data.CanExpand ? ( Data.IsExpanded ? ExpandedState.Expanded : ExpandedState.Collapsed ) : ExpandedState.ArrowHidden;
}
public void RefreshName()
{
nameText.text = Data.Name;
if( Hierarchy.ShowHorizontalScrollbar )
{
LayoutRebuilder.ForceRebuildLayoutImmediate( nameText.rectTransform );
PreferredWidth = Data.Depth * m_skin.IndentAmount + TEXT_X_OFFSET + nameText.rectTransform.sizeDelta.x;
}
}
private void OnPointerDown( PointerEventData eventData )
{
Hierarchy.OnDrawerPointerEvent( this, eventData, true );
}
private void OnPointerUp( PointerEventData eventData )
{
Hierarchy.OnDrawerPointerEvent( this, eventData, false );
}
}
}