using System.Linq; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace XCharts { /// /// A data item of serie. /// 系列中的一个数据项。可存储数据名和1-n维的数据。 /// [System.Serializable] public class SerieData : SubComponent { [SerializeField] private string m_Name; [SerializeField] private bool m_Selected; [SerializeField] private float m_Radius; [SerializeField] private bool m_ShowIcon; [SerializeField] private Sprite m_IconImage; [SerializeField] private Color m_IconColor = Color.white; [SerializeField] private float m_IconWidth = 40; [SerializeField] private float m_IconHeight = 40; [SerializeField] private Vector3 m_IconOffset; [SerializeField] private List m_Data = new List(); private bool m_Show = true; private bool m_LabelAutoSize; private float m_LabelPaddingLeftRight; private float m_LabelPaddingTopBottom; private float m_RtPieOutsideRadius; public int index { get; set; } /// /// the name of data item. /// 数据项名称。 /// public string name { get { return m_Name; } set { m_Name = value; } } /// /// 数据项图例名称。当数据项名称不为空时,图例名称即为系列名称;反之则为索引index。 /// /// public string legendName { get { return string.IsNullOrEmpty(name) ? ChartCached.IntToStr(index) : name; } } /// /// 自定义半径。可用在饼图中自定义某个数据项的半径。 /// public float radius { get { return m_Radius; } set { m_Radius = value; } } /// /// Whether the data item is selected. /// 该数据项是否被选中。 /// public bool selected { get { return m_Selected; } set { m_Selected = value; } } /// /// Whether the data icon is show. /// 是否显示图标。 /// public bool showIcon { get { return m_ShowIcon; } set { m_ShowIcon = value; } } /// /// The image of icon. /// 图标的图片。 /// public Sprite iconImage { get { return m_IconImage; } set { m_IconImage = value; } } /// /// 图标颜色。 /// public Color iconColor { get { return m_IconColor; } set { m_IconColor = value; } } /// /// 图标宽。 /// public float iconWidth { get { return m_IconWidth; } set { m_IconWidth = value; } } /// /// 图标高。 /// public float iconHeight { get { return m_IconHeight; } set { m_IconHeight = value; } } /// /// 图标偏移。 /// public Vector3 iconOffset { get { return m_IconOffset; } set { m_IconOffset = value; } } /// /// An arbitrary dimension data list of data item. /// 可指定任意维数的数值列表。 /// public List data { get { return m_Data; } set { m_Data = value; } } /// /// [default:true] Whether the data item is showed. /// 该数据项是否要显示。 /// public bool show { get { return m_Show; } set { m_Show = value; } } /// /// Whether the data item is highlighted. /// 该数据项是否被高亮,一般由鼠标悬停或图例悬停触发高亮。 /// public bool highlighted { get; set; } /// /// the label of data item. /// 该数据项的文本标签。 /// public Text labelText { get; private set; } public RectTransform labelRect { get; private set; } /// /// 标志位置。 /// public Vector3 labelPosition { get; set; } /// /// 是否可以显示Label /// public bool canShowLabel { get; set; } /// /// the maxinum value. /// 最大值。 /// public float max { get { return m_Data.Max(); } } /// /// the mininum value. /// 最小值。 /// public float min { get { return m_Data.Min(); } } public Image icon { get; private set; } public RectTransform iconRect { get; private set; } /// /// 关联的gameObject /// public GameObject gameObject { get; private set; } /// /// 饼图数据项的开始角度(运行时自动计算) /// public float pieStartAngle { get; set; } /// /// 饼图数据项的结束角度(运行时自动计算) /// public float pieToAngle { get; set; } /// /// 饼图数据项的一半时的角度(运行时自动计算) /// public float pieHalfAngle { get; set; } /// /// 饼图数据项的当前角度(运行时自动计算) /// public float pieCurrAngle { get; set; } /// /// 饼图数据项的内半径 /// public float pieInsideRadius { get; set; } /// /// 饼图数据项的外半径 /// public float pieOutsideRadius { get { if (radius > 0) return radius; else return m_RtPieOutsideRadius; } set { m_RtPieOutsideRadius = value; } } /// /// 饼图数据项的偏移半径 /// public float pieOffsetRadius { get; set; } public Vector3 pieOffsetCenter { get; set; } public float GetData(int index) { if (index >= 0 && index < m_Data.Count) return m_Data[index]; else return 0; } public void InitLabel(GameObject labelObj, bool autoSize, float paddingLeftRight, float paddingTopBottom) { gameObject = labelObj; m_LabelAutoSize = autoSize; m_LabelPaddingLeftRight = paddingLeftRight; m_LabelPaddingTopBottom = paddingTopBottom; labelText = labelObj.GetComponentInChildren(); labelRect = labelText.GetComponent(); } public void SetLabelActive(bool active) { if (labelRect) { ChartHelper.SetActive(labelRect, active); } } public bool SetLabelText(string text) { if (labelText) { labelText.text = text; if (m_LabelAutoSize) { var newSize = new Vector2(labelText.preferredWidth + m_LabelPaddingLeftRight * 2, labelText.preferredHeight + m_LabelPaddingTopBottom * 2); var sizeChange = newSize.x != labelRect.sizeDelta.x || newSize.y != labelRect.sizeDelta.y; if (sizeChange) labelRect.sizeDelta = newSize; return sizeChange; } } return false; } public float GetLabelWidth() { if (labelRect) return labelRect.sizeDelta.x; else return 0; } public float GetLabelHeight() { if (labelRect) return labelRect.sizeDelta.y; return 0; } public void SetGameObjectPosition(Vector3 position) { if (gameObject) { gameObject.transform.localPosition = position; } } public void SetLabelPosition(Vector3 position) { if (labelRect) labelRect.localPosition = position; } public void SetIconObj(GameObject iconObj) { icon = iconObj.GetComponent(); iconRect = iconObj.GetComponent(); UpdateIcon(); } public void UpdateIcon() { if (icon == null) return; if (m_ShowIcon) { ChartHelper.SetActive(icon.gameObject, true); icon.sprite = m_IconImage; icon.color = m_IconColor; iconRect.sizeDelta = new Vector2(m_IconWidth, m_IconHeight); icon.transform.localPosition = m_IconOffset; } else { ChartHelper.SetActive(icon.gameObject, false); } } } }