SerieHandler.cs 33 KB

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