From 5f18f060e394b98175a490b91e268e924b5d2c8c Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Tue, 2 Nov 2021 21:23:01 +0800 Subject: [PATCH] Optimized SerieData to support tree data --- .../Editor/PropertyDrawers/SerieDrawer.cs | 3 ++ .../XCharts/Runtime/Component/Main/Serie.cs | 38 +++++++++++++++--- .../Runtime/Component/Sub/SerieData.cs | 39 +++++++------------ Assets/XCharts/Runtime/Internal/BaseChart.cs | 4 +- 4 files changed, 53 insertions(+), 31 deletions(-) diff --git a/Assets/XCharts/Editor/PropertyDrawers/SerieDrawer.cs b/Assets/XCharts/Editor/PropertyDrawers/SerieDrawer.cs index 9b87a873..cdf7c520 100644 --- a/Assets/XCharts/Editor/PropertyDrawers/SerieDrawer.cs +++ b/Assets/XCharts/Editor/PropertyDrawers/SerieDrawer.cs @@ -402,6 +402,7 @@ namespace XCharts { EditorGUI.indentLevel += 2; var m_Ignore = serieData.FindPropertyRelative("m_Ignore"); + var m_Id = serieData.FindPropertyRelative("m_Id"); var m_EnableIcon = serieData.FindPropertyRelative("m_EnableIconStyle"); var m_Icon = serieData.FindPropertyRelative("m_IconStyle"); var m_EnableLabel = serieData.FindPropertyRelative("m_EnableLabel"); @@ -414,6 +415,8 @@ namespace XCharts var m_Symbol = serieData.FindPropertyRelative("m_Symbol"); EditorGUI.PropertyField(drawRect, m_Ignore); AddHeight(EditorGUI.GetPropertyHeight(m_Ignore)); + EditorGUI.PropertyField(drawRect, m_Id); + AddHeight(EditorGUI.GetPropertyHeight(m_Id)); EditorGUI.PropertyField(drawRect, m_Icon); ChartEditorHelper.MakeBool(drawRect, m_EnableIcon, 1, "(enable)"); AddHeight(EditorGUI.GetPropertyHeight(m_Icon)); diff --git a/Assets/XCharts/Runtime/Component/Main/Serie.cs b/Assets/XCharts/Runtime/Component/Main/Serie.cs index c22fe8e3..316c32af 100644 --- a/Assets/XCharts/Runtime/Component/Main/Serie.cs +++ b/Assets/XCharts/Runtime/Component/Main/Serie.cs @@ -363,6 +363,7 @@ namespace XCharts [NonSerialized] internal bool m_NeedUpdateFilterData; [NonSerialized] internal List m_FilterData = new List(); [NonSerialized] internal List m_SortedData = new List(); + [NonSerialized] internal List m_RootData = new List(); [NonSerialized] private Dictionary> m_UpSmoothPoints = new Dictionary>(); [NonSerialized] private Dictionary> m_DownSmoothPoints = new Dictionary>(); [NonSerialized] private List m_DataPoints = new List(); @@ -1190,6 +1191,7 @@ namespace XCharts public float runtimeHeight { get; internal set; } public Rect runtimeRect { get; internal set; } public List runtimeSortedData { get { return m_SortedData; } } + public List rootData { get { return m_RootData; } } public bool nameDirty { get { return m_NameDirty; } } private void SetNameDirty() @@ -1530,6 +1532,32 @@ namespace XCharts } } + public SerieData AddChildData(SerieData parent, double value, string name = null) + { + var serieData = new SerieData(); + serieData.name = name; + serieData.index = m_Data.Count; + serieData.data = new List() { parent.children.Count, value }; + serieData.parentIndex = parent.index; + serieData.runtimeParent = parent; + AddSerieDataHeadOrTail(serieData); + parent.children.Add(serieData.index); + parent.runtimeChildren.Add(serieData); + return serieData; + } + public SerieData AddChildData(SerieData parent, List value, string name = null) + { + var serieData = new SerieData(); + serieData.name = name; + serieData.index = m_Data.Count; + serieData.data = new List(value); + serieData.parentIndex = parent.index; + serieData.runtimeParent = parent; + AddSerieDataHeadOrTail(serieData); + parent.children.Add(serieData.index); + parent.runtimeChildren.Add(serieData); + return serieData; + } private void CheckMaxCache() { @@ -1646,23 +1674,23 @@ namespace XCharts return null; } - public SerieData GetSerieData(string uuid, DataZoom dataZoom = null) + public SerieData GetSerieData(string id, DataZoom dataZoom = null) { var data = GetDataList(dataZoom); foreach (var serieData in data) { - var target = GetSerieData(serieData, uuid); + var target = GetSerieData(serieData, id); if (target != null) return target; } return null; } - public SerieData GetSerieData(SerieData parent, string uuid) + public SerieData GetSerieData(SerieData parent, string id) { - if (uuid.Equals(parent.uuid)) return parent; + if (id.Equals(parent.id)) return parent; foreach (var child in parent.children) { - var data = GetSerieData(child, uuid); + var data = GetSerieData(GetSerieData(child), id); if (data != null) { return data; diff --git a/Assets/XCharts/Runtime/Component/Sub/SerieData.cs b/Assets/XCharts/Runtime/Component/Sub/SerieData.cs index 57b022fa..3bc41a63 100644 --- a/Assets/XCharts/Runtime/Component/Sub/SerieData.cs +++ b/Assets/XCharts/Runtime/Component/Sub/SerieData.cs @@ -18,8 +18,10 @@ namespace XCharts [System.Serializable] public class SerieData : SubComponent { + [SerializeField] private int m_Index; + [SerializeField] private int m_ParentIndex = -1; [SerializeField] private string m_Name; - [SerializeField] private string m_Uuid; + [SerializeField] private string m_Id; [SerializeField] private bool m_Selected; [SerializeField] private bool m_Ignore = false; [SerializeField] private float m_Radius; @@ -34,14 +36,15 @@ namespace XCharts [SerializeField] private bool m_EnableSymbol = false; [SerializeField] private SerieSymbol m_Symbol = new SerieSymbol(); [SerializeField] private List m_Data = new List(); - [SerializeField] private List m_Children = new List(); + [SerializeField] private List m_Children = new List(); public ChartLabel labelObject { get; set; } private bool m_Show = true; private float m_RtPieOutsideRadius; - public int index { get; set; } + public int index { get { return m_Index; } set { m_Index = value; } } + public int parentIndex { get { return m_ParentIndex; } set { m_ParentIndex = value; } } /// /// the name of data item. /// 数据项名称。 @@ -50,7 +53,7 @@ namespace XCharts /// /// 数据项的唯一id。唯一id不是必须设置的。 /// - public string uuid { get { return m_Uuid; } set { m_Uuid = value; } } + public string id { get { return m_Id; } set { m_Id = value; } } /// /// 数据项图例名称。当数据项名称不为空时,图例名称即为系列名称;反之则为索引index。 /// @@ -119,7 +122,7 @@ namespace XCharts /// 可指定任意维数的数值列表。 /// public List data { get { return m_Data; } set { m_Data = value; } } - public List children { get { return m_Children; } set { m_Children = value; } } + public List children { get { return m_Children; } set { m_Children = value; } } /// /// [default:true] Whether the data item is showed. /// 该数据项是否要显示。 @@ -190,14 +193,19 @@ namespace XCharts public Vector3 runtiemPieOffsetCenter { get; set; } public float runtimeStackHig { get; set; } public Image runtimeSymbol { get; set; } + public List runtimeChildren { get { return m_RuntimeChildren; } } + private List m_PreviousData = new List(); private List m_DataUpdateTime = new List(); private List m_DataUpdateFlag = new List(); private List m_PolygonPoints = new List(); + [System.NonSerialized] + private List m_RuntimeChildren = new List(); public void Reset() { index = 0; + m_ParentIndex = -1; labelObject = null; highlighted = false; m_Name = string.Empty; @@ -212,6 +220,8 @@ namespace XCharts m_Radius = 0; m_Data.Clear(); m_PreviousData.Clear(); + m_PolygonPoints.Clear(); + m_RuntimeChildren.Clear(); m_DataUpdateTime.Clear(); m_DataUpdateFlag.Clear(); m_IconStyle.Reset(); @@ -220,25 +230,6 @@ namespace XCharts m_Emphasis.Reset(); } - public SerieData AddChildData(double value, string name = null) - { - var serieData = new SerieData(); - serieData.name = name; - serieData.data = new List() { children.Count, value }; - serieData.runtimeParent = this; - children.Add(serieData); - return serieData; - } - public SerieData AddChildData(List value, string name = null) - { - var serieData = new SerieData(); - serieData.name = name; - serieData.data = new List(value); - serieData.runtimeParent = this; - children.Add(serieData); - return serieData; - } - public double GetData(int index, bool inverse = false) { if (index >= 0 && index < m_Data.Count) diff --git a/Assets/XCharts/Runtime/Internal/BaseChart.cs b/Assets/XCharts/Runtime/Internal/BaseChart.cs index 5b223e1f..6ca96ee5 100644 --- a/Assets/XCharts/Runtime/Internal/BaseChart.cs +++ b/Assets/XCharts/Runtime/Internal/BaseChart.cs @@ -570,9 +570,9 @@ namespace XCharts item.SetIconActive(iconStyle.show); serieData.labelObject = item; - foreach (var data in serieData.children) + foreach (var dataIndex in serieData.children) { - AddSerieLabel(serie, data, ref count); + AddSerieLabel(serie, serie.GetSerieData(dataIndex), ref count); count++; } }