123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.UI;
-
- namespace XCharts.Runtime
- {
- /// <summary>
- /// For grid coord
- /// </summary>
- [UnityEngine.Scripting.Preserve]
- internal sealed class SimplifiedLineHandler : SerieHandler<SimplifiedLine>
- {
- private GridCoord m_SerieGrid;
-
- public override void Update()
- {
- base.Update();
- UpdateSerieContext();
- }
-
- public override void UpdateTooltipSerieParams(int dataIndex, bool showCategory, string category,
- string marker, string itemFormatter, string numericFormatter, string ignoreDataDefaultContent,
- ref List<SerieParams> paramList, ref string title)
- {
- UpdateCoordSerieParams(ref paramList, ref title, dataIndex, showCategory, category,
- marker, itemFormatter, numericFormatter, ignoreDataDefaultContent);
- }
-
- public override void DrawSerie(VertexHelper vh)
- {
- DrawLineSerie(vh, serie);
- }
-
- private void UpdateSerieContext()
- {
- if (m_SerieGrid == null)
- return;
-
- var needCheck = (chart.isPointerInChart && m_SerieGrid.IsPointerEnter()) || m_LegendEnter;
- var lineWidth = 0f;
- if (!needCheck)
- {
- if (m_LastCheckContextFlag != needCheck)
- {
- var needAnimation1 = false;
- lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
- m_LastCheckContextFlag = needCheck;
- serie.context.pointerItemDataIndex = -1;
- serie.context.pointerEnter = false;
- serie.interact.SetValue(ref needAnimation1, lineWidth, false);
- foreach (var serieData in serie.data)
- {
- var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
- var symbolSize = symbol.GetSize(serieData.data, chart.theme.serie.lineSymbolSize);
- serieData.context.highlight = false;
- serieData.interact.SetValue(ref needAnimation1, symbolSize);
- }
- if (needAnimation1)
- {
- if (SeriesHelper.IsStack(chart.series))
- chart.RefreshTopPainter();
- else
- chart.RefreshPainter(serie);
- }
- }
- return;
- }
- m_LastCheckContextFlag = needCheck;
- var themeSymbolSize = chart.theme.serie.lineSymbolSize;
- var themeSymbolSelectedSize = chart.theme.serie.lineSymbolSelectedSize;
- lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
-
- var needInteract = false;
- if (m_LegendEnter)
- {
- serie.context.pointerEnter = true;
- serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate);
- for (int i = 0; i < serie.dataCount; i++)
- {
- var serieData = serie.data[i];
- var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, SerieState.Emphasis);
- serieData.context.highlight = true;
- serieData.interact.SetValue(ref needInteract, size);
- }
- }
- else if (serie.context.isTriggerByAxis)
- {
- serie.context.pointerEnter = true;
- serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate);
- for (int i = 0; i < serie.dataCount; i++)
- {
- var serieData = serie.data[i];
- var highlight = i == serie.context.pointerItemDataIndex;
- serieData.context.highlight = highlight;
- var state = SerieHelper.GetSerieState(serie, serieData, true);
- var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, state);
- serieData.interact.SetValue(ref needInteract, size);
- if (highlight)
- {
- serie.context.pointerEnter = true;
- serie.context.pointerItemDataIndex = i;
- }
- }
- }
- else
- {
- var lastIndex = serie.context.pointerItemDataIndex;
- serie.context.pointerItemDataIndex = -1;
- serie.context.pointerEnter = false;
- for (int i = 0; i < serie.dataCount; i++)
- {
- var serieData = serie.data[i];
- var dist = Vector3.Distance(chart.pointerPos, serieData.context.position);
- var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize);
- var highlight = dist <= size;
- serieData.context.highlight = highlight;
- var state = SerieHelper.GetSerieState(serie, serieData, true);
- size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, state);
- serieData.interact.SetValue(ref needInteract, size);
- if (highlight)
- {
- serie.context.pointerEnter = true;
- serie.context.pointerItemDataIndex = serieData.index;
- serie.interact.SetValue(ref needInteract, lineWidth, true);
- }
- }
- if (lastIndex != serie.context.pointerItemDataIndex)
- needInteract = true;
- }
- if (needInteract)
- {
- if (SeriesHelper.IsStack(chart.series))
- chart.RefreshTopPainter();
- else
- chart.RefreshPainter(serie);
- }
- }
-
- private void DrawLineSerie(VertexHelper vh, SimplifiedLine serie)
- {
- if (!serie.show)
- return;
- if (serie.animation.HasFadeOut())
- return;
-
- Axis axis;
- Axis relativedAxis;
- var isY = chart.GetSerieGridCoordAxis(serie, out axis, out relativedAxis);
-
- m_SerieGrid = chart.GetChartComponent<GridCoord>(axis.gridIndex);
-
- if (axis == null)
- return;
- if (relativedAxis == null)
- return;
- if (m_SerieGrid == null)
- return;
-
- var dataZoom = chart.GetDataZoomOfAxis(axis);
- var showData = serie.GetDataList(dataZoom);
-
- if (showData.Count <= 0)
- return;
-
- var axisLength = isY ? m_SerieGrid.context.height : m_SerieGrid.context.width;
- var scaleWid = AxisHelper.GetDataWidth(axis, axisLength, showData.Count, dataZoom);
-
- int maxCount = serie.maxShow > 0 ?
- (serie.maxShow > showData.Count ? showData.Count : serie.maxShow) :
- showData.Count;
- int rate = LineHelper.GetDataAverageRate(serie, m_SerieGrid, maxCount, false);
- var totalAverage = serie.sampleAverage > 0 ?
- serie.sampleAverage :
- DataHelper.DataAverage(ref showData, serie.sampleType, serie.minShow, maxCount, rate);
- var dataChanging = false;
- var dataChangeDuration = serie.animation.GetUpdateAnimationDuration();
- var unscaledTime = serie.animation.unscaledTime;
-
- var interacting = false;
- var lineWidth = LineHelper.GetLineWidth(ref interacting, serie, chart.theme.serie.lineWidth);
-
- axis.context.scaleWidth = scaleWid;
- serie.containerIndex = m_SerieGrid.index;
- serie.containterInstanceId = m_SerieGrid.instanceId;
-
- for (int i = serie.minShow; i < maxCount; i += rate)
- {
- var serieData = showData[i];
- var isIgnore = serie.IsIgnoreValue(serieData);
- if (isIgnore)
- {
- serieData.context.stackHeight = 0;
- serieData.context.position = Vector3.zero;
- if (serie.ignoreLineBreak && serie.context.dataIgnores.Count > 0)
- {
- serie.context.dataIgnores[serie.context.dataIgnores.Count - 1] = true;
- }
- }
- else
- {
- var np = Vector3.zero;
- var xValue = axis.IsCategory() ? i : serieData.GetData(0, axis.inverse);
- var relativedValue = DataHelper.SampleValue(ref showData, serie.sampleType, rate, serie.minShow,
- maxCount, totalAverage, i, dataChangeDuration, ref dataChanging, relativedAxis, unscaledTime);
-
- serieData.context.stackHeight = GetDataPoint(isY, axis, relativedAxis, m_SerieGrid, xValue, relativedValue,
- i, scaleWid, false, ref np);
-
- serieData.context.position = np;
-
- serie.context.dataPoints.Add(np);
- serie.context.dataIndexs.Add(serieData.index);
- serie.context.dataIgnores.Add(false);
- }
- }
-
- if (dataChanging || interacting)
- chart.RefreshPainter(serie);
-
- if (serie.context.dataPoints.Count <= 0)
- return;
-
- serie.animation.InitProgress(serie.context.dataPoints, isY);
-
- LineHelper.UpdateSerieDrawPoints(serie, chart.settings, chart.theme, null, lineWidth, isY);
- LineHelper.DrawSerieLineArea(vh, serie, null, chart.theme, null, isY, axis, relativedAxis, m_SerieGrid);
- LineHelper.DrawSerieLine(vh, chart.theme, serie, null, m_SerieGrid, axis, relativedAxis, lineWidth);
-
- serie.context.vertCount = vh.currentVertCount;
-
- if (!serie.animation.IsFinish())
- {
- serie.animation.CheckProgress();
- chart.RefreshPainter(serie);
- }
- }
-
- private float GetDataPoint(bool isY, Axis axis, Axis relativedAxis, GridCoord grid, double xValue,
- double yValue, int i, float scaleWid, bool isStack, ref Vector3 np)
- {
- float xPos, yPos;
- var gridXY = isY ? grid.context.x : grid.context.y;
-
- if (isY)
- {
- var valueHig = AxisHelper.GetAxisValueDistance(grid, relativedAxis, scaleWid, yValue);
- valueHig = AnimationStyleHelper.CheckDataAnimation(chart, serie, i, valueHig);
-
- xPos = gridXY + valueHig;
- yPos = AxisHelper.GetAxisValuePosition(grid, axis, scaleWid, xValue);
- }
- else
- {
-
- var valueHig = AxisHelper.GetAxisValueDistance(grid, relativedAxis, scaleWid, yValue);
- valueHig = AnimationStyleHelper.CheckDataAnimation(chart, serie, i, valueHig);
-
- yPos = gridXY + valueHig;
- xPos = AxisHelper.GetAxisValuePosition(grid, axis, scaleWid, xValue);
- }
- np = new Vector3(xPos, yPos);
- return yPos;
- }
- }
- }
|