Bez popisu
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.

SerieHandler.cs 30KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
  1. using System.Collections.Generic;
  2. using System.Text;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.UI;
  6. namespace XCharts.Runtime
  7. {
  8. public abstract class SerieHandler
  9. {
  10. public BaseChart chart { get; internal set; }
  11. public SerieHandlerAttribute attribute { get; internal set; }
  12. public virtual int defaultDimension { get; internal set; }
  13. public virtual void InitComponent() { }
  14. public virtual void RemoveComponent() { }
  15. public virtual void CheckComponent(StringBuilder sb) { }
  16. public virtual void Update() { }
  17. public virtual void DrawBase(VertexHelper vh) { }
  18. public virtual void DrawSerie(VertexHelper vh) { }
  19. public virtual void DrawUpper(VertexHelper vh) { }
  20. public virtual void DrawTop(VertexHelper vh) { }
  21. public virtual void OnPointerClick(PointerEventData eventData) { }
  22. public virtual void OnPointerDown(PointerEventData eventData) { }
  23. public virtual void OnPointerUp(PointerEventData eventData) { }
  24. public virtual void OnPointerEnter(PointerEventData eventData) { }
  25. public virtual void OnPointerExit(PointerEventData eventData) { }
  26. public virtual void OnDrag(PointerEventData eventData) { }
  27. public virtual void OnBeginDrag(PointerEventData eventData) { }
  28. public virtual void OnEndDrag(PointerEventData eventData) { }
  29. public virtual void OnScroll(PointerEventData eventData) { }
  30. public virtual void RefreshLabelNextFrame() { }
  31. public virtual void RefreshLabelInternal() { }
  32. public virtual void UpdateSerieContext() { }
  33. public virtual void UpdateTooltipSerieParams(int dataIndex, bool showCategory,
  34. string category, string marker,
  35. string itemFormatter, string numericFormatter, string ignoreDataDefaultContent,
  36. ref List<SerieParams> paramList, ref string title)
  37. { }
  38. public virtual void OnLegendButtonClick(int index, string legendName, bool show) { }
  39. public virtual void OnLegendButtonEnter(int index, string legendName) { }
  40. public virtual void OnLegendButtonExit(int index, string legendName) { }
  41. internal abstract void SetSerie(Serie serie);
  42. public virtual int GetPointerItemDataIndex() { return -1; }
  43. public virtual int GetPointerItemDataDimension() { return 1; }
  44. }
  45. public abstract class SerieHandler<T> : SerieHandler where T : Serie
  46. {
  47. private static readonly string s_SerieLabelObjectName = "label";
  48. private static readonly string s_SerieTitleObjectName = "title";
  49. private static readonly string s_SerieRootObjectName = "serie";
  50. private static readonly string s_SerieEndLabelObjectName = "end_label";
  51. protected GameObject m_SerieRoot;
  52. protected GameObject m_SerieLabelRoot;
  53. protected bool m_InitedLabel;
  54. protected bool m_NeedInitComponent;
  55. protected bool m_RefreshLabel;
  56. protected bool m_LastCheckContextFlag = false;
  57. protected bool m_LegendEnter = false;
  58. protected int m_LegendEnterIndex;
  59. protected ChartLabel m_EndLabel;
  60. public T serie { get; internal set; }
  61. public GameObject labelObject { get { return m_SerieLabelRoot; } }
  62. internal override void SetSerie(Serie serie)
  63. {
  64. this.serie = (T)serie;
  65. this.serie.context.param.serieType = typeof(T);
  66. m_NeedInitComponent = true;
  67. AnimationStyleHelper.UpdateSerieAnimation(serie);
  68. }
  69. public override void Update()
  70. {
  71. if (m_NeedInitComponent)
  72. {
  73. m_NeedInitComponent = false;
  74. InitComponent();
  75. }
  76. if (m_RefreshLabel)
  77. {
  78. m_RefreshLabel = false;
  79. RefreshLabelInternal();
  80. RefreshEndLabelInternal();
  81. }
  82. if (serie.dataDirty)
  83. {
  84. SeriesHelper.UpdateSerieNameList(chart, ref chart.m_LegendRealShowName);
  85. serie.OnDataUpdate();
  86. serie.dataDirty = false;
  87. }
  88. if (serie.label != null && (serie.labelDirty || serie.label.componentDirty))
  89. {
  90. serie.labelDirty = false;
  91. serie.label.ClearComponentDirty();
  92. InitSerieLabel();
  93. InitSerieEndLabel();
  94. }
  95. if (serie.endLabel != null && serie.endLabel.componentDirty)
  96. {
  97. serie.endLabel.ClearComponentDirty();
  98. InitSerieEndLabel();
  99. }
  100. if (serie.titleStyle != null && (serie.titleDirty || serie.titleStyle.componentDirty))
  101. {
  102. serie.titleDirty = false;
  103. serie.titleStyle.ClearComponentDirty();
  104. InitSerieTitle();
  105. }
  106. if (serie.nameDirty)
  107. {
  108. foreach (var component in chart.components)
  109. {
  110. if (component is Legend)
  111. component.SetAllDirty();
  112. }
  113. chart.RefreshChart();
  114. serie.ClearSerieNameDirty();
  115. }
  116. if (serie.vertsDirty)
  117. {
  118. chart.RefreshPainter(serie);
  119. serie.ResetInteract();
  120. serie.ClearVerticesDirty();
  121. }
  122. UpdateSerieContextInternal();
  123. }
  124. private void UpdateSerieContextInternal()
  125. {
  126. var lastEnter = serie.context.pointerEnter;
  127. var lastDataIndex = serie.context.pointerItemDataIndex;
  128. UpdateSerieContext();
  129. if (lastEnter != serie.context.pointerEnter || lastDataIndex != serie.context.pointerItemDataIndex)
  130. {
  131. if (chart.onSerieEnter != null || chart.onSerieExit != null || serie.onEnter != null || serie.onExit != null)
  132. {
  133. var dataIndex = GetPointerItemDataIndex();
  134. var dimension = GetPointerItemDataDimension();
  135. var value = serie.GetData(dataIndex, dimension);
  136. var data = SerieEventDataPool.Get(chart.pointerPos, serie.index, dataIndex, dimension, value);
  137. if (serie.context.pointerEnter)
  138. {
  139. if (serie.onEnter != null) serie.onEnter(data);
  140. if (chart.onSerieEnter != null) chart.onSerieEnter(data);
  141. }
  142. else
  143. {
  144. data.dataIndex = lastDataIndex;
  145. if (serie.onExit != null) serie.onExit(data);
  146. if (chart.onSerieExit != null) chart.onSerieExit(data);
  147. }
  148. SerieEventDataPool.Release(data);
  149. }
  150. }
  151. }
  152. public override void RefreshLabelNextFrame()
  153. {
  154. m_RefreshLabel = true;
  155. }
  156. public override void InitComponent()
  157. {
  158. m_InitedLabel = false;
  159. InitRoot();
  160. InitSerieLabel();
  161. InitSerieTitle();
  162. InitSerieEndLabel();
  163. }
  164. public override void RemoveComponent()
  165. {
  166. ChartHelper.SetActive(m_SerieRoot, false);
  167. }
  168. public override void OnLegendButtonClick(int index, string legendName, bool show)
  169. {
  170. if (serie.colorByData && serie.IsSerieDataLegendName(legendName))
  171. {
  172. LegendHelper.CheckDataShow(serie, legendName, show);
  173. chart.UpdateLegendColor(legendName, show);
  174. chart.RefreshPainter(serie);
  175. }
  176. else if (serie.IsLegendName(legendName))
  177. {
  178. chart.SetSerieActive(serie, show);
  179. chart.RefreshPainter(serie);
  180. }
  181. }
  182. public override void OnLegendButtonEnter(int index, string legendName)
  183. {
  184. if (serie.colorByData && serie.IsSerieDataLegendName(legendName))
  185. {
  186. LegendHelper.CheckDataHighlighted(serie, legendName, true);
  187. chart.RefreshPainter(serie);
  188. }
  189. else if (serie.IsLegendName(legendName))
  190. {
  191. m_LegendEnter = true;
  192. chart.RefreshPainter(serie);
  193. }
  194. }
  195. public override void OnLegendButtonExit(int index, string legendName)
  196. {
  197. if (serie.colorByData && serie.IsSerieDataLegendName(legendName))
  198. {
  199. LegendHelper.CheckDataHighlighted(serie, legendName, false);
  200. chart.RefreshPainter(serie);
  201. }
  202. else if (serie.IsLegendName(legendName))
  203. {
  204. m_LegendEnter = false;
  205. chart.RefreshPainter(serie);
  206. }
  207. }
  208. private void InitRoot()
  209. {
  210. if (m_SerieRoot != null)
  211. {
  212. var rect = ChartHelper.EnsureComponent<RectTransform>(m_SerieRoot);
  213. rect.localPosition = Vector3.zero;
  214. rect.sizeDelta = chart.chartSizeDelta;
  215. rect.anchorMin = chart.chartMinAnchor;
  216. rect.anchorMax = chart.chartMaxAnchor;
  217. rect.pivot = chart.chartPivot;
  218. return;
  219. }
  220. var objName = s_SerieRootObjectName + "_" + serie.index;
  221. m_SerieRoot = ChartHelper.AddObject(objName, chart.transform, chart.chartMinAnchor,
  222. chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta);
  223. m_SerieRoot.hideFlags = chart.chartHideFlags;
  224. ChartHelper.SetActive(m_SerieRoot, true);
  225. ChartHelper.HideAllObject(m_SerieRoot);
  226. }
  227. private void InitSerieLabel()
  228. {
  229. InitRoot();
  230. m_SerieLabelRoot = ChartHelper.AddObject(s_SerieLabelObjectName, m_SerieRoot.transform,
  231. chart.chartMinAnchor, chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta);
  232. m_SerieLabelRoot.hideFlags = chart.chartHideFlags;
  233. SerieLabelPool.ReleaseAll(m_SerieLabelRoot.transform);
  234. int count = 0;
  235. SerieHelper.UpdateCenter(serie, chart.chartPosition, chart.chartWidth, chart.chartHeight);
  236. for (int j = 0; j < serie.data.Count; j++)
  237. {
  238. var serieData = serie.data[j];
  239. serieData.index = j;
  240. serieData.labelObject = null;
  241. if (AddSerieLabel(m_SerieLabelRoot, serieData, ref count))
  242. {
  243. m_InitedLabel = true;
  244. count++;
  245. }
  246. }
  247. RefreshLabelInternal();
  248. }
  249. protected bool AddSerieLabel(GameObject serieLabelRoot, SerieData serieData, ref int count)
  250. {
  251. if (serieData == null)
  252. return false;
  253. if (serieLabelRoot == null)
  254. return false;
  255. if (serie.IsPerformanceMode())
  256. return false;
  257. if (count == -1) count = serie.dataCount;
  258. var serieLabel = SerieHelper.GetSerieLabel(serie, serieData);
  259. if (serieLabel == null)
  260. {
  261. return false;
  262. }
  263. var dataAutoColor = GetSerieDataAutoColor(serieData);
  264. serieData.context.dataLabels.Clear();
  265. if (serie.multiDimensionLabel)
  266. {
  267. for (int i = 0; i < serieData.data.Count; i++)
  268. {
  269. var textName = string.Format("{0}_{1}_{2}_{3}", s_SerieLabelObjectName, serie.index, serieData.index, i);
  270. var label = ChartHelper.AddChartLabel(textName, serieLabelRoot.transform, serieLabel, chart.theme.common,
  271. "", dataAutoColor, TextAnchor.MiddleCenter);
  272. label.SetActive(serieLabel.show);
  273. serieData.context.dataLabels.Add(label);
  274. }
  275. }
  276. else
  277. {
  278. var textName = ChartCached.GetSerieLabelName(s_SerieLabelObjectName, serie.index, serieData.index);
  279. var label = ChartHelper.AddChartLabel(textName, serieLabelRoot.transform, serieLabel, chart.theme.common,
  280. "", dataAutoColor, TextAnchor.MiddleCenter);
  281. label.SetActive(serieLabel.show);
  282. serieData.labelObject = label;
  283. }
  284. if (serieData.context.children.Count > 0)
  285. {
  286. foreach (var childSerieData in serieData.context.children)
  287. {
  288. AddSerieLabel(serieLabelRoot, childSerieData, ref count);
  289. count++;
  290. }
  291. }
  292. return true;
  293. }
  294. private void InitSerieEndLabel()
  295. {
  296. if (serie.endLabel == null)
  297. {
  298. if (m_EndLabel != null)
  299. {
  300. m_EndLabel.SetActive(false);
  301. m_EndLabel = null;
  302. }
  303. return;
  304. }
  305. InitRoot();
  306. var dataAutoColor = (Color)chart.GetLegendRealShowNameColor(serie.legendName);
  307. m_EndLabel = ChartHelper.AddChartLabel(s_SerieEndLabelObjectName, m_SerieRoot.transform, serie.endLabel,
  308. chart.theme.common, "", dataAutoColor, TextAnchor.MiddleLeft);
  309. m_EndLabel.SetActive(serie.endLabel.show);
  310. RefreshEndLabelInternal();
  311. }
  312. private void InitSerieTitle()
  313. {
  314. InitRoot();
  315. var serieTitleRoot = ChartHelper.AddObject(s_SerieTitleObjectName, m_SerieRoot.transform,
  316. chart.chartMinAnchor, chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta);
  317. serieTitleRoot.hideFlags = chart.chartHideFlags;
  318. SerieLabelPool.ReleaseAll(serieTitleRoot.transform);
  319. ChartHelper.RemoveComponent<Text>(serieTitleRoot);
  320. SerieHelper.UpdateCenter(serie, chart.chartPosition, chart.chartWidth, chart.chartHeight);
  321. if (serie.titleJustForSerie)
  322. {
  323. var titleStyle = SerieHelper.GetTitleStyle(serie, null);
  324. if (titleStyle != null)
  325. {
  326. var color = chart.GetItemColor(serie, null);
  327. var content = string.Empty;
  328. if (string.IsNullOrEmpty(titleStyle.formatter))
  329. {
  330. content = serie.serieName;
  331. }
  332. else
  333. {
  334. content = titleStyle.formatter;
  335. FormatterHelper.ReplaceContent(ref content, 0, titleStyle.numericFormatter, serie, chart);
  336. }
  337. var label = ChartHelper.AddChartLabel("title_" + 0, serieTitleRoot.transform, titleStyle, chart.theme.common,
  338. content, color, TextAnchor.MiddleCenter);
  339. serie.context.titleObject = label;
  340. label.SetActive(titleStyle.show);
  341. var labelPosition = GetSerieDataTitlePosition(null, titleStyle);
  342. var offset = titleStyle.GetOffset(serie.context.insideRadius);
  343. label.SetPosition(labelPosition + offset);
  344. }
  345. }
  346. else
  347. {
  348. for (int i = 0; i < serie.dataCount; i++)
  349. {
  350. var serieData = serie.data[i];
  351. var titleStyle = SerieHelper.GetTitleStyle(serie, serieData);
  352. if (titleStyle == null) continue;
  353. var color = chart.GetItemColor(serie, serieData);
  354. var content = string.Empty;
  355. if (string.IsNullOrEmpty(titleStyle.formatter))
  356. {
  357. content = serieData.name;
  358. }
  359. else
  360. {
  361. content = titleStyle.formatter;
  362. FormatterHelper.ReplaceContent(ref content, 0, titleStyle.numericFormatter, serie, chart);
  363. }
  364. FormatterHelper.ReplaceContent(ref content, i, titleStyle.numericFormatter, serie, chart);
  365. var label = ChartHelper.AddChartLabel("title_" + i, serieTitleRoot.transform, titleStyle, chart.theme.common,
  366. content, color, TextAnchor.MiddleCenter);
  367. serieData.titleObject = label;
  368. label.SetActive(titleStyle.show);
  369. var labelPosition = GetSerieDataTitlePosition(serieData, titleStyle);
  370. var offset = titleStyle.GetOffset(serie.context.insideRadius);
  371. label.SetPosition(labelPosition + offset);
  372. }
  373. }
  374. }
  375. public override void RefreshLabelInternal()
  376. {
  377. if (!m_InitedLabel)
  378. return;
  379. var dataChangeDuration = serie.animation.GetUpdateAnimationDuration();
  380. var unscaledTime = serie.animation.unscaledTime;
  381. var needCheck = serie.context.dataIndexs.Count > 0;
  382. foreach (var serieData in serie.data)
  383. {
  384. if (serieData.labelObject == null && serieData.context.dataLabels.Count <= 0)
  385. {
  386. continue;
  387. }
  388. if (needCheck && !serie.context.dataIndexs.Contains(serieData.index))
  389. {
  390. serieData.SetLabelActive(false);
  391. continue;
  392. };
  393. var currLabel = SerieHelper.GetSerieLabel(serie, serieData);
  394. var isIgnore = serie.IsIgnoreIndex(serieData.index, defaultDimension);
  395. if (serie.show &&
  396. currLabel != null &&
  397. currLabel.show &&
  398. serieData.context.canShowLabel &&
  399. !isIgnore)
  400. {
  401. if (serie.multiDimensionLabel)
  402. {
  403. var total = serieData.GetTotalData();
  404. var color = chart.GetItemColor(serie, serieData);
  405. for (int i = 0; i < serieData.context.dataLabels.Count; i++)
  406. {
  407. if (i >= serieData.context.dataPoints.Count) continue;
  408. var labelObject = serieData.context.dataLabels[i];
  409. var value = serieData.GetCurrData(i, dataChangeDuration, unscaledTime);
  410. var content = string.IsNullOrEmpty(currLabel.formatter) ?
  411. ChartCached.NumberToStr(value, currLabel.numericFormatter) :
  412. SerieLabelHelper.GetFormatterContent(serie, serieData, value, total,
  413. currLabel, color);
  414. var offset = GetSerieDataLabelOffset(serieData, currLabel);
  415. labelObject.SetActive(currLabel.show && !isIgnore);
  416. labelObject.SetText(content);
  417. labelObject.SetPosition(serieData.context.dataPoints[i] + offset);
  418. labelObject.UpdateIcon(currLabel.icon);
  419. if (currLabel.textStyle.autoColor)
  420. {
  421. var dataAutoColor = GetSerieDataAutoColor(serieData);
  422. if (!ChartHelper.IsClearColor(dataAutoColor))
  423. labelObject.SetTextColor(dataAutoColor);
  424. }
  425. }
  426. }
  427. else
  428. {
  429. var value = serieData.GetCurrData(defaultDimension, dataChangeDuration, unscaledTime);
  430. var total = serie.GetDataTotal(defaultDimension, serieData);
  431. var color = chart.GetItemColor(serie, serieData);
  432. var content = string.IsNullOrEmpty(currLabel.formatter) ?
  433. ChartCached.NumberToStr(value, currLabel.numericFormatter) :
  434. SerieLabelHelper.GetFormatterContent(serie, serieData, value, total,
  435. currLabel, color);
  436. serieData.SetLabelActive(currLabel.show && !isIgnore);
  437. serieData.labelObject.UpdateIcon(currLabel.icon);
  438. serieData.labelObject.SetText(content);
  439. UpdateLabelPosition(serieData, currLabel);
  440. if (currLabel.textStyle.autoColor)
  441. {
  442. var dataAutoColor = GetSerieDataAutoColor(serieData);
  443. if (!ChartHelper.IsClearColor(dataAutoColor))
  444. serieData.labelObject.SetTextColor(dataAutoColor);
  445. }
  446. }
  447. }
  448. else
  449. {
  450. serieData.SetLabelActive(false);
  451. }
  452. }
  453. }
  454. public virtual void RefreshEndLabelInternal()
  455. {
  456. if (m_EndLabel == null)
  457. return;
  458. var endLabelStyle = serie.endLabel;
  459. if (endLabelStyle == null)
  460. return;
  461. var dataCount = serie.context.dataPoints.Count;
  462. var active = endLabelStyle.show && dataCount > 0;
  463. m_EndLabel.SetActive(active);
  464. if (active)
  465. {
  466. var value = serie.context.lineEndValue;
  467. var content = SerieLabelHelper.GetFormatterContent(serie, null, value, 0,
  468. endLabelStyle, Color.clear);
  469. m_EndLabel.SetText(content);
  470. m_EndLabel.SetPosition(serie.context.lineEndPostion + endLabelStyle.offset);
  471. }
  472. m_EndLabel.isAnimationEnd = serie.animation.IsFinish();
  473. }
  474. private void UpdateLabelPosition(SerieData serieData, LabelStyle currLabel)
  475. {
  476. var labelPosition = GetSerieDataLabelPosition(serieData, currLabel);
  477. var offset = GetSerieDataLabelOffset(serieData, currLabel);
  478. serieData.labelObject.SetPosition(labelPosition + offset);
  479. if (currLabel.autoRotate && serieData.context.angle != 0)
  480. {
  481. if (serieData.context.angle > 90 && serieData.context.angle < 270)
  482. serieData.labelObject.SetRotate(180 - serieData.context.angle + currLabel.rotate);
  483. else
  484. serieData.labelObject.SetRotate(-serieData.context.angle + currLabel.rotate);
  485. }
  486. }
  487. public virtual Vector3 GetSerieDataLabelPosition(SerieData serieData, LabelStyle label)
  488. {
  489. return ChartHelper.IsZeroVector(serieData.context.labelPosition) ?
  490. serieData.context.position :
  491. serieData.context.labelPosition;
  492. }
  493. public virtual Vector3 GetSerieDataLabelOffset(SerieData serieData, LabelStyle label)
  494. {
  495. return label.GetOffset(serie.context.insideRadius);
  496. }
  497. public virtual Vector3 GetSerieDataTitlePosition(SerieData serieData, TitleStyle titleStyle)
  498. {
  499. return serieData.context.position;
  500. }
  501. public virtual Color GetSerieDataAutoColor(SerieData serieData)
  502. {
  503. var colorIndex = serie.colorByData ? serieData.index : serie.index;
  504. Color32 color, toColor;
  505. SerieHelper.GetItemColor(out color, out toColor, serie, serieData, chart.theme, colorIndex, SerieState.Normal, false);
  506. return (Color)color;
  507. }
  508. protected void UpdateCoordSerieParams(ref List<SerieParams> paramList, ref string title,
  509. int dataIndex, bool showCategory, string category, string marker,
  510. string itemFormatter, string numericFormatter, string ignoreDataDefaultContent)
  511. {
  512. var dimension = 1;
  513. if (dataIndex < 0)
  514. dataIndex = serie.context.pointerItemDataIndex;
  515. if (dataIndex < 0)
  516. return;
  517. var serieData = serie.GetSerieData(dataIndex);
  518. if (serieData == null)
  519. return;
  520. var ignore = serie.IsIgnoreValue(serieData, dimension);
  521. if (ignore && string.IsNullOrEmpty(ignoreDataDefaultContent))
  522. return;
  523. itemFormatter = SerieHelper.GetItemFormatter(serie, serieData, itemFormatter);
  524. if (serie.placeHolder || TooltipHelper.IsIgnoreFormatter(itemFormatter))
  525. return;
  526. var param = serie.context.param;
  527. param.serieName = serie.serieName;
  528. param.serieIndex = serie.index;
  529. param.category = category;
  530. param.dimension = dimension;
  531. param.serieData = serieData;
  532. param.dataCount = serie.dataCount;
  533. param.value = serieData.GetData(dimension);
  534. param.ignore = ignore;
  535. param.total = serie.yTotal;
  536. param.color = chart.GetMarkColor(serie, serieData);
  537. param.marker = SerieHelper.GetItemMarker(serie, serieData, marker);
  538. param.itemFormatter = itemFormatter;
  539. param.numericFormatter = SerieHelper.GetNumericFormatter(serie, serieData, numericFormatter);
  540. param.columns.Clear();
  541. param.columns.Add(param.marker);
  542. param.columns.Add(showCategory ? category : serie.serieName);
  543. param.columns.Add(ignore ? ignoreDataDefaultContent : ChartCached.NumberToStr(param.value, param.numericFormatter));
  544. paramList.Add(param);
  545. }
  546. protected void UpdateItemSerieParams(ref List<SerieParams> paramList, ref string title,
  547. int dataIndex, string category, string marker,
  548. string itemFormatter, string numericFormatter, string ignoreDataDefaultContent,
  549. int dimension = 1, int colorIndex = -1)
  550. {
  551. if (dataIndex < 0)
  552. dataIndex = serie.context.pointerItemDataIndex;
  553. if (dataIndex < 0)
  554. return;
  555. var serieData = serie.GetSerieData(dataIndex);
  556. if (serieData == null)
  557. return;
  558. var ignore = serie.IsIgnoreValue(serieData, dimension);
  559. if (ignore && string.IsNullOrEmpty(ignoreDataDefaultContent))
  560. return;
  561. itemFormatter = SerieHelper.GetItemFormatter(serie, serieData, itemFormatter);
  562. if (serie.placeHolder || TooltipHelper.IsIgnoreFormatter(itemFormatter))
  563. return;
  564. if (colorIndex < 0)
  565. colorIndex = serie.colorByData ? dataIndex : chart.GetLegendRealShowNameIndex(serieData.name);
  566. Color32 color, toColor;
  567. SerieHelper.GetItemColor(out color, out toColor, serie, serieData, chart.theme, colorIndex, SerieState.Normal);
  568. var param = serie.context.param;
  569. param.serieName = serie.serieName;
  570. param.serieIndex = serie.index;
  571. param.category = category;
  572. param.dimension = dimension;
  573. param.serieData = serieData;
  574. param.dataCount = serie.dataCount;
  575. param.value = serieData.GetData(param.dimension);
  576. param.ignore = ignore;
  577. param.total = serie.multiDimensionLabel ? serieData.GetTotalData() : serie.GetDataTotal(defaultDimension);
  578. param.color = color;
  579. param.marker = SerieHelper.GetItemMarker(serie, serieData, marker);
  580. param.itemFormatter = itemFormatter;
  581. param.numericFormatter = SerieHelper.GetNumericFormatter(serie, serieData, numericFormatter);
  582. param.columns.Clear();
  583. param.columns.Add(param.marker);
  584. param.columns.Add(serieData.name);
  585. param.columns.Add(ignore ? ignoreDataDefaultContent : ChartCached.NumberToStr(param.value, param.numericFormatter));
  586. paramList.Add(param);
  587. }
  588. public void DrawLabelLineSymbol(VertexHelper vh, LabelLine labelLine, Vector3 startPos, Vector3 endPos, Color32 defaultColor)
  589. {
  590. if (labelLine.startSymbol != null && labelLine.startSymbol.show)
  591. {
  592. DrawSymbol(vh, labelLine.startSymbol, startPos, defaultColor);
  593. }
  594. if (labelLine.endSymbol != null && labelLine.endSymbol.show)
  595. {
  596. DrawSymbol(vh, labelLine.endSymbol, endPos, defaultColor);
  597. }
  598. }
  599. private void DrawSymbol(VertexHelper vh, SymbolStyle symbol, Vector3 pos, Color32 defaultColor)
  600. {
  601. var color = symbol.GetColor(defaultColor);
  602. chart.DrawSymbol(vh, symbol.type, symbol.size, 1, pos,
  603. color, color, ColorUtil.clearColor32, color, symbol.gap, null);
  604. }
  605. public override void OnPointerDown(PointerEventData eventData)
  606. {
  607. if (serie.onDown == null && chart.onSerieDown == null) return;
  608. if (!serie.context.pointerEnter) return;
  609. var dataIndex = GetPointerItemDataIndex();
  610. if (dataIndex < 0) return;
  611. var dimension = GetPointerItemDataDimension();
  612. var value = serie.GetData(dataIndex, dimension);
  613. var data = SerieEventDataPool.Get(chart.pointerPos, serie.index, dataIndex, dimension, value);
  614. if (chart.onSerieDown != null)
  615. chart.onSerieDown(data);
  616. if (serie.onDown != null)
  617. serie.onDown(data);
  618. SerieEventDataPool.Release(data);
  619. }
  620. public override void OnPointerClick(PointerEventData eventData)
  621. {
  622. if (serie.onClick == null && chart.onSerieClick == null) return;
  623. if (!serie.context.pointerEnter) return;
  624. var dataIndex = GetPointerItemDataIndex();
  625. if (dataIndex < 0) return;
  626. var dimension = GetPointerItemDataDimension();
  627. var value = serie.GetData(dataIndex, dimension);
  628. var data = SerieEventDataPool.Get(chart.pointerPos, serie.index, dataIndex, dimension, value);
  629. if (chart.onSerieClick != null)
  630. chart.onSerieClick(data);
  631. if (serie.onClick != null)
  632. serie.onClick(data);
  633. SerieEventDataPool.Release(data);
  634. }
  635. public override int GetPointerItemDataIndex()
  636. {
  637. return serie.context.pointerItemDataIndex;
  638. }
  639. public override int GetPointerItemDataDimension()
  640. {
  641. return serie.context.pointerItemDataDimension;
  642. }
  643. }
  644. }