[optimize] tooltip

This commit is contained in:
monitor1394
2022-04-09 11:03:41 +08:00
parent e4fac71987
commit e2b0c935e0
4 changed files with 81 additions and 64 deletions

View File

@@ -207,38 +207,34 @@ namespace XCharts.Runtime
if (serie is INeedSerieContainer if (serie is INeedSerieContainer
&& (serie as INeedSerieContainer).containterInstanceId == component.instanceId) && (serie as INeedSerieContainer).containterInstanceId == component.instanceId)
{ {
if (tooltip.IsTriggerAxis()) var isTriggerAxis = tooltip.IsTriggerAxis();
if (container is GridCoord)
{ {
if (container is GridCoord) var xAxis = chart.GetChartComponent<XAxis>(serie.xAxisIndex);
{ var yAxis = chart.GetChartComponent<YAxis>(serie.yAxisIndex);
var xAxis = chart.GetChartComponent<XAxis>(serie.xAxisIndex); serie.context.pointerEnter = true;
var yAxis = chart.GetChartComponent<YAxis>(serie.yAxisIndex); UpdateAxisPointerDataIndex(serie, xAxis, yAxis, container as GridCoord, isTriggerAxis);
serie.context.pointerEnter = true;
UpdateAxisPointerDataIndex(serie, xAxis, yAxis, container as GridCoord);
}
else if (container is PolarCoord)
{
var m_AngleAxis = ComponentHelper.GetAngleAxis(chart.components, container.index);
tooltip.context.angle = (float)m_AngleAxis.context.pointerValue;
}
list.Add(serie);
} }
else if (serie.context.pointerEnter) else if (container is PolarCoord)
{ {
list.Add(serie); var m_AngleAxis = ComponentHelper.GetAngleAxis(chart.components, container.index);
return component as ISerieContainer; tooltip.context.angle = (float)m_AngleAxis.context.pointerValue;
} }
list.Add(serie);
if (!isTriggerAxis)
chart.RefreshTopPainter();
} }
} }
return component as ISerieContainer; return container;
} }
} }
} }
return null; return null;
} }
private void UpdateAxisPointerDataIndex(Serie serie, XAxis xAxis, YAxis yAxis, GridCoord grid) private void UpdateAxisPointerDataIndex(Serie serie, XAxis xAxis, YAxis yAxis, GridCoord grid, bool isTriggerAxis)
{ {
serie.context.pointerAxisDataIndexs.Clear(); serie.context.pointerAxisDataIndexs.Clear();
if (yAxis.IsCategory()) if (yAxis.IsCategory())
{ {
@@ -247,7 +243,10 @@ namespace XCharts.Runtime
} }
else if (yAxis.IsTime()) else if (yAxis.IsTime())
{ {
GetSerieDataIndexByValue(serie, yAxis, grid); if (isTriggerAxis)
GetSerieDataIndexByAxis(serie, yAxis, grid);
else
GetSerieDataIndexByItem(serie, yAxis, grid);
} }
else if (xAxis.IsCategory()) else if (xAxis.IsCategory())
{ {
@@ -256,11 +255,14 @@ namespace XCharts.Runtime
} }
else else
{ {
GetSerieDataIndexByValue(serie, xAxis, grid); if (isTriggerAxis)
GetSerieDataIndexByAxis(serie, xAxis, grid);
else
GetSerieDataIndexByItem(serie, xAxis, grid);
} }
} }
private void GetSerieDataIndexByValue(Serie serie, Axis axis, GridCoord grid, int dimension = 0) private void GetSerieDataIndexByAxis(Serie serie, Axis axis, GridCoord grid, int dimension = 0)
{ {
var currValue = 0d; var currValue = 0d;
var lastValue = 0d; var lastValue = 0d;
@@ -269,62 +271,77 @@ namespace XCharts.Runtime
var isTimeAxis = axis.IsTime(); var isTimeAxis = axis.IsTime();
var dataCount = serie.dataCount; var dataCount = serie.dataCount;
var themeSymbolSize = chart.theme.serie.scatterSymbolSize; var themeSymbolSize = chart.theme.serie.scatterSymbolSize;
var data = serie.data;
if (!isTimeAxis)
{
serie.context.sortedData.Clear();
for (int i = 0; i < dataCount; i++)
{
var serieData = serie.data[i];
serieData.index = i;
serie.context.sortedData.Add(serieData);
}
serie.context.sortedData.Sort(delegate (SerieData a, SerieData b)
{
return a.GetData(dimension).CompareTo(b.GetData(dimension));
});
data = serie.context.sortedData;
}
serie.context.pointerAxisDataIndexs.Clear(); serie.context.pointerAxisDataIndexs.Clear();
var axisValueDistance = axis.GetDistance(axisValue, grid.context.width);
for (int i = 0; i < dataCount; i++) for (int i = 0; i < dataCount; i++)
{ {
var serieData = serie.data[i]; var serieData = data[i];
currValue = serieData.GetData(dimension); currValue = serieData.GetData(dimension);
if (isTimeAxis) if (i == 0)
{ {
if (i == 0) nextValue = data[i + 1].GetData(dimension);
if (axisValue <= currValue + (nextValue - currValue) / 2)
{ {
nextValue = serie.GetSerieData(i + 1).GetData(dimension); serie.context.pointerAxisDataIndexs.Add(serieData.index);
if (axisValue <= currValue + (nextValue - currValue) / 2) break;
{
serie.context.pointerAxisDataIndexs.Add(i);
break;
}
} }
else if (i == dataCount - 1) }
else if (i == dataCount - 1)
{
if (axisValue > lastValue + (currValue - lastValue) / 2)
{ {
if (axisValue > lastValue + (currValue - lastValue) / 2) serie.context.pointerAxisDataIndexs.Add(serieData.index);
{ break;
serie.context.pointerAxisDataIndexs.Add(i);
break;
}
} }
else
{
nextValue = serie.GetSerieData(i + 1).GetData(dimension);
if (axisValue > (currValue - (currValue - lastValue) / 2) && axisValue <= currValue + (nextValue - currValue) / 2)
{
serie.context.pointerAxisDataIndexs.Add(i);
break;
}
}
lastValue = currValue;
} }
else else
{ {
var symbol = SerieHelper.GetSerieSymbol(serie, serieData); nextValue = data[i + 1].GetData(dimension);
var symbolSize = symbol.GetSize(serieData.data, themeSymbolSize); if (axisValue > (currValue - (currValue - lastValue) / 2) && axisValue <= currValue + (nextValue - currValue) / 2)
var dist = axis.GetDistance(currValue, grid.context.width) - axisValueDistance;
if (System.Math.Abs(dist) <= symbolSize)
{ {
serie.context.pointerAxisDataIndexs.Add(i); serie.context.pointerAxisDataIndexs.Add(serieData.index);
serieData.context.highlight = true; break;
}
else
{
serieData.context.highlight = false;
} }
} }
lastValue = currValue;
} }
if (serie.context.pointerAxisDataIndexs.Count > 0) if (serie.context.pointerAxisDataIndexs.Count > 0)
{ {
var index = serie.context.pointerAxisDataIndexs[0]; var index = serie.context.pointerAxisDataIndexs[0];
axis.context.axisTooltipValue = serie.GetSerieData(index).GetData(0); serie.context.pointerItemDataIndex = index;
axis.context.axisTooltipValue = serie.GetSerieData(index).GetData(dimension);
}
else
{
serie.context.pointerItemDataIndex = -1;
axis.context.axisTooltipValue = 0;
}
}
private void GetSerieDataIndexByItem(Serie serie, Axis axis, GridCoord grid, int dimension = 0)
{
if (serie.context.pointerItemDataIndex >= 0)
{
axis.context.axisTooltipValue = serie.GetSerieData(serie.context.pointerItemDataIndex).GetData(dimension);
}
else if (component.type == Tooltip.Type.Corss)
{
axis.context.axisTooltipValue = axis.context.pointerValue;
} }
else else
{ {
@@ -389,7 +406,6 @@ namespace XCharts.Runtime
serie.context.isTriggerByAxis = isTriggerByAxis; serie.context.isTriggerByAxis = isTriggerByAxis;
if (isTriggerByAxis && dataIndex >= 0) if (isTriggerByAxis && dataIndex >= 0)
serie.context.pointerItemDataIndex = dataIndex; serie.context.pointerItemDataIndex = dataIndex;
serie.handler.UpdateTooltipSerieParams(dataIndex, showCategory, category, serie.handler.UpdateTooltipSerieParams(dataIndex, showCategory, category,
tooltip.marker, tooltip.itemFormatter, tooltip.numericFormatter, tooltip.marker, tooltip.itemFormatter, tooltip.numericFormatter,
ref tooltip.context.data.param, ref tooltip.context.data.param,
@@ -475,7 +491,6 @@ namespace XCharts.Runtime
pX += xAxis.IsCategory() pX += xAxis.IsCategory()
? (float)(xAxis.context.pointerValue * splitWidth + (xAxis.boundaryGap ? splitWidth / 2 : 0)) ? (float)(xAxis.context.pointerValue * splitWidth + (xAxis.boundaryGap ? splitWidth / 2 : 0))
: xAxis.GetDistance(xAxis.context.axisTooltipValue, grid.context.width); : xAxis.GetDistance(xAxis.context.axisTooltipValue, grid.context.width);
//if (xAxis.IsValue()) pX = chart.pointerPos.x;
Vector2 sp = new Vector2(pX, grid.context.y); Vector2 sp = new Vector2(pX, grid.context.y);
Vector2 ep = new Vector2(pX, grid.context.y + grid.context.height); Vector2 ep = new Vector2(pX, grid.context.y + grid.context.height);
var lineColor = TooltipHelper.GetLineColor(tooltip, chart.theme); var lineColor = TooltipHelper.GetLineColor(tooltip, chart.theme);

View File

@@ -12,6 +12,7 @@ namespace XCharts.Runtime
public virtual bool vertsDirty { get { return m_VertsDirty; } } public virtual bool vertsDirty { get { return m_VertsDirty; } }
public virtual bool componentDirty { get { return m_ComponentDirty; } } public virtual bool componentDirty { get { return m_ComponentDirty; } }
public virtual bool useDataNameForColor { get { return false; } } public virtual bool useDataNameForColor { get { return false; } }
public virtual bool useSortData { get { return false; } }
public bool anyDirty { get { return vertsDirty || componentDirty; } } public bool anyDirty { get { return vertsDirty || componentDirty; } }
public Painter painter { get { return m_Painter; } set { m_Painter = value; } } public Painter painter { get { return m_Painter; } set { m_Painter = value; } }
public Action refreshComponent { get; set; } public Action refreshComponent { get; set; }

View File

@@ -93,13 +93,14 @@ namespace XCharts.Runtime
{ {
serie.context.pointerItemDataIndex = -1; serie.context.pointerItemDataIndex = -1;
serie.context.pointerEnter = false; serie.context.pointerEnter = false;
foreach (var serieData in serie.data) for (int i = 0; i < serie.dataCount; i++)
{ {
var serieData = serie.data[i];
serieData.index = i;
var dist = Vector3.Distance(chart.pointerPos, serieData.context.position); var dist = Vector3.Distance(chart.pointerPos, serieData.context.position);
var symbol = SerieHelper.GetSerieSymbol(serie, serieData); var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
var symbolSize = symbol.GetSize(serieData.data, themeSymbolSize); var symbolSize = symbol.GetSize(serieData.data, themeSymbolSize);
var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize); var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize);
if (dist <= symbolSelectedSize) if (dist <= symbolSelectedSize)
{ {
serie.context.pointerItemDataIndex = serieData.index; serie.context.pointerItemDataIndex = serieData.index;

View File

@@ -1430,7 +1430,7 @@ namespace XCharts.Runtime
} }
else else
{ {
return context.sortedData.Count > 0 ? context.sortedData : m_Data; return useSortData && context.sortedData.Count > 0 ? context.sortedData : m_Data;
} }
} }