Geen omschrijving
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SimplifiedLineHandler.cs 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. namespace XCharts.Runtime
  5. {
  6. /// <summary>
  7. /// For grid coord
  8. /// </summary>
  9. [UnityEngine.Scripting.Preserve]
  10. internal sealed class SimplifiedLineHandler : SerieHandler<SimplifiedLine>
  11. {
  12. private GridCoord m_SerieGrid;
  13. public override void Update()
  14. {
  15. base.Update();
  16. }
  17. public override void UpdateTooltipSerieParams(int dataIndex, bool showCategory, string category,
  18. string marker, string itemFormatter, string numericFormatter, string ignoreDataDefaultContent,
  19. ref List<SerieParams> paramList, ref string title)
  20. {
  21. UpdateCoordSerieParams(ref paramList, ref title, dataIndex, showCategory, category,
  22. marker, itemFormatter, numericFormatter, ignoreDataDefaultContent);
  23. }
  24. public override void DrawSerie(VertexHelper vh)
  25. {
  26. DrawLineSerie(vh, serie);
  27. }
  28. public override void UpdateSerieContext()
  29. {
  30. if (m_SerieGrid == null)
  31. return;
  32. var needCheck = (chart.isPointerInChart && m_SerieGrid.IsPointerEnter()) || m_LegendEnter;
  33. var lineWidth = 0f;
  34. if (!needCheck)
  35. {
  36. if (m_LastCheckContextFlag != needCheck)
  37. {
  38. var needAnimation1 = false;
  39. lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
  40. m_LastCheckContextFlag = needCheck;
  41. serie.context.pointerItemDataIndex = -1;
  42. serie.context.pointerEnter = false;
  43. serie.interact.SetValue(ref needAnimation1, lineWidth, false);
  44. foreach (var serieData in serie.data)
  45. {
  46. var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
  47. var symbolSize = symbol.GetSize(serieData.data, chart.theme.serie.lineSymbolSize);
  48. serieData.context.highlight = false;
  49. serieData.interact.SetValue(ref needAnimation1, symbolSize);
  50. }
  51. if (needAnimation1)
  52. {
  53. if (SeriesHelper.IsStack(chart.series))
  54. chart.RefreshTopPainter();
  55. else
  56. chart.RefreshPainter(serie);
  57. }
  58. }
  59. return;
  60. }
  61. m_LastCheckContextFlag = needCheck;
  62. var themeSymbolSize = chart.theme.serie.lineSymbolSize;
  63. var themeSymbolSelectedSize = chart.theme.serie.lineSymbolSelectedSize;
  64. lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
  65. var needInteract = false;
  66. if (m_LegendEnter)
  67. {
  68. serie.context.pointerEnter = true;
  69. serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate);
  70. for (int i = 0; i < serie.dataCount; i++)
  71. {
  72. var serieData = serie.data[i];
  73. var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, SerieState.Emphasis);
  74. serieData.context.highlight = true;
  75. serieData.interact.SetValue(ref needInteract, size);
  76. }
  77. }
  78. else if (serie.context.isTriggerByAxis)
  79. {
  80. serie.context.pointerEnter = true;
  81. serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate);
  82. for (int i = 0; i < serie.dataCount; i++)
  83. {
  84. var serieData = serie.data[i];
  85. var highlight = i == serie.context.pointerItemDataIndex;
  86. serieData.context.highlight = highlight;
  87. var state = SerieHelper.GetSerieState(serie, serieData, true);
  88. var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, state);
  89. serieData.interact.SetValue(ref needInteract, size);
  90. if (highlight)
  91. {
  92. serie.context.pointerEnter = true;
  93. serie.context.pointerItemDataIndex = i;
  94. }
  95. }
  96. }
  97. else
  98. {
  99. var lastIndex = serie.context.pointerItemDataIndex;
  100. serie.context.pointerItemDataIndex = -1;
  101. serie.context.pointerEnter = false;
  102. for (int i = 0; i < serie.dataCount; i++)
  103. {
  104. var serieData = serie.data[i];
  105. var dist = Vector3.Distance(chart.pointerPos, serieData.context.position);
  106. var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize);
  107. var highlight = dist <= size;
  108. serieData.context.highlight = highlight;
  109. var state = SerieHelper.GetSerieState(serie, serieData, true);
  110. size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, state);
  111. serieData.interact.SetValue(ref needInteract, size);
  112. if (highlight)
  113. {
  114. serie.context.pointerEnter = true;
  115. serie.context.pointerItemDataIndex = serieData.index;
  116. serie.interact.SetValue(ref needInteract, lineWidth, true);
  117. }
  118. }
  119. if (lastIndex != serie.context.pointerItemDataIndex)
  120. needInteract = true;
  121. }
  122. if (needInteract)
  123. {
  124. if (SeriesHelper.IsStack(chart.series))
  125. chart.RefreshTopPainter();
  126. else
  127. chart.RefreshPainter(serie);
  128. }
  129. }
  130. private void DrawLineSerie(VertexHelper vh, SimplifiedLine serie)
  131. {
  132. if (!serie.show)
  133. return;
  134. if (serie.animation.HasFadeOut())
  135. return;
  136. Axis axis;
  137. Axis relativedAxis;
  138. var isY = chart.GetSerieGridCoordAxis(serie, out axis, out relativedAxis);
  139. m_SerieGrid = chart.GetChartComponent<GridCoord>(axis.gridIndex);
  140. if (axis == null)
  141. return;
  142. if (relativedAxis == null)
  143. return;
  144. if (m_SerieGrid == null)
  145. return;
  146. var dataZoom = chart.GetDataZoomOfAxis(axis);
  147. var showData = serie.GetDataList(dataZoom);
  148. if (showData.Count <= 0)
  149. return;
  150. var axisLength = isY ? m_SerieGrid.context.height : m_SerieGrid.context.width;
  151. var scaleWid = AxisHelper.GetDataWidth(axis, axisLength, showData.Count, dataZoom);
  152. int maxCount = serie.maxShow > 0 ?
  153. (serie.maxShow > showData.Count ? showData.Count : serie.maxShow) :
  154. showData.Count;
  155. int rate = LineHelper.GetDataAverageRate(serie, m_SerieGrid, maxCount, false);
  156. var totalAverage = serie.sampleAverage > 0 ?
  157. serie.sampleAverage :
  158. DataHelper.DataAverage(ref showData, serie.sampleType, serie.minShow, maxCount, rate);
  159. var dataChanging = false;
  160. var dataChangeDuration = serie.animation.GetUpdateAnimationDuration();
  161. var unscaledTime = serie.animation.unscaledTime;
  162. var interacting = false;
  163. var lineWidth = LineHelper.GetLineWidth(ref interacting, serie, chart.theme.serie.lineWidth);
  164. axis.context.scaleWidth = scaleWid;
  165. serie.containerIndex = m_SerieGrid.index;
  166. serie.containterInstanceId = m_SerieGrid.instanceId;
  167. for (int i = serie.minShow; i < maxCount; i += rate)
  168. {
  169. var serieData = showData[i];
  170. var isIgnore = serie.IsIgnoreValue(serieData);
  171. if (isIgnore)
  172. {
  173. serieData.context.stackHeight = 0;
  174. serieData.context.position = Vector3.zero;
  175. if (serie.ignoreLineBreak && serie.context.dataIgnores.Count > 0)
  176. {
  177. serie.context.dataIgnores[serie.context.dataIgnores.Count - 1] = true;
  178. }
  179. }
  180. else
  181. {
  182. var np = Vector3.zero;
  183. var xValue = axis.IsCategory() ? i : serieData.GetData(0, axis.inverse);
  184. var relativedValue = DataHelper.SampleValue(ref showData, serie.sampleType, rate, serie.minShow,
  185. maxCount, totalAverage, i, dataChangeDuration, ref dataChanging, relativedAxis, unscaledTime);
  186. serieData.context.stackHeight = GetDataPoint(isY, axis, relativedAxis, m_SerieGrid, xValue, relativedValue,
  187. i, scaleWid, false, ref np);
  188. serieData.context.position = np;
  189. serie.context.dataPoints.Add(np);
  190. serie.context.dataIndexs.Add(serieData.index);
  191. serie.context.dataIgnores.Add(false);
  192. }
  193. }
  194. if (dataChanging || interacting)
  195. chart.RefreshPainter(serie);
  196. if (serie.context.dataPoints.Count <= 0)
  197. return;
  198. serie.animation.InitProgress(serie.context.dataPoints, isY);
  199. LineHelper.UpdateSerieDrawPoints(serie, chart.settings, chart.theme, null, lineWidth, isY);
  200. LineHelper.DrawSerieLineArea(vh, serie, null, chart.theme, null, isY, axis, relativedAxis, m_SerieGrid);
  201. LineHelper.DrawSerieLine(vh, chart.theme, serie, null, m_SerieGrid, axis, relativedAxis, lineWidth);
  202. serie.context.vertCount = vh.currentVertCount;
  203. if (!serie.animation.IsFinish())
  204. {
  205. serie.animation.CheckProgress();
  206. chart.RefreshPainter(serie);
  207. }
  208. }
  209. private float GetDataPoint(bool isY, Axis axis, Axis relativedAxis, GridCoord grid, double xValue,
  210. double yValue, int i, float scaleWid, bool isStack, ref Vector3 np)
  211. {
  212. float xPos, yPos;
  213. var gridXY = isY ? grid.context.x : grid.context.y;
  214. if (isY)
  215. {
  216. var valueHig = AxisHelper.GetAxisValueDistance(grid, relativedAxis, scaleWid, yValue);
  217. valueHig = AnimationStyleHelper.CheckDataAnimation(chart, serie, i, valueHig);
  218. xPos = gridXY + valueHig;
  219. yPos = AxisHelper.GetAxisValuePosition(grid, axis, scaleWid, xValue);
  220. }
  221. else
  222. {
  223. var valueHig = AxisHelper.GetAxisValueDistance(grid, relativedAxis, scaleWid, yValue);
  224. valueHig = AnimationStyleHelper.CheckDataAnimation(chart, serie, i, valueHig);
  225. yPos = gridXY + valueHig;
  226. xPos = AxisHelper.GetAxisValuePosition(grid, axis, scaleWid, xValue);
  227. }
  228. np = new Vector3(xPos, yPos);
  229. return yPos;
  230. }
  231. }
  232. }