mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-29 12:48:47 +00:00
[optimize] tooltip
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user