Singularity/Library/PackageCache/com.unity.2d.path@5.0.2/Editor/IMGUI/GUIFramework/Control.cs
2024-05-06 11:45:45 -07:00

251 lines
8.3 KiB
C#

using System;
using UnityEngine;
namespace UnityEditor.U2D.Path.GUIFramework
{
/// <summary>
/// Represents a UI control in a custom editor.
/// </summary>
public abstract class Control
{
private string m_Name;
private int m_NameHashCode;
private int m_ID;
private LayoutData m_LayoutData;
private int m_ActionID = -1;
private LayoutData m_HotLayoutData;
/// <summary>
/// The name of the control.
/// </summary>
public string name
{
get { return m_Name; }
}
/// <summary>
/// The control ID. The GUI uses this to identify the control.
/// </summary>
public int ID
{
get { return m_ID; }
}
/// <summary>
/// The action ID.
/// </summary>
public int actionID
{
get { return m_ActionID; }
}
/// <summary>
/// The control's layout data. This contains information about the control's position and orientation.
/// </summary>
public LayoutData layoutData
{
get { return m_LayoutData; }
set { m_LayoutData = value; }
}
/// <summary>
/// The control's hot layout data
/// </summary>
public LayoutData hotLayoutData
{
get { return m_HotLayoutData; }
}
/// <summary>
/// Initializes and returns an instance of Control
/// </summary>
/// <param name="name">The name of the control</param>
public Control(string name)
{
m_Name = name;
m_NameHashCode = name.GetHashCode();
}
/// <summary>
/// Gets the control from the guiState.
/// </summary>
/// <param name="guiState">The current state of the custom editor.</param>
public void GetControl(IGUIState guiState)
{
m_ID = guiState.GetControlID(m_NameHashCode, FocusType.Passive);
}
internal void SetActionID(int actionID)
{
m_ActionID = actionID;
m_HotLayoutData = m_LayoutData;
}
/// <summary>
/// Begins the layout for this control. A call to EndLayout must always follow a call to this function.
/// </summary>
/// <param name="guiState">The current state of the custom editor.</param>
public void BeginLayout(IGUIState guiState)
{
Debug.Assert(guiState.eventType == EventType.Layout);
m_LayoutData = OnBeginLayout(LayoutData.zero, guiState);
}
/// <summary>
/// Gets the control's layout data from the guiState.
/// </summary>
/// <param name="guiState">The current state of the custom editor.</param>
public void Layout(IGUIState guiState)
{
Debug.Assert(guiState.eventType == EventType.Layout);
for (var i = 0; i < GetCount(); ++i)
{
if (guiState.hotControl == actionID && hotLayoutData.index == i)
continue;
var layoutData = new LayoutData()
{
index = i,
position = GetPosition(guiState, i),
distance = GetDistance(guiState, i),
forward = GetForward(guiState, i),
up = GetUp(guiState, i),
right = GetRight(guiState, i),
userData = GetUserData(guiState, i)
};
m_LayoutData = LayoutData.Nearest(m_LayoutData, layoutData);
}
}
/// <summary>
/// Ends the layout for this control. This function must always follow a call to BeginLayout().
/// </summary>
/// <param name="guiState">The current state of the custom editor.</param>
public void EndLayout(IGUIState guiState)
{
Debug.Assert(guiState.eventType == EventType.Layout);
OnEndLayout(guiState);
}
/// <summary>
/// Repaints the control.
/// </summary>
/// <param name="guiState">The current state of the custom editor.</param>
public void Repaint(IGUIState guiState)
{
for (var i = 0; i < GetCount(); ++i)
OnRepaint(guiState, i);
}
/// <summary>
/// Called when the control begins its layout.
/// </summary>
/// <param name="data">The layout data.</param>
/// <param name="guiState">The current state of the custom editor.</param>
/// <returns>Returns the layout data to use.</returns>
protected virtual LayoutData OnBeginLayout(LayoutData data, IGUIState guiState)
{
return data;
}
/// <summary>
/// Called when the control ends its layout.
/// /// </summary>
/// <param name="guiState">The current state of the custom editor.</param>
protected virtual void OnEndLayout(IGUIState guiState)
{
}
/// <summary>
/// Called when the control repaints its contents.
/// </summary>
/// <param name="guiState">The current state of the custom editor.</param>
/// <param name="index">The index.</param>
protected virtual void OnRepaint(IGUIState guiState, int index)
{
}
/// <summary>
/// Gets the number of sub-controllers.
/// </summary>
/// <remarks>
/// By default, this is `1`. If you implement your own controller and want to use multiple sub-controllers within it, you can override this function to declare how to count the sub-controllers.
/// </remarks>
/// <returns>Returns the number of sub-controllers. If you do not override this function, this returns 1.</returns>
protected virtual int GetCount()
{
return 1;
}
/// <summary>
/// Gets the position of the control.
/// </summary>
/// <param name="guiState">The current state of the custom editor.</param>
/// <param name="index">The index.</param>
/// <returns>Returns Vector3.zero.</returns>
protected virtual Vector3 GetPosition(IGUIState guiState, int index)
{
return Vector3.zero;
}
/// <summary>
/// Gets the forward vector of the control.
/// </summary>
/// <param name="guiState">The current state of the custom editor.</param>
/// <param name="index">The index.</param>
/// <returns>Returns Vector3.forward.</returns>
protected virtual Vector3 GetForward(IGUIState guiState, int index)
{
return Vector3.forward;
}
/// <summary>
/// Gets the up vector of the control.
/// </summary>
/// <param name="guiState">The current state of the custom editor.</param>
/// <param name="index">The index.</param>
/// <returns>Returns Vector3.up,</returns>
protected virtual Vector3 GetUp(IGUIState guiState, int index)
{
return Vector3.up;
}
/// <summary>
/// Gets the right vector of the control.
/// </summary>
/// <param name="guiState">The current state of the custom editor.</param>
/// <param name="index">The index.</param>
/// <returns>Returns Vector3.right.</returns>
protected virtual Vector3 GetRight(IGUIState guiState, int index)
{
return Vector3.right;
}
/// <summary>
/// Gets the distance from the Scene view camera to the control.
/// </summary>
/// <param name="guiState">The current state of the custom editor.</param>
/// <param name="index">The index.</param>
/// <returns>Returns layoutData.distance.</returns>
protected virtual float GetDistance(IGUIState guiState, int index)
{
return layoutData.distance;
}
/// <summary>
/// Gets the control's user data.
/// </summary>
/// <param name="guiState">The current state of the custom editor.</param>
/// <param name="index">The index.</param>
/// <returns>Returns `null`.</returns>
protected virtual object GetUserData(IGUIState guiState, int index)
{
return null;
}
}
}