From aebbfaac83ebc78c62b9280356bc6e9360b2a749 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Tue, 30 Mar 2021 20:24:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96`Tooltip`=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E4=B8=8D=E5=90=8C=E7=9A=84=E7=B1=BB=E7=9B=AE?= =?UTF-8?q?=E8=BD=B4=E6=95=B0=E6=8D=AE=20#129?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/XCharts/CHANGELOG-EN.md | 1 + Assets/XCharts/CHANGELOG.md | 1 + .../XCharts/Runtime/Helper/FormatterHelper.cs | 11 ++-- .../Runtime/Internal/CoordinateChart.cs | 50 ++++++++++++++++- .../Runtime/Internal/DrawSerieGauge.cs | 2 +- .../XCharts/Runtime/Internal/DrawSeriePie.cs | 2 +- .../Runtime/Internal/DrawSerieRadar.cs | 3 +- .../XCharts/Runtime/Internal/DrawSerieRing.cs | 2 +- .../Runtime/Internal/Helper/TooltipHelper.cs | 55 ++++++++++--------- Assets/XCharts/Runtime/PolarChart.cs | 2 +- Assets/XCharts/Runtime/ScatterChart.cs | 2 +- 11 files changed, 91 insertions(+), 40 deletions(-) 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); }