using System.Collections.Generic; using System.ComponentModel; using UnityEngine; using UnityEngine.Serialization; namespace XCharts { public enum SerieType { Line, Bar, Pie, Radar } [System.Serializable] public class Serie : JsonDataSupport { [SerializeField] [DefaultValue("true")] private bool m_Show; [SerializeField] private SerieType m_Type; [SerializeField] private string m_Name; [SerializeField] private string m_Stack; [SerializeField] private int m_AxisIndex; [SerializeField] private bool m_TwoDimensionData; [FormerlySerializedAs("m_Data")] [SerializeField] private List m_YData = new List(); [SerializeField] private List m_XData = new List(); public bool show { get { return m_Show; } set { m_Show = value; } } public SerieType type { get { return m_Type; } set { m_Type = value; } } public string name { get { return m_Name; } set { m_Name = value; } } public string stack { get { return m_Stack; } set { m_Stack = value; } } public int axisIndex { get { return m_AxisIndex; } set { m_AxisIndex = value; } } public List yData { get { return m_YData; } set { m_YData = value; } } public List xData { get { return m_XData; } set { m_XData = value; } } public int filterStart { get; set; } public int filterEnd { get; set; } private List yFilterData { get; set; } private List xFilterData { get; set; } public float yMax { get { float max = int.MinValue; foreach (var data in yData) { if (data > max) { max = data; } } return max; } } public float xMax { get { float max = int.MinValue; foreach (var data in xData) { if (data > max) { max = data; } } return max; } } public float yMin { get { float min = int.MaxValue; foreach (var data in yData) { if (data < min) { min = data; } } return min; } } public float xMin { get { float min = int.MaxValue; foreach (var data in xData) { if (data < min) { min = data; } } return min; } } public float yTotal { get { float total = 0; foreach (var data in yData) { total += data; } return total; } } public float xTotal { get { float total = 0; foreach (var data in xData) { total += data; } return total; } } public void ClearData() { m_XData.Clear(); m_YData.Clear(); } public void RemoveData(int index) { m_XData.RemoveAt(index); m_YData.RemoveAt(index); } public void AddYData(float value, int maxDataNumber = 0) { if (maxDataNumber > 0) { while (m_XData.Count > maxDataNumber) m_XData.RemoveAt(0); while (m_YData.Count > maxDataNumber) m_YData.RemoveAt(0); } m_YData.Add(value); m_XData.Add(m_XData.Count); } public float GetYData(int index, DataZoom dataZoom = null) { var showData = GetYData(dataZoom); if (index >= 0 && index <= showData.Count - 1) { return showData[index]; } return 0; } public List GetYData(DataZoom dataZoom) { if (dataZoom != null && dataZoom.show) { var startIndex = (int)((yData.Count - 1) * dataZoom.start / 100); var endIndex = (int)((yData.Count - 1) * dataZoom.end / 100); var count = endIndex == startIndex ? 1 : endIndex - startIndex + 1; if (yFilterData == null || yFilterData.Count != count) { UpdateFilterData(dataZoom); } return yFilterData; } else { return m_YData; } } public List GetXData(DataZoom dataZoom) { if (dataZoom != null && dataZoom.show) { var startIndex = (int)((xData.Count - 1) * dataZoom.start / 100); var endIndex = (int)((xData.Count - 1) * dataZoom.end / 100); var count = endIndex == startIndex ? 1 : endIndex - startIndex + 1; if (xFilterData == null || xFilterData.Count != count) { UpdateFilterData(dataZoom); } return xFilterData; } else { return m_XData; } } public void UpdateFilterData(DataZoom dataZoom) { if (dataZoom != null && dataZoom.show) { var startIndex = (int)((yData.Count - 1) * dataZoom.start / 100); var endIndex = (int)((yData.Count - 1) * dataZoom.end / 100); if (startIndex != filterStart || endIndex != filterEnd) { filterStart = startIndex; filterEnd = endIndex; if (m_YData.Count > 0) { var count = endIndex == startIndex ? 1 : endIndex - startIndex + 1; yFilterData = m_YData.GetRange(startIndex, count); } else { yFilterData = m_YData; } if (m_XData.Count > 0) { var count = endIndex == startIndex ? 1 : endIndex - startIndex + 1; xFilterData = m_XData.GetRange(startIndex, count); } else { xFilterData = m_XData; } } else if (endIndex == 0) { yFilterData = new List(); xFilterData = new List(); } } } public void UpdateYData(int index, float value) { if (index >= 0 && index <= m_YData.Count - 1) { m_YData[index] = value; } } public override void ParseJsonData(string jsonData) { if (string.IsNullOrEmpty(jsonData) || !m_DataFromJson) return; m_YData = ChartHelper.ParseFloatFromString(jsonData); } } }