diff --git a/Editor/PropertyDrawers/SerieDrawer.cs b/Editor/PropertyDrawers/SerieDrawer.cs index 47baa570..9fdf62e4 100644 --- a/Editor/PropertyDrawers/SerieDrawer.cs +++ b/Editor/PropertyDrawers/SerieDrawer.cs @@ -43,8 +43,8 @@ namespace XCharts m_DrawRect.y += hig; m_Heights[m_KeyName] += hig; - PropertyField(prop, "m_Name"); PropertyField(prop, "m_InsertDataToHead"); + PropertyField(prop, "m_Name"); switch (serieType) { case SerieType.Line: diff --git a/Runtime/API/BaseChart_API.cs b/Runtime/API/BaseChart_API.cs index d2820f39..13d5f025 100644 --- a/Runtime/API/BaseChart_API.cs +++ b/Runtime/API/BaseChart_API.cs @@ -182,7 +182,7 @@ namespace XCharts /// the name of serie public virtual void RemoveData(string serieName) { - m_Series.Remove(serieName); + m_Series.RemoveSerie(serieName); foreach (var legend in m_Legends) legend.RemoveData(serieName); m_SerieLabelRoot = null; RefreshChart(); @@ -220,6 +220,11 @@ namespace XCharts return AddSerie(type, serieName, show, addToHead); } + public virtual Serie InsertSerie(int index, SerieType serieType, string serieName = null, bool show = true) + { + return m_Series.InsertSerie(index, serieType, serieName, show); + } + /// /// Add a data to serie. /// If serieName doesn't exist in legend,will be add to legend. diff --git a/Runtime/Component/Main/Axis.cs b/Runtime/Component/Main/Axis.cs index c26969bd..59a9e197 100644 --- a/Runtime/Component/Main/Axis.cs +++ b/Runtime/Component/Main/Axis.cs @@ -562,6 +562,11 @@ namespace XCharts return type == AxisType.Time; } + public void SetNeedUpdateFilterData() + { + m_NeedUpdateFilterData = true; + } + /// /// 添加一个类目到类目数据列表 /// @@ -663,37 +668,43 @@ namespace XCharts { if (dataZoom != null && dataZoom.enable && dataZoom.IsContainsAxis(this)) { - var startIndex = (int)((data.Count - 1) * dataZoom.start / 100); - var endIndex = (int)((data.Count - 1) * dataZoom.end / 100); - if (endIndex < startIndex) endIndex = startIndex; - if (startIndex != filterStart || endIndex != filterEnd || dataZoom.minShowNum != filterMinShow || m_NeedUpdateFilterData) + var data = GetDataList(); + var range = Mathf.RoundToInt(data.Count * (dataZoom.end - dataZoom.start) / 100); + if (range <= 0) range = 1; + int start = 0, end = 0; + if (dataZoom.runtimeInvert) { - filterStart = startIndex; - filterEnd = endIndex; + end = Mathf.CeilToInt(data.Count * dataZoom.end / 100); + start = end - range; + if (start < 0) start = 0; + } + else + { + start = Mathf.FloorToInt(data.Count * dataZoom.start / 100); + end = start + range; + if (end > data.Count) end = data.Count; + } + if (start != filterStart || end != filterEnd || dataZoom.minShowNum != filterMinShow || m_NeedUpdateFilterData) + { + filterStart = start; + filterEnd = end; filterMinShow = dataZoom.minShowNum; m_NeedUpdateFilterData = false; - var data = GetDataList(); if (data.Count > 0) { - var count = endIndex == startIndex ? 1 : endIndex - startIndex + 1; - if (count < dataZoom.minShowNum) + if (range < dataZoom.minShowNum) { - if (dataZoom.minShowNum > data.Count) count = data.Count; - else count = dataZoom.minShowNum; + if (dataZoom.minShowNum > data.Count) range = data.Count; + else range = dataZoom.minShowNum; } - if (startIndex + count > data.Count) - { - int start = endIndex - count; - filterData = data.GetRange(start < 0 ? 0 : start, count); - } - else filterData = data.GetRange(startIndex, count); + filterData = data.GetRange(start, range); } else { filterData = data; } } - else if (endIndex == 0) + else if (end == 0) { filterData = emptyFliter; } diff --git a/Runtime/Component/Main/Series.cs b/Runtime/Component/Main/Series.cs index 6f945313..24f0a266 100644 --- a/Runtime/Component/Main/Series.cs +++ b/Runtime/Component/Main/Series.cs @@ -228,12 +228,28 @@ namespace XCharts /// 移除指定名字的系列。 /// /// the name of serie - public void Remove(string serieName) + public bool RemoveSerie(string serieName) { var serie = GetSerie(serieName); - if (serie != null) + return RemoveSerie(serie); + } + + public bool RemoveSerie(int serieIndex) + { + var serie = GetSerie(serieIndex); + return RemoveSerie(serie); + } + + public bool RemoveSerie(Serie serie) + { + if (serie != null && m_Series.Remove(serie)) { - m_Series.Remove(serie); + SetVerticesDirty(); + return true; + } + else + { + return false; } } @@ -255,6 +271,16 @@ namespace XCharts /// /// public Serie AddSerie(SerieType type, string serieName, bool show = true, bool addToHead = false) + { + return InsertSerie(-1, type, serieName, show, addToHead); + } + + public Serie InsertSerie(int index, SerieType type, string serieName, bool show = true) + { + return InsertSerie(index, type, serieName, show, false); + } + + private Serie InsertSerie(int index, SerieType type, string serieName, bool show = true, bool addToHead = false) { var serie = new Serie(); serie.type = type; @@ -278,6 +304,7 @@ namespace XCharts } serie.animation.Restart(); if (addToHead) m_Series.Insert(0, serie); + else if (index >= 0) m_Series.Insert(index, serie); else m_Series.Add(serie); for (int i = 0; i < m_Series.Count; i++) { diff --git a/Runtime/Helper/SerieHelper.cs b/Runtime/Helper/SerieHelper.cs index a4c871e1..fb5e5081 100644 --- a/Runtime/Helper/SerieHelper.cs +++ b/Runtime/Helper/SerieHelper.cs @@ -506,38 +506,43 @@ namespace XCharts private static void UpdateFilterData_Category(Serie serie, DataZoom dataZoom) { var data = serie.data; - var startIndex = (int)((data.Count - 1) * dataZoom.start / 100); - var endIndex = (int)((data.Count - 1) * dataZoom.end / 100); - if (endIndex < startIndex) endIndex = startIndex; - - if (startIndex != serie.m_FilterStart || endIndex != serie.m_FilterEnd + var range = Mathf.RoundToInt(data.Count * (dataZoom.end - dataZoom.start) / 100); + if (range <= 0) range = 1; + int start = 0, end = 0; + if (dataZoom.runtimeInvert) + { + end = Mathf.CeilToInt(data.Count * dataZoom.end / 100); + start = end - range; + if (start < 0) start = 0; + } + else + { + start = Mathf.FloorToInt(data.Count * dataZoom.start / 100); + end = start + range; + if (end > data.Count) end = data.Count; + } + if (start != serie.m_FilterStart || end != serie.m_FilterEnd || dataZoom.minShowNum != serie.m_FilterMinShow || serie.m_NeedUpdateFilterData) { - serie.m_FilterStart = startIndex; - serie.m_FilterEnd = endIndex; + serie.m_FilterStart = start; + serie.m_FilterEnd = end; serie.m_FilterMinShow = dataZoom.minShowNum; serie.m_NeedUpdateFilterData = false; - var count = endIndex == startIndex ? 1 : endIndex - startIndex + 1; - if (count < dataZoom.minShowNum) - { - if (dataZoom.minShowNum > data.Count) count = data.Count; - else count = dataZoom.minShowNum; - } if (data.Count > 0) { - if (startIndex + count > data.Count) + if (range < dataZoom.minShowNum) { - int start = endIndex - count; - data = data.GetRange(start < 0 ? 0 : start, count); + if (dataZoom.minShowNum > data.Count) range = data.Count; + else range = dataZoom.minShowNum; } - else serie.m_FilterData = data.GetRange(startIndex, count); + serie.m_FilterData = data.GetRange(start, range); } else { serie.m_FilterData = data; } } - else if (endIndex == 0) + else if (end == 0) { serie.m_FilterData = emptyFilter; } diff --git a/Runtime/Internal/Utility/ChartHelper.cs b/Runtime/Internal/Utility/ChartHelper.cs index 735a155e..a739ae77 100644 --- a/Runtime/Internal/Utility/ChartHelper.cs +++ b/Runtime/Internal/Utility/ChartHelper.cs @@ -1053,5 +1053,10 @@ namespace XCharts return true; } } + + public static bool IsInRect(Vector3 pos, float xMin, float xMax, float yMin, float yMax) + { + return pos.x >= xMin && pos.x <= xMax && pos.y <= yMax && pos.y >= yMin; + } } } \ No newline at end of file