123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- 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;
- }
- }
- }
|