Nav apraksta
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

SimplifiedLineHandler.cs 11KB

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