diff --git a/Assets/XCharts/CHANGELOG-EN.md b/Assets/XCharts/CHANGELOG-EN.md
index adc84319..ca76212a 100644
--- a/Assets/XCharts/CHANGELOG-EN.md
+++ b/Assets/XCharts/CHANGELOG-EN.md
@@ -32,6 +32,7 @@
## Latest
+* (2021.03.30) Optimized `Tooltip` to support setting different category axis data #129
* (2021.03.29) Optimized the custom draw callback API
* (2021.03.25) Added `Ganttchart`
* (2021.03.22) Added `Theme` `Unbind` button to unbind theme when copying chart #118
diff --git a/Assets/XCharts/CHANGELOG.md b/Assets/XCharts/CHANGELOG.md
index 950d26c0..ad5b91d5 100644
--- a/Assets/XCharts/CHANGELOG.md
+++ b/Assets/XCharts/CHANGELOG.md
@@ -32,6 +32,7 @@
## Latest
+* (2021.03.30) 优化`Tooltip`支持设置不同的类目轴数据 #129
* (2021.03.29) 优化自定义绘制回调接口,增加`onCustomDrawBeforeSerie`、`onCustomDrawAfterSerie`和`onCustomDrawTop`
* (2021.03.25) 增加`GanttChart`甘特图
* (2021.03.22) 增加`Theme`的`Unbind`按钮用于解绑复制图表时的主题 #118
diff --git a/Assets/XCharts/Runtime/Helper/FormatterHelper.cs b/Assets/XCharts/Runtime/Helper/FormatterHelper.cs
index 55e5af88..6d982a61 100644
--- a/Assets/XCharts/Runtime/Helper/FormatterHelper.cs
+++ b/Assets/XCharts/Runtime/Helper/FormatterHelper.cs
@@ -38,8 +38,8 @@ namespace XCharts
/// 选中的类目,一般用在折线图和柱状图
/// dataZoom
///
- public static bool ReplaceContent(ref string content, int dataIndex, string numericFormatter, Serie serie, Series series,
- ChartTheme theme, string category = null, DataZoom dataZoom = null)
+ public static bool ReplaceContent(ref string content, int dataIndex, string numericFormatter, Serie serie,
+ BaseChart chart, DataZoom dataZoom = null)
{
var foundDot = false;
var mc = s_Regex.Matches(content);
@@ -53,7 +53,7 @@ namespace XCharts
char p = GetSerieIndex(args[0].ToString(), ref targetIndex);
if (targetIndex >= 0)
{
- serie = series.GetSerie(targetIndex);
+ serie = chart.series.GetSerie(targetIndex);
if (serie == null) continue;
}
else if (serie != null)
@@ -62,7 +62,7 @@ namespace XCharts
}
else
{
- serie = series.GetSerie(0);
+ serie = chart.series.GetSerie(0);
targetIndex = 0;
}
if (serie == null) continue;
@@ -74,7 +74,7 @@ namespace XCharts
var args1Str = args[1].ToString();
if (s_RegexN.IsMatch(args1Str)) bIndex = int.Parse(args1Str);
}
- content = content.Replace(old, ChartCached.ColorToDotStr(theme.GetColor(bIndex)));
+ content = content.Replace(old, ChartCached.ColorToDotStr(chart.theme.GetColor(bIndex)));
foundDot = true;
}
else if (p == 'a' || p == 'A')
@@ -95,6 +95,7 @@ namespace XCharts
var needCategory = serie.type == SerieType.Line || serie.type == SerieType.Bar;
if (needCategory)
{
+ var category = (chart as CoordinateChart).GetTooltipCategory(dataIndex, serie, dataZoom);
content = content.Replace(old, category);
}
else
diff --git a/Assets/XCharts/Runtime/Internal/CoordinateChart.cs b/Assets/XCharts/Runtime/Internal/CoordinateChart.cs
index 2bf8017c..eeed14f7 100644
--- a/Assets/XCharts/Runtime/Internal/CoordinateChart.cs
+++ b/Assets/XCharts/Runtime/Internal/CoordinateChart.cs
@@ -390,8 +390,7 @@ namespace XCharts
UpdateSerieGridIndex();
RefreshSeriePainterByGridIndex(grid.index);
var category = tempAxis.GetData(index, dataZoom);
- var content = TooltipHelper.GetFormatterContent(tooltip, index, m_Series, m_Theme, category,
- dataZoom, isCartesian);
+ var content = TooltipHelper.GetFormatterContent(tooltip, index, this, dataZoom, isCartesian);
TooltipHelper.SetContentAndPosition(tooltip, content, chartRect);
tooltip.SetActive(true);
@@ -405,6 +404,51 @@ namespace XCharts
}
}
+ internal string GetTooltipCategory(int dataIndex, DataZoom dataZoom = null)
+ {
+ bool isCartesian = IsValue();
+ var index = -1;
+ Axis tempAxis;
+ if (isCartesian)
+ {
+ index = tooltip.runtimeDataIndex[0];
+ tempAxis = m_XAxes[0];
+ }
+ else if (m_XAxes[0].type == Axis.AxisType.Value)
+ {
+ index = (int)tooltip.runtimeYValues[0];
+ tempAxis = m_YAxes[0];
+ }
+ else
+ {
+ index = (int)tooltip.runtimeXValues[0];
+ tempAxis = m_XAxes[0];
+ }
+ return tempAxis.GetData(index, dataZoom);
+ }
+ internal string GetTooltipCategory(int dataIndex, Serie serie, DataZoom dataZoom = null)
+ {
+ bool isCartesian = IsValue();
+ var index = -1;
+ Axis tempAxis;
+ if (isCartesian)
+ {
+ index = tooltip.runtimeDataIndex[0];
+ tempAxis = GetXAxis(serie.xAxisIndex);
+ }
+ else if (m_XAxes[0].type == Axis.AxisType.Value)
+ {
+ index = (int)tooltip.runtimeYValues[0];
+ tempAxis = GetYAxis(serie.yAxisIndex);
+ }
+ else
+ {
+ index = (int)tooltip.runtimeXValues[0];
+ tempAxis = GetXAxis(serie.xAxisIndex);
+ }
+ return tempAxis == null ? "" : tempAxis.GetData(index, dataZoom);
+ }
+
protected void UpdateAxisTooltipLabel(int axisIndex, Axis axis)
{
var showTooltipLabel = axis.show && tooltip.type == Tooltip.Type.Corss;
@@ -608,7 +652,7 @@ namespace XCharts
for (int i = 0; i < m_Series.Count; i++)
{
var serie = m_Series.GetSerie(i);
- if(serie.yAxisIndex != axis.index) continue;
+ if (serie.yAxisIndex != axis.index) continue;
for (int j = serie.data.Count - 1; j >= 0; j--)
{
axis.runtimeData.Add(serie.data[j].name);
diff --git a/Assets/XCharts/Runtime/Internal/DrawSerieGauge.cs b/Assets/XCharts/Runtime/Internal/DrawSerieGauge.cs
index 09ddf457..f9ad376c 100644
--- a/Assets/XCharts/Runtime/Internal/DrawSerieGauge.cs
+++ b/Assets/XCharts/Runtime/Internal/DrawSerieGauge.cs
@@ -400,7 +400,7 @@ namespace XCharts
chart.tooltip.SetActive(false);
return;
}
- var content = TooltipHelper.GetFormatterContent(chart.tooltip, index, chart.series, chart.theme);
+ var content = TooltipHelper.GetFormatterContent(chart.tooltip, index, chart);
TooltipHelper.SetContentAndPosition(chart.tooltip, content.TrimStart(), chart.chartRect);
chart.tooltip.SetActive(true);
}
diff --git a/Assets/XCharts/Runtime/Internal/DrawSeriePie.cs b/Assets/XCharts/Runtime/Internal/DrawSeriePie.cs
index 0abc4900..c6683e8c 100644
--- a/Assets/XCharts/Runtime/Internal/DrawSeriePie.cs
+++ b/Assets/XCharts/Runtime/Internal/DrawSeriePie.cs
@@ -599,7 +599,7 @@ namespace XCharts
int index = chart.tooltip.runtimeDataIndex[serie.index];
if (index < 0) continue;
showTooltip = true;
- var content = TooltipHelper.GetFormatterContent(chart.tooltip, index, chart.series, chart.theme);
+ var content = TooltipHelper.GetFormatterContent(chart.tooltip, index, chart);
TooltipHelper.SetContentAndPosition(chart.tooltip, content.TrimStart(), chart.chartRect);
}
chart.tooltip.SetActive(showTooltip);
diff --git a/Assets/XCharts/Runtime/Internal/DrawSerieRadar.cs b/Assets/XCharts/Runtime/Internal/DrawSerieRadar.cs
index 75b534ff..61712778 100644
--- a/Assets/XCharts/Runtime/Internal/DrawSerieRadar.cs
+++ b/Assets/XCharts/Runtime/Internal/DrawSerieRadar.cs
@@ -740,8 +740,7 @@ namespace XCharts
var serie = chart.series.GetSerie(serieIndex);
var radar = chart.radars[serie.radarIndex];
var dataIndex = chart.tooltip.runtimeDataIndex[1];
- var content = TooltipHelper.GetFormatterContent(chart.tooltip, dataIndex, chart.series, chart.theme,
- null, null, false, radar);
+ var content = TooltipHelper.GetFormatterContent(chart.tooltip, dataIndex, chart, null, false, radar);
TooltipHelper.SetContentAndPosition(chart.tooltip, content, chart.chartRect);
}
diff --git a/Assets/XCharts/Runtime/Internal/DrawSerieRing.cs b/Assets/XCharts/Runtime/Internal/DrawSerieRing.cs
index 21cc9e26..ec5bbc4f 100644
--- a/Assets/XCharts/Runtime/Internal/DrawSerieRing.cs
+++ b/Assets/XCharts/Runtime/Internal/DrawSerieRing.cs
@@ -352,7 +352,7 @@ namespace XCharts
int index = chart.tooltip.runtimeDataIndex[serie.index];
if (index < 0) continue;
showTooltip = true;
- var content = TooltipHelper.GetFormatterContent(chart.tooltip, index, chart.series, chart.theme);
+ var content = TooltipHelper.GetFormatterContent(chart.tooltip, index, chart);
TooltipHelper.SetContentAndPosition(chart.tooltip, content.TrimStart(), chart.chartRect);
}
chart.tooltip.SetActive(showTooltip);
diff --git a/Assets/XCharts/Runtime/Internal/Helper/TooltipHelper.cs b/Assets/XCharts/Runtime/Internal/Helper/TooltipHelper.cs
index 1101bcb5..343024ca 100644
--- a/Assets/XCharts/Runtime/Internal/Helper/TooltipHelper.cs
+++ b/Assets/XCharts/Runtime/Internal/Helper/TooltipHelper.cs
@@ -233,7 +233,7 @@ namespace XCharts
}
private static void InitGanttTooltip(ref StringBuilder sb, Tooltip tooltip, Serie serie, int index,
- ChartTheme theme, string category)
+ ChartTheme theme)
{
//if (tooltip.runtimeGridIndex >= 0) return;
//if (serie.index != index || serie.type != SerieType.Gantt) return;
@@ -241,7 +241,7 @@ namespace XCharts
}
private static void InitDefaultContent(ref StringBuilder sb, Tooltip tooltip, Serie serie, int index,
- string category, ChartTheme theme = null, DataZoom dataZoom = null, bool isCartesian = false,
+ ChartTheme theme = null, DataZoom dataZoom = null, bool isCartesian = false,
Radar radar = null)
{
switch (serie.type)
@@ -270,7 +270,7 @@ namespace XCharts
InitGaugeTooltip(ref sb, tooltip, serie, index, theme);
break;
case SerieType.Gantt:
- InitGanttTooltip(ref sb, tooltip, serie, index, theme, category);
+ InitGanttTooltip(ref sb, tooltip, serie, index, theme);
break;
}
}
@@ -290,7 +290,7 @@ namespace XCharts
tooltip.UpdateContentPos(pos);
}
- public static string GetPolarFormatterContent(Tooltip tooltip, Series series, ChartTheme theme, AngleAxis angleAxis)
+ public static string GetPolarFormatterContent(Tooltip tooltip, BaseChart chart, AngleAxis angleAxis)
{
if (string.IsNullOrEmpty(tooltip.formatter))
{
@@ -308,13 +308,13 @@ namespace XCharts
var angle = angleAxis.clockwise ? tooltip.runtimeAngle : 360 - tooltip.runtimeAngle;
title = ChartCached.FloatToStr(angle);
}
- foreach (var serie in series.list)
+ foreach (var serie in chart.series.list)
{
if (serie.show && IsSelectedSerie(tooltip, serie.index))
{
if (formatTitle)
{
- FormatterHelper.ReplaceContent(ref title, 0, tooltip.numericFormatter, serie, series, theme, null, null);
+ FormatterHelper.ReplaceContent(ref title, 0, tooltip.numericFormatter, serie, chart, null);
}
var dataIndexList = tooltip.runtimeSerieIndex[serie.index];
@@ -328,7 +328,7 @@ namespace XCharts
serie.GetXYData(dataIndex, null, out xValue, out yValue);
if (string.IsNullOrEmpty(itemFormatter))
{
- sb.Append("● ");
+ sb.Append("● ");
if (!string.IsNullOrEmpty(serie.name))
sb.Append(serie.name).Append(": ");
sb.AppendFormat("{0}", ChartCached.FloatToStr(xValue, numericFormatter));
@@ -340,9 +340,10 @@ namespace XCharts
else
{
string content = itemFormatter;
- FormatterHelper.ReplaceContent(ref content, dataIndex, tooltip.numericFormatter, serie, series, theme, null, null);
- var dotColorIndex = serie.type == SerieType.Pie || serie.type == SerieType.Radar || serie.type == SerieType.Ring ? dataIndex : serie.index;
- sb.Append(ChartCached.ColorToDotStr(theme.GetColor(dotColorIndex)));
+ FormatterHelper.ReplaceContent(ref content, dataIndex, tooltip.numericFormatter, serie, chart, null);
+ var dotColorIndex = serie.type == SerieType.Pie || serie.type == SerieType.Radar
+ || serie.type == SerieType.Ring ? dataIndex : serie.index;
+ sb.Append(ChartCached.ColorToDotStr(chart.theme.GetColor(dotColorIndex)));
sb.Append(content);
}
}
@@ -362,13 +363,13 @@ namespace XCharts
else
{
string content = tooltip.formatter;
- FormatterHelper.ReplaceContent(ref content, 0, tooltip.numericFormatter, null, series, theme, null, null);
+ FormatterHelper.ReplaceContent(ref content, 0, tooltip.numericFormatter, null, chart, null);
return content;
}
}
- public static string GetFormatterContent(Tooltip tooltip, int dataIndex, Series series, ChartTheme theme,
- string category = null, DataZoom dataZoom = null, bool isCartesian = false, Radar radar = null)
+ public static string GetFormatterContent(Tooltip tooltip, int dataIndex, BaseChart chart, DataZoom dataZoom = null,
+ bool isCartesian = false, Radar radar = null)
{
if (string.IsNullOrEmpty(tooltip.formatter))
{
@@ -386,9 +387,9 @@ namespace XCharts
formatTitle = false;
titleIsIgnroe = true;
}
- for (int i = 0; i < series.Count; i++)
+ for (int i = 0; i < chart.series.Count; i++)
{
- var serie = series.GetSerie(i);
+ var serie = chart.series.GetSerie(i);
if (tooltip.runtimeGridIndex >= 0 && serie.runtimeGridIndex != tooltip.runtimeGridIndex) continue;
if (serie.type == SerieType.Scatter || serie.type == SerieType.EffectScatter)
{
@@ -399,24 +400,24 @@ namespace XCharts
if (string.IsNullOrEmpty(itemFormatter))
{
if (!first) sb.Append(FormatterHelper.PH_NN);
- InitDefaultContent(ref sb, tooltip, serie, dataIndex, category, theme, dataZoom, isCartesian, radar);
+ InitDefaultContent(ref sb, tooltip, serie, dataIndex, chart.theme, dataZoom, isCartesian, radar);
first = false;
continue;
}
var itemTitle = title;
if (!string.IsNullOrEmpty(itemTitle))
{
- FormatterHelper.ReplaceContent(ref itemTitle, dataIndex, tooltip.numericFormatter, serie, series, theme, category, dataZoom);
+ FormatterHelper.ReplaceContent(ref itemTitle, dataIndex, tooltip.numericFormatter, serie, chart, dataZoom);
sb.Append(itemTitle).Append(FormatterHelper.PH_NN);
}
var dataIndexList = tooltip.runtimeSerieIndex[serie.index];
foreach (var tempIndex in dataIndexList)
{
string content = itemFormatter;
- var foundDot = FormatterHelper.ReplaceContent(ref content, tempIndex, tooltip.numericFormatter, serie, series, theme, category, dataZoom);
+ var foundDot = FormatterHelper.ReplaceContent(ref content, tempIndex, tooltip.numericFormatter, serie, chart, dataZoom);
if (!foundDot)
{
- sb.Append(ChartCached.ColorToDotStr(theme.GetColor(serie.index)));
+ sb.Append(ChartCached.ColorToDotStr(chart.theme.GetColor(serie.index)));
}
sb.Append(content).Append(FormatterHelper.PH_NN);
}
@@ -440,22 +441,23 @@ namespace XCharts
needCategory = needCategory || (serie.type == SerieType.Line || serie.type == SerieType.Bar);
if (formatTitle)
{
- FormatterHelper.ReplaceContent(ref title, dataIndex, tooltip.numericFormatter, serie, series, theme, category, dataZoom);
+ FormatterHelper.ReplaceContent(ref title, dataIndex, tooltip.numericFormatter, serie, chart, dataZoom);
}
if (serie.show)
{
if (string.IsNullOrEmpty(itemFormatter) || serie.type == SerieType.Radar)
{
if (!first) sb.Append(FormatterHelper.PH_NN);
- InitDefaultContent(ref sb, tooltip, serie, dataIndex, category, theme, dataZoom, isCartesian, radar);
+ InitDefaultContent(ref sb, tooltip, serie, dataIndex, chart.theme, dataZoom, isCartesian, radar);
first = false;
continue;
}
string content = itemFormatter;
- FormatterHelper.ReplaceContent(ref content, dataIndex, tooltip.numericFormatter, serie, series, theme, category, dataZoom);
+ FormatterHelper.ReplaceContent(ref content, dataIndex, tooltip.numericFormatter, serie, chart, dataZoom);
if (!first) sb.Append(FormatterHelper.PH_NN);
- var dotColorIndex = serie.type == SerieType.Pie || serie.type == SerieType.Radar || serie.type == SerieType.Ring ? dataIndex : i;
- sb.Append(ChartCached.ColorToDotStr(theme.GetColor(dotColorIndex)));
+ var dotColorIndex = serie.type == SerieType.Pie || serie.type == SerieType.Radar
+ || serie.type == SerieType.Ring ? dataIndex : i;
+ sb.Append(ChartCached.ColorToDotStr(chart.theme.GetColor(dotColorIndex)));
sb.Append(content);
first = false;
}
@@ -468,7 +470,10 @@ namespace XCharts
else if (string.IsNullOrEmpty(title))
{
if (needCategory && !titleIsIgnroe)
+ {
+ var category = (chart as CoordinateChart).GetTooltipCategory(dataIndex, dataZoom);
return category + FormatterHelper.PH_NN + FormatterHelper.TrimAndReplaceLine(sb);
+ }
else
return FormatterHelper.TrimAndReplaceLine(sb);
}
@@ -481,7 +486,7 @@ namespace XCharts
else
{
string content = tooltip.formatter;
- FormatterHelper.ReplaceContent(ref content, dataIndex, tooltip.numericFormatter, null, series, theme, category, dataZoom);
+ FormatterHelper.ReplaceContent(ref content, dataIndex, tooltip.numericFormatter, null, chart, dataZoom);
return content;
}
}
diff --git a/Assets/XCharts/Runtime/PolarChart.cs b/Assets/XCharts/Runtime/PolarChart.cs
index 4836b06d..d3eda0e6 100644
--- a/Assets/XCharts/Runtime/PolarChart.cs
+++ b/Assets/XCharts/Runtime/PolarChart.cs
@@ -676,7 +676,7 @@ namespace XCharts
if (showTooltip)
{
var m_AngleAxis = GetAngleAxis(tooltip.runtimePolarIndex);
- var content = TooltipHelper.GetPolarFormatterContent(tooltip, m_Series, m_Theme, m_AngleAxis);
+ var content = TooltipHelper.GetPolarFormatterContent(tooltip, this, m_AngleAxis);
TooltipHelper.SetContentAndPosition(tooltip, content, chartRect);
UdpateTooltipLabel();
}
diff --git a/Assets/XCharts/Runtime/ScatterChart.cs b/Assets/XCharts/Runtime/ScatterChart.cs
index 343bfc93..20f41107 100644
--- a/Assets/XCharts/Runtime/ScatterChart.cs
+++ b/Assets/XCharts/Runtime/ScatterChart.cs
@@ -108,7 +108,7 @@ namespace XCharts
base.UpdateTooltip();
if (tooltip.isAnySerieDataIndex())
{
- var content = TooltipHelper.GetFormatterContent(tooltip, 0, m_Series, m_Theme);
+ var content = TooltipHelper.GetFormatterContent(tooltip, 0, this);
TooltipHelper.SetContentAndPosition(tooltip, content, chartRect);
tooltip.SetActive(true);
}