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