using System;
using UnityEngine;
#if dUI_TextMeshPro
using TMPro;
#endif
namespace XCharts.Runtime
{
///
/// Location type. Quick to set the general location.
/// |位置类型。通过Align快速设置大体位置,再通过left,right,top,bottom微调具体位置。
///
[Serializable]
public class Location : ChildComponent, IPropertyChanged
{
///
/// 对齐方式
///
public enum Align
{
TopLeft,
TopRight,
TopCenter,
BottomLeft,
BottomRight,
BottomCenter,
Center,
CenterLeft,
CenterRight
}
[SerializeField] private Align m_Align = Align.TopCenter;
[SerializeField] private float m_Left;
[SerializeField] private float m_Right;
[SerializeField] private float m_Top;
[SerializeField] private float m_Bottom;
private TextAnchor m_TextAlignment;
#if dUI_TextMeshPro
private TextAlignmentOptions m_TMPTextAlignment;
#endif
private Vector2 m_AnchorMin;
private Vector2 m_AnchorMax;
private Vector2 m_Pivot;
///
/// 对齐方式。
///
public Align align
{
get { return m_Align; }
set { if (PropertyUtil.SetStruct(ref m_Align, value)) { SetComponentDirty(); UpdateAlign(); } }
}
///
/// Distance between component and the left side of the container.
/// |离容器左侧的距离。
///
public float left
{
get { return m_Left; }
set { if (PropertyUtil.SetStruct(ref m_Left, value)) { SetComponentDirty(); UpdateAlign(); } }
}
///
/// Distance between component and the left side of the container.
/// |离容器右侧的距离。
///
public float right
{
get { return m_Right; }
set { if (PropertyUtil.SetStruct(ref m_Right, value)) { SetComponentDirty(); UpdateAlign(); } }
}
///
/// Distance between component and the left side of the container.
/// |离容器上侧的距离。
///
public float top
{
get { return m_Top; }
set { if (PropertyUtil.SetStruct(ref m_Top, value)) { SetComponentDirty(); UpdateAlign(); } }
}
///
/// Distance between component and the left side of the container.
/// |离容器下侧的距离。
///
public float bottom
{
get { return m_Bottom; }
set { if (PropertyUtil.SetStruct(ref m_Bottom, value)) { SetComponentDirty(); UpdateAlign(); } }
}
///
/// the anchor of text.
/// |Location对应的Anchor锚点
///
///
public TextAnchor runtimeTextAlignment { get { return m_TextAlignment; } }
#if dUI_TextMeshPro
public TextAlignmentOptions runtimeTMPTextAlignment { get { return m_TMPTextAlignment; } }
#endif
///
/// the minimum achor.
/// |Location对应的anchorMin。
///
public Vector2 runtimeAnchorMin { get { return m_AnchorMin; } }
///
/// the maximun achor.
/// |Location对应的anchorMax.
/// |
public Vector2 runtimeAnchorMax { get { return m_AnchorMax; } }
///
/// the povot.
/// |Loation对应的中心点。
///
public Vector2 runtimePivot { get { return m_Pivot; } }
public float runtimeLeft { get; private set; }
public float runtimeRight { get; private set; }
public float runtimeBottom { get; private set; }
public float runtimeTop { get; private set; }
public static Location defaultLeft
{
get
{
return new Location()
{
align = Align.CenterLeft,
left = 0.03f,
right = 0,
top = 0,
bottom = 0
};
}
}
public static Location defaultRight
{
get
{
return new Location()
{
align = Align.CenterRight,
left = 0,
right = 0.03f,
top = 0,
bottom = 0
};
}
}
public static Location defaultTop
{
get
{
return new Location()
{
align = Align.TopCenter,
left = 0,
right = 0,
top = 0.03f,
bottom = 0
};
}
}
public static Location defaultBottom
{
get
{
return new Location()
{
align = Align.BottomCenter,
left = 0,
right = 0,
top = 0,
bottom = 0.03f
};
}
}
private void UpdateAlign()
{
switch (m_Align)
{
case Align.BottomCenter:
m_TextAlignment = TextAnchor.LowerCenter;
#if dUI_TextMeshPro
m_TMPTextAlignment = TextAlignmentOptions.Bottom;
#endif
m_AnchorMin = new Vector2(0.5f, 0);
m_AnchorMax = new Vector2(0.5f, 0);
m_Pivot = new Vector2(0.5f, 0);
break;
case Align.BottomLeft:
m_TextAlignment = TextAnchor.LowerLeft;
#if dUI_TextMeshPro
m_TMPTextAlignment = TextAlignmentOptions.BottomLeft;
#endif
m_AnchorMin = new Vector2(0, 0);
m_AnchorMax = new Vector2(0, 0);
m_Pivot = new Vector2(0, 0);
break;
case Align.BottomRight:
m_TextAlignment = TextAnchor.LowerRight;
#if dUI_TextMeshPro
m_TMPTextAlignment = TextAlignmentOptions.BottomRight;
#endif
m_AnchorMin = new Vector2(1, 0);
m_AnchorMax = new Vector2(1, 0);
m_Pivot = new Vector2(1, 0);
break;
case Align.Center:
m_TextAlignment = TextAnchor.MiddleCenter;
#if dUI_TextMeshPro
m_TMPTextAlignment = TextAlignmentOptions.Center;
#endif
m_AnchorMin = new Vector2(0.5f, 0.5f);
m_AnchorMax = new Vector2(0.5f, 0.5f);
m_Pivot = new Vector2(0.5f, 0.5f);
break;
case Align.CenterLeft:
m_TextAlignment = TextAnchor.MiddleLeft;
#if dUI_TextMeshPro
m_TMPTextAlignment = TextAlignmentOptions.Left;
#endif
m_AnchorMin = new Vector2(0, 0.5f);
m_AnchorMax = new Vector2(0, 0.5f);
m_Pivot = new Vector2(0, 0.5f);
break;
case Align.CenterRight:
m_TextAlignment = TextAnchor.MiddleRight;
#if dUI_TextMeshPro
m_TMPTextAlignment = TextAlignmentOptions.Right;
#endif
m_AnchorMin = new Vector2(1, 0.5f);
m_AnchorMax = new Vector2(1, 0.5f);
m_Pivot = new Vector2(1, 0.5f);
break;
case Align.TopCenter:
m_TextAlignment = TextAnchor.UpperCenter;
#if dUI_TextMeshPro
m_TMPTextAlignment = TextAlignmentOptions.Top;
#endif
m_AnchorMin = new Vector2(0.5f, 1);
m_AnchorMax = new Vector2(0.5f, 1);
m_Pivot = new Vector2(0.5f, 1);
break;
case Align.TopLeft:
m_TextAlignment = TextAnchor.UpperLeft;
#if dUI_TextMeshPro
m_TMPTextAlignment = TextAlignmentOptions.TopLeft;
#endif
m_AnchorMin = new Vector2(0, 1);
m_AnchorMax = new Vector2(0, 1);
m_Pivot = new Vector2(0, 1);
break;
case Align.TopRight:
m_TextAlignment = TextAnchor.UpperRight;
#if dUI_TextMeshPro
m_TMPTextAlignment = TextAlignmentOptions.TopRight;
#endif
m_AnchorMin = new Vector2(1, 1);
m_AnchorMax = new Vector2(1, 1);
m_Pivot = new Vector2(1, 1);
break;
default:
break;
}
}
public void UpdateRuntimeData(float chartWidth, float chartHeight)
{
runtimeLeft = left <= 1 ? left * chartWidth : left;
runtimeRight = right <= 1 ? right * chartWidth : right;
runtimeTop = top <= 1 ? top * chartHeight : top;
runtimeBottom = bottom <= 1 ? bottom * chartHeight : bottom;
}
///
/// 返回在坐标系中的具体位置
///
///
///
///
public Vector3 GetPosition(float chartWidth, float chartHeight)
{
UpdateRuntimeData(chartWidth, chartHeight);
switch (align)
{
case Align.BottomCenter:
return new Vector3(chartWidth / 2, runtimeBottom);
case Align.BottomLeft:
return new Vector3(runtimeLeft, runtimeBottom);
case Align.BottomRight:
return new Vector3(chartWidth - runtimeRight, runtimeBottom);
case Align.Center:
return new Vector3(chartWidth / 2, chartHeight / 2);
case Align.CenterLeft:
return new Vector3(runtimeLeft, chartHeight / 2);
case Align.CenterRight:
return new Vector3(chartWidth - runtimeRight, chartHeight / 2);
case Align.TopCenter:
return new Vector3(chartWidth / 2, chartHeight - runtimeTop);
case Align.TopLeft:
return new Vector3(runtimeLeft, chartHeight - runtimeTop);
case Align.TopRight:
return new Vector3(chartWidth - runtimeRight, chartHeight - runtimeTop);
default:
return Vector2.zero;
}
}
///
/// 属性变更时更新textAnchor,minAnchor,maxAnchor,pivot
///
public void OnChanged()
{
UpdateAlign();
}
}
}