No Description
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.

MarkAreaHandler.cs 8.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. using XUGL;
  5. namespace XCharts.Runtime
  6. {
  7. [UnityEngine.Scripting.Preserve]
  8. internal sealed class MarkAreaHandler : MainComponentHandler<MarkArea>
  9. {
  10. private GameObject m_MarkLineLabelRoot;
  11. private bool m_NeedUpdateLabelPosition;
  12. public override void InitComponent()
  13. {
  14. m_MarkLineLabelRoot = ChartHelper.AddObject("markarea" + component.index, chart.transform, chart.chartMinAnchor,
  15. chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta);
  16. m_MarkLineLabelRoot.hideFlags = chart.chartHideFlags;
  17. ChartHelper.HideAllObject(m_MarkLineLabelRoot);
  18. InitMarkArea(component);
  19. }
  20. public override void DrawBase(VertexHelper vh)
  21. {
  22. DrawMarkArea(vh, component);
  23. }
  24. public override void Update()
  25. {
  26. if (m_NeedUpdateLabelPosition)
  27. {
  28. m_NeedUpdateLabelPosition = false;
  29. if (component.runtimeLabel != null)
  30. {
  31. component.runtimeLabel.SetPosition(component.runtimeLabelPosition);
  32. }
  33. }
  34. }
  35. private void InitMarkArea(MarkArea markArea)
  36. {
  37. markArea.painter = chart.m_PainterUpper;
  38. markArea.refreshComponent = delegate()
  39. {
  40. var label = ChartHelper.AddChartLabel("label", m_MarkLineLabelRoot.transform, markArea.label, chart.theme.axis,
  41. component.text, Color.clear, TextAnchor.MiddleCenter);
  42. UpdateRuntimeData(component);
  43. label.SetActive(markArea.label.show);
  44. label.SetPosition(component.runtimeLabelPosition);
  45. label.SetText(component.text);
  46. markArea.runtimeLabel = label;
  47. };
  48. markArea.refreshComponent();
  49. }
  50. private void DrawMarkArea(VertexHelper vh, MarkArea markArea)
  51. {
  52. if (!markArea.show) return;
  53. var serie = chart.GetSerie(markArea.serieIndex);
  54. if (serie == null || !serie.show || !markArea.show) return;
  55. UpdateRuntimeData(markArea);
  56. var colorIndex = chart.GetLegendRealShowNameIndex(serie.legendName);
  57. var serieColor = SerieHelper.GetLineColor(serie, null, chart.theme, colorIndex, SerieState.Normal);
  58. var areaColor = markArea.itemStyle.GetColor(serieColor);
  59. UGL.DrawRectangle(vh, markArea.runtimeRect, areaColor, areaColor);
  60. }
  61. private void UpdateRuntimeData(MarkArea markArea)
  62. {
  63. var serie = chart.GetSerie(markArea.serieIndex);
  64. if (serie == null || !serie.show || !markArea.show) return;
  65. var yAxis = chart.GetChartComponent<YAxis>(serie.yAxisIndex);
  66. var xAxis = chart.GetChartComponent<XAxis>(serie.xAxisIndex);
  67. var grid = chart.GetChartComponent<GridCoord>(xAxis.gridIndex);
  68. var dataZoom = chart.GetDataZoomOfAxis(xAxis);
  69. var showData = serie.GetDataList(dataZoom);
  70. var lt = GetPosition(markArea.start, serie, dataZoom, xAxis, yAxis, grid, showData, true);
  71. var rb = GetPosition(markArea.end, serie, dataZoom, xAxis, yAxis, grid, showData, false);
  72. var lb = new Vector3(lt.x, rb.y);
  73. markArea.runtimeRect = new Rect(lb.x, lb.y, rb.x - lb.x, lt.y - lb.y);
  74. UpdateLabelPosition(markArea);
  75. }
  76. private void UpdateLabelPosition(MarkArea markArea)
  77. {
  78. if (!markArea.label.show) return;
  79. m_NeedUpdateLabelPosition = true;
  80. var rect = markArea.runtimeRect;
  81. switch (markArea.label.position)
  82. {
  83. case LabelStyle.Position.Center:
  84. markArea.runtimeLabelPosition = rect.center;
  85. break;
  86. case LabelStyle.Position.Left:
  87. markArea.runtimeLabelPosition = rect.center + new Vector2(rect.width / 2, 0);
  88. break;
  89. case LabelStyle.Position.Right:
  90. markArea.runtimeLabelPosition = rect.center - new Vector2(rect.width / 2, 0);
  91. break;
  92. case LabelStyle.Position.Top:
  93. markArea.runtimeLabelPosition = rect.center + new Vector2(0, rect.height / 2);
  94. break;
  95. case LabelStyle.Position.Bottom:
  96. markArea.runtimeLabelPosition = rect.center - new Vector2(0, rect.height / 2);
  97. break;
  98. default:
  99. markArea.runtimeLabelPosition = rect.center + new Vector2(0, rect.height / 2);
  100. break;
  101. }
  102. markArea.runtimeLabelPosition += markArea.label.offset;
  103. }
  104. private Vector3 GetPosition(MarkAreaData data, Serie serie, DataZoom dataZoom, XAxis xAxis, YAxis yAxis,
  105. GridCoord grid, List<SerieData> showData, bool start)
  106. {
  107. var pos = Vector3.zero;
  108. switch (data.type)
  109. {
  110. case MarkAreaType.Min:
  111. data.runtimeValue = SerieHelper.GetMinData(serie, data.dimension, dataZoom);
  112. return GetPosition(xAxis, yAxis, grid, data.runtimeValue, start);
  113. case MarkAreaType.Max:
  114. data.runtimeValue = SerieHelper.GetMaxData(serie, data.dimension, dataZoom);
  115. return GetPosition(xAxis, yAxis, grid, data.runtimeValue, start);
  116. case MarkAreaType.Average:
  117. data.runtimeValue = SerieHelper.GetAverageData(serie, data.dimension, dataZoom);
  118. return GetPosition(xAxis, yAxis, grid, data.runtimeValue, start);
  119. case MarkAreaType.Median:
  120. data.runtimeValue = SerieHelper.GetMedianData(serie, data.dimension, dataZoom);
  121. return GetPosition(xAxis, yAxis, grid, data.runtimeValue, start);
  122. case MarkAreaType.None:
  123. if (data.xPosition != 0 || data.yPosition != 0)
  124. {
  125. var pX = grid.context.x + data.xPosition;
  126. var pY = grid.context.y + data.yPosition;
  127. return new Vector3(pX, pY);
  128. }
  129. else if (data.yValue != 0)
  130. {
  131. data.runtimeValue = data.yValue;
  132. if (yAxis.IsCategory())
  133. {
  134. var pY = AxisHelper.GetAxisPosition(grid, yAxis, data.yValue, showData.Count, dataZoom);
  135. return start ?
  136. new Vector3(grid.context.x, pY) :
  137. new Vector3(grid.context.x + grid.context.width, pY);
  138. }
  139. else
  140. {
  141. return GetPosition(xAxis, yAxis, grid, data.runtimeValue, start);
  142. }
  143. }
  144. else
  145. {
  146. data.runtimeValue = data.xValue;
  147. if (xAxis.IsCategory())
  148. {
  149. var pX = AxisHelper.GetAxisPosition(grid, xAxis, data.xValue, showData.Count, dataZoom);
  150. return start ? new Vector3(pX, grid.context.y + grid.context.height) :
  151. new Vector3(pX, grid.context.y);
  152. }
  153. else
  154. {
  155. return GetPosition(xAxis, yAxis, grid, data.xValue, start);
  156. }
  157. }
  158. default:
  159. break;
  160. }
  161. return pos;
  162. }
  163. private Vector3 GetPosition(Axis xAxis, Axis yAxis, GridCoord grid, double value, bool start)
  164. {
  165. if (yAxis.IsCategory())
  166. {
  167. var pX = AxisHelper.GetAxisPosition(grid, xAxis, value);
  168. return start ?
  169. new Vector3(pX, grid.context.y + grid.context.height) :
  170. new Vector3(pX, grid.context.y);
  171. }
  172. else
  173. {
  174. var pY = AxisHelper.GetAxisPosition(grid, yAxis, value);
  175. return start ?
  176. new Vector3(grid.context.x, pY + grid.context.height) :
  177. new Vector3(grid.context.x + grid.context.width, pY);
  178. }
  179. }
  180. }
  181. }