Files
XCharts/Runtime/Serie/Heatmap/HeatmapHandler.cs

236 lines
9.5 KiB
C#
Raw Normal View History

2021-12-19 20:53:55 +08:00
using System.Collections.Generic;
2019-10-14 07:45:56 +08:00
using UnityEngine;
using UnityEngine.UI;
2021-01-11 08:54:28 +08:00
using XUGL;
2019-10-14 07:45:56 +08:00
2022-02-19 22:37:57 +08:00
namespace XCharts.Runtime
2019-10-14 07:45:56 +08:00
{
2021-11-23 13:20:07 +08:00
[UnityEngine.Scripting.Preserve]
internal sealed class HeatmapHandler : SerieHandler<Heatmap>
2019-10-14 07:45:56 +08:00
{
2022-01-22 21:08:26 +08:00
private GridCoord m_SerieGrid;
public override int defaultDimension { get { return 2; } }
2021-11-23 13:20:07 +08:00
public override void Update()
{
base.Update();
UpdateSerieContext();
}
public override void DrawSerie(VertexHelper vh)
{
2022-05-05 13:10:04 +08:00
DrawHeatmapSerie(vh, serie);
2021-11-23 13:20:07 +08:00
}
2021-12-19 20:53:55 +08:00
public override void UpdateTooltipSerieParams(int dataIndex, bool showCategory, string category,
string marker, string itemFormatter, string numericFormatter,
ref List<SerieParams> paramList, ref string title)
{
dataIndex = serie.context.pointerItemDataIndex;
if (dataIndex < 0)
return;
var serieData = serie.GetSerieData(dataIndex);
if (serieData == null)
return;
2022-01-22 21:08:26 +08:00
if (string.IsNullOrEmpty(category))
{
var xAxis = chart.GetChartComponent<XAxis>(serie.xAxisIndex);
if (xAxis != null)
category = xAxis.GetData((int)serieData.GetData(0));
}
2021-12-19 20:53:55 +08:00
title = serie.serieName;
var param = serie.context.param;
param.serieName = serie.serieName;
param.serieIndex = serie.index;
2022-01-22 21:08:26 +08:00
param.dimension = defaultDimension;
2021-12-19 20:53:55 +08:00
param.serieData = serieData;
2022-01-22 21:08:26 +08:00
param.color = serieData.context.color;
2021-12-19 20:53:55 +08:00
param.marker = SerieHelper.GetItemMarker(serie, serieData, marker);
param.itemFormatter = SerieHelper.GetItemFormatter(serie, serieData, itemFormatter);
param.numericFormatter = SerieHelper.GetNumericFormatter(serie, serieData, numericFormatter);
param.columns.Clear();
param.columns.Add(param.marker);
param.columns.Add(category);
2022-01-22 21:08:26 +08:00
param.columns.Add(ChartCached.NumberToStr(serieData.GetData(defaultDimension), param.numericFormatter));
2021-12-19 20:53:55 +08:00
paramList.Add(param);
}
2021-11-23 13:20:07 +08:00
private void UpdateSerieContext()
{
2022-01-22 21:08:26 +08:00
if (m_SerieGrid == null)
2021-12-19 20:53:55 +08:00
return;
2022-01-22 21:08:26 +08:00
var needCheck = (chart.isPointerInChart && m_SerieGrid.IsPointerEnter()) || m_LegendEnter;
var needInteract = false;
if (!needCheck)
{
if (m_LastCheckContextFlag != needCheck)
{
m_LastCheckContextFlag = needCheck;
serie.context.pointerItemDataIndex = -1;
serie.context.pointerEnter = false;
foreach (var serieData in serie.data)
{
serieData.context.highlight = false;
}
chart.RefreshPainter(serie);
}
2021-12-19 20:53:55 +08:00
return;
2022-01-22 21:08:26 +08:00
}
m_LastCheckContextFlag = needCheck;
if (m_LegendEnter)
2021-11-23 13:20:07 +08:00
{
2022-01-22 21:08:26 +08:00
serie.context.pointerEnter = true;
foreach (var serieData in serie.data)
2021-11-23 13:20:07 +08:00
{
2021-12-11 18:26:28 +08:00
serieData.context.highlight = true;
2021-11-23 13:20:07 +08:00
}
2022-01-22 21:08:26 +08:00
}
else
{
serie.context.pointerItemDataIndex = -1;
serie.context.pointerEnter = false;
foreach (var serieData in serie.data)
2021-11-23 13:20:07 +08:00
{
2022-01-22 21:08:26 +08:00
if (!needInteract && serieData.context.rect.Contains(chart.pointerPos))
{
serie.context.pointerItemDataIndex = serieData.index;
serie.context.pointerEnter = true;
serieData.context.highlight = true;
needInteract = true;
}
else
{
serieData.context.highlight = false;
}
2021-11-23 13:20:07 +08:00
}
}
2022-01-22 21:08:26 +08:00
if (needInteract)
{
chart.RefreshPainter(serie);
}
2021-11-23 13:20:07 +08:00
}
2022-05-05 13:10:04 +08:00
private void DrawHeatmapSerie(VertexHelper vh, Heatmap serie)
2019-10-14 07:45:56 +08:00
{
if (serie.animation.HasFadeOut()) return;
2021-11-23 13:20:07 +08:00
XAxis xAxis;
YAxis yAxis;
if (!chart.TryGetChartComponent<XAxis>(out xAxis, serie.xAxisIndex)) return;
if (!chart.TryGetChartComponent<YAxis>(out yAxis, serie.yAxisIndex)) return;
2022-01-22 21:08:26 +08:00
m_SerieGrid = chart.GetChartComponent<GridCoord>(xAxis.gridIndex);
xAxis.boundaryGap = true;
yAxis.boundaryGap = true;
2021-11-23 13:20:07 +08:00
var visualMap = chart.GetVisualMapOfSerie(serie);
2021-12-28 08:18:24 +08:00
var emphasis = serie.emphasis;
2019-10-14 07:45:56 +08:00
var xCount = xAxis.data.Count;
var yCount = yAxis.data.Count;
2022-01-22 21:08:26 +08:00
var xWidth = m_SerieGrid.context.width / xCount;
var yWidth = m_SerieGrid.context.height / yCount;
2019-10-14 07:45:56 +08:00
2022-01-22 21:08:26 +08:00
var zeroX = m_SerieGrid.context.x;
var zeroY = m_SerieGrid.context.y;
2021-01-11 08:54:28 +08:00
var rangeMin = visualMap.rangeMin;
var rangeMax = visualMap.rangeMax;
2021-11-23 13:20:07 +08:00
var color = chart.theme.GetColor(serie.index);
2019-10-14 07:45:56 +08:00
var borderWidth = serie.itemStyle.show ? serie.itemStyle.borderWidth : 0;
2021-11-23 13:20:07 +08:00
var rectWid = xWidth - 2 * borderWidth;
var rectHig = yWidth - 2 * borderWidth;
2022-01-22 21:08:26 +08:00
var borderColor = serie.itemStyle.opacity > 0
? serie.itemStyle.borderColor
: ChartConst.clearColor32;
borderColor.a = (byte)(borderColor.a * serie.itemStyle.opacity);
2022-01-22 21:08:26 +08:00
var borderToColor = serie.itemStyle.opacity > 0
? serie.itemStyle.borderToColor
: ChartConst.clearColor32;
borderToColor.a = (byte)(borderToColor.a * serie.itemStyle.opacity);
2022-01-22 21:08:26 +08:00
2021-12-08 13:36:02 +08:00
serie.context.dataPoints.Clear();
2021-12-12 18:05:26 +08:00
serie.animation.InitProgress(0, xCount);
var animationIndex = serie.animation.GetCurrIndex();
var dataChangeDuration = serie.animation.GetUpdateAnimationDuration();
2019-12-03 07:49:37 +08:00
var dataChanging = false;
2022-01-22 21:08:26 +08:00
serie.containerIndex = m_SerieGrid.index;
serie.containterInstanceId = m_SerieGrid.instanceId;
for (int n = 0; n < serie.dataCount; n++)
2019-10-14 07:45:56 +08:00
{
2022-01-22 21:08:26 +08:00
var serieData = serie.data[n];
serieData.index = n;
var i = (int)serieData.GetData(0);
var j = (int)serieData.GetData(1);
var dimension = VisualMapHelper.GetDimension(visualMap, serieData.data.Count);
if (serie.IsIgnoreValue(serieData, dimension))
2019-10-14 07:45:56 +08:00
{
2022-01-22 21:08:26 +08:00
serie.context.dataPoints.Add(Vector3.zero);
continue;
2019-10-14 07:45:56 +08:00
}
2022-01-22 21:08:26 +08:00
var value = serieData.GetCurrData(dimension, dataChangeDuration, yAxis.inverse,
yAxis.context.minValue, yAxis.context.maxValue);
if (serieData.IsDataChanged()) dataChanging = true;
var pos = new Vector3(zeroX + (i + (xAxis.boundaryGap ? 0.5f : 0)) * xWidth,
zeroY + (j + (yAxis.boundaryGap ? 0.5f : 0)) * yWidth);
serie.context.dataPoints.Add(pos);
serieData.context.position = pos;
serieData.context.canShowLabel = false;
serieData.context.rect = new Rect(pos.x - rectWid / 2, pos.y - rectHig / 2, rectWid, rectHig);
if (value == 0) continue;
if ((value < rangeMin && rangeMin != visualMap.min)
|| (value > rangeMax && rangeMax != visualMap.max))
{
continue;
}
if (!visualMap.IsInSelectedValue(value)) continue;
if (animationIndex >= 0 && i > animationIndex) continue;
color = visualMap.GetColor(value);
if (serieData.context.highlight)
color = ChartHelper.GetHighlightColor(color);
serieData.context.canShowLabel = true;
serieData.context.color = color;
var highlight = (serieData.context.highlight)
|| visualMap.context.pointerIndex > 0;
//UGL.DrawRectangle(vh, pos, rectWid / 2, rectHig / 2, color);
UGL.DrawRectangle(vh, serieData.context.rect, color);
if (borderWidth > 0 && !ChartHelper.IsClearColor(borderColor))
{
UGL.DrawBorder(vh, pos, rectWid, rectHig, borderWidth, borderColor, borderToColor);
}
if (visualMap.hoverLink && highlight && emphasis != null && emphasis.show
&& emphasis.itemStyle.borderWidth > 0)
{
var emphasisBorderWidth = emphasis.itemStyle.borderWidth;
var emphasisBorderColor = emphasis.itemStyle.opacity > 0
? emphasis.itemStyle.borderColor : ChartConst.clearColor32;
var emphasisBorderToColor = emphasis.itemStyle.opacity > 0
? emphasis.itemStyle.borderToColor : ChartConst.clearColor32;
UGL.DrawBorder(vh, pos, rectWid, rectHig, emphasisBorderWidth, emphasisBorderColor,
emphasisBorderToColor);
}
2019-10-14 07:45:56 +08:00
}
if (!serie.animation.IsFinish())
{
serie.animation.CheckProgress(xCount);
2021-11-23 13:20:07 +08:00
chart.RefreshPainter(serie);
}
2019-12-03 07:49:37 +08:00
if (dataChanging)
{
2021-11-23 13:20:07 +08:00
chart.RefreshPainter(serie);
2019-12-03 07:49:37 +08:00
}
2019-10-14 07:45:56 +08:00
}
}
}