11 using System.Collections.Generic;
13 using UnityEngine.EventSystems;
34 public partial class BaseChart : BaseGraph
36 protected static readonly
string s_TitleObjectName =
"title";
37 protected static readonly
string s_SubTitleObjectName =
"title_sub";
38 protected static readonly
string s_LegendObjectName =
"legend";
39 protected static readonly
string s_SerieLabelObjectName =
"label";
40 protected static readonly
string s_SerieTitleObjectName =
"serie";
42 [SerializeField]
protected string m_ChartName;
43 [SerializeField]
protected ChartTheme m_Theme;
44 [SerializeField]
protected Settings m_Settings;
45 [SerializeField]
protected List<Title> m_Titles =
new List<Title>() { Title.defaultTitle };
46 [SerializeField]
protected List<Legend> m_Legends =
new List<Legend>() { Legend.defaultLegend };
47 [SerializeField]
protected List<Tooltip> m_Tooltips =
new List<Tooltip>() { Tooltip.defaultTooltip };
49 [SerializeField]
protected List<Grid> m_Grids =
new List<Grid>();
50 [SerializeField]
protected List<XAxis> m_XAxes =
new List<XAxis>();
51 [SerializeField]
protected List<YAxis> m_YAxes =
new List<YAxis>();
52 [SerializeField]
protected List<DataZoom> m_DataZooms =
new List<DataZoom>();
53 [SerializeField]
protected List<VisualMap> m_VisualMaps =
new List<VisualMap>();
54 [SerializeField]
protected List<Vessel> m_Vessels =
new List<Vessel>();
55 [SerializeField]
protected List<Polar> m_Polars =
new List<Polar>();
56 [SerializeField]
protected List<RadiusAxis> m_RadiusAxes =
new List<RadiusAxis>();
57 [SerializeField]
protected List<AngleAxis> m_AngleAxes =
new List<AngleAxis>();
58 [SerializeField]
protected List<Radar> m_Radars =
new List<Radar>();
60 [SerializeField]
protected Series m_Series = Series.defaultSeries;
62 protected float m_ChartWidth;
63 protected float m_ChartHeight;
64 protected float m_ChartX;
65 protected float m_ChartY;
66 protected Vector3 m_ChartPosition = Vector3.zero;
67 protected Vector2 m_ChartMinAnchor;
68 protected Vector2 m_ChartMaxAnchor;
69 protected Vector2 m_ChartPivot;
70 protected Vector2 m_ChartSizeDelta;
71 protected Rect m_ChartRect =
new Rect(0, 0, 0, 0);
72 protected Action<VertexHelper> m_OnCustomDrawBaseCallback;
73 protected Action<VertexHelper> m_OnCustomDrawTopCallback;
74 protected Action<VertexHelper, Serie> m_OnCustomDrawSerieBeforeCallback;
75 protected Action<VertexHelper, Serie> m_OnCustomDrawSerieAfterCallback;
76 protected Action<PointerEventData, int, int> m_OnPointerClickPie;
78 protected bool m_RefreshLabel =
false;
79 internal bool m_ReinitLabel =
false;
80 internal bool m_ReinitTitle =
false;
81 internal bool m_CheckAnimation =
false;
82 internal bool m_IsPlayingAnimation =
false;
83 internal protected List<string> m_LegendRealShowName =
new List<string>();
84 protected List<Painter> m_PainterList =
new List<Painter>();
85 internal Painter m_PainterTop;
86 protected GameObject m_SerieLabelRoot;
87 private Theme m_CheckTheme = 0;
89 protected List<IDrawSerie> m_DrawSeries =
new List<IDrawSerie>();
90 protected List<IComponentHandler> m_ComponentHandlers =
new List<IComponentHandler>();
92 protected override void InitComponent()
100 m_DrawSeries.Clear();
101 m_DrawSeries.Add(
new DrawSeriePie(
this));
102 m_DrawSeries.Add(
new DrawSerieRing(
this));
103 m_DrawSeries.Add(
new DrawSerieGauge(
this));
104 m_DrawSeries.Add(
new DrawSerieLiquid(
this));
105 m_DrawSeries.Add(
new DrawSerieRadar(
this));
106 foreach (var draw
in m_DrawSeries) draw.InitComponent();
108 m_ComponentHandlers.Clear();
109 m_ComponentHandlers.Add(
new VisualMapHandler(
this));
110 m_ComponentHandlers.Add(
new DataZoomHandler(
this));
111 foreach (var draw
in m_ComponentHandlers) draw.Init();
114 protected override void Awake()
116 if (m_Settings ==
null) m_Settings = Settings.DefaultSettings;
117 if (m_Series ==
null) m_Series = Series.defaultSeries; ;
118 if (m_Titles.Count == 0) m_Titles =
new List<Title>() { Title.defaultTitle };
119 if (m_Legends.Count == 0) m_Legends =
new List<Legend>() { Legend.defaultLegend };
120 if (m_Tooltips.Count == 0) m_Tooltips =
new List<Tooltip>() { Tooltip.defaultTooltip };
125 XChartsMgr.Instance.AddChart(
this);
129 protected override void Reset()
138 var sizeDelta = rectTransform.sizeDelta;
139 if (sizeDelta.x < 580 && sizeDelta.y < 300)
141 rectTransform.sizeDelta =
new Vector2(580, 300);
143 ChartHelper.HideAllObject(transform);
148 protected override void Start()
153 protected override void Update()
161 Internal_CheckAnimation();
162 foreach (var draw
in m_DrawSeries) draw.Update();
163 foreach (var draw
in m_ComponentHandlers) draw.Update();
166 public Painter GetPainter(
int index)
168 if (index >= 0 && index < m_PainterList.Count)
170 return m_PainterList[index];
175 public void RefreshBasePainter()
179 public void RefreshTopPainter()
181 m_PainterTop.Refresh();
184 public void RefreshPainter(
int index)
186 var painter = GetPainter(index);
187 RefreshPainter(painter);
190 public void RefreshPainter(Serie serie)
192 RefreshPainter(GetPainterIndexBySerie(serie));
195 internal override void RefreshPainter(Painter painter)
197 base.RefreshPainter(painter);
198 if (painter !=
null && painter.type == Painter.Type.Serie)
200 m_PainterTop.Refresh();
204 public void SetPainterActive(
int index,
bool flag)
206 var painter = GetPainter(index);
207 if (painter ==
null)
return;
208 painter.SetActive(flag, m_DebugMode);
211 protected virtual void CheckTheme()
215 m_Theme = ChartTheme.Default;
219 if (m_Theme.colorPalette.Count == 0)
221 m_Theme.ResetTheme();
223 if (m_CheckTheme != m_Theme.theme)
225 m_CheckTheme = m_Theme.theme;
226 m_Theme.CopyTheme(m_CheckTheme);
228 UnityEditor.EditorUtility.SetDirty(
this);
230 SetAllComponentDirty();
235 protected override void CheckComponent()
237 base.CheckComponent();
238 if (m_Series.anyDirty)
240 if (SeriesHelper.IsLabelDirty(m_Series)) m_ReinitLabel =
true;
241 if (SeriesHelper.IsNeedLabelUpdate(m_Series) && !m_RefreshChart) m_RefreshLabel =
true;
242 foreach (var serie
in m_Series.list)
244 if (serie.titleStyle.componentDirty) m_ReinitTitle =
true;
249 serie.ClearNameDirty();
251 if (serie.vertsDirty)
253 RefreshPainter(serie);
256 m_Series.ClearDirty();
258 if (m_Theme.anyDirty)
260 if (m_Theme.componentDirty)
262 foreach (var
title in m_Titles)
title.SetAllDirty();
267 m_Theme.ClearDirty();
270 foreach (var component
in m_Titles) CheckComponentDirty(component);
271 foreach (var component
in m_Legends) CheckComponentDirty(component);
272 foreach (var component
in m_Tooltips) CheckComponentDirty(component);
273 foreach (var component
in m_DataZooms) CheckComponentDirty(component);
274 foreach (var component
in m_VisualMaps) CheckComponentDirty(component);
275 foreach (var component
in m_Grids) CheckComponentDirty(component);
276 foreach (var component
in m_XAxes) CheckComponentDirty(component);
277 foreach (var component
in m_YAxes) CheckComponentDirty(component);
278 foreach (var component
in m_Vessels) CheckComponentDirty(component);
279 foreach (var component
in m_Polars) CheckComponentDirty(component);
280 foreach (var component
in m_AngleAxes) CheckComponentDirty(component);
281 foreach (var component
in m_RadiusAxes) CheckComponentDirty(component);
282 foreach (var component
in m_Radars) CheckComponentDirty(component);
283 foreach (var drawSerie
in m_DrawSeries) drawSerie.CheckComponent();
286 protected override void SetAllComponentDirty()
288 base.SetAllComponentDirty();
289 m_Theme.SetAllDirty();
290 foreach (var component
in m_Titles) component.SetAllDirty();
291 foreach (var component
in m_Legends) component.SetAllDirty();
292 foreach (var component
in m_Tooltips) component.SetAllDirty();
293 foreach (var component
in m_Grids) component.SetAllDirty();
294 foreach (var component
in m_XAxes) component.SetAllDirty();
295 foreach (var component
in m_YAxes) component.SetAllDirty();
296 foreach (var component
in m_DataZooms) component.SetAllDirty();
297 foreach (var component
in m_VisualMaps) component.SetAllDirty();
298 foreach (var component
in m_Vessels) component.SetAllDirty();
299 foreach (var component
in m_Polars) component.SetAllDirty();
300 foreach (var component
in m_RadiusAxes) component.SetAllDirty();
301 foreach (var component
in m_AngleAxes) component.SetAllDirty();
302 foreach (var component
in m_Radars) component.SetAllDirty();
303 m_ReinitLabel =
true;
304 m_ReinitTitle =
true;
305 m_RefreshChart =
true;
308 protected override void OnDestroy()
310 for (
int i = transform.childCount - 1; i >= 0; i--)
312 DestroyImmediate(transform.GetChild(i).gameObject);
316 protected virtual void CheckPainter()
318 for (
int i = 0; i < m_Series.Count; i++)
320 var serie = m_Series.GetSerie(i);
322 SetPainterActive(i,
true);
326 protected override void InitPainter()
330 m_PainterList.Clear();
332 var sizeDelta =
new Vector2(m_GraphWidth, m_GraphHeight);
336 var painter = ChartHelper.AddPainterObject(
"painter_" + index, transform, m_GraphMinAnchor,
337 m_GraphMaxAnchor, m_GraphPivot, sizeDelta, chartHideFlags, 2 + index);
338 painter.index = m_PainterList.Count;
339 painter.type = Painter.Type.Serie;
340 painter.onPopulateMesh = OnDrawPainterSerie;
341 painter.SetActive(
false, m_DebugMode);
343 m_PainterList.Add(painter);
345 m_PainterTop = ChartHelper.AddPainterObject(
"painter_t", transform, m_GraphMinAnchor,
347 m_PainterTop.type = Painter.Type.Top;
348 m_PainterTop.onPopulateMesh = OnDrawPainterTop;
349 m_PainterTop.SetActive(
true, m_DebugMode);
353 private void InitTitles()
355 for (
int i = 0; i < m_Titles.Count; i++)
357 var
title = m_Titles[i];
362 private void InitTitle(Title
title)
364 title.painter =
null;
365 title.refreshComponent = delegate ()
371 var titleObject = ChartHelper.AddObject(s_TitleObjectName +
title.index, transform, anchorMin, anchorMax,
372 pivot, m_ChartSizeDelta);
373 title.gameObject = titleObject;
380 ChartHelper.UpdateRectTransform(titleObject, anchorMin, anchorMax, pivot,
new Vector2(
chartWidth,
chartHeight));
381 var titlePosition = GetTitlePosition(
title);
382 var subTitlePosition = -
new Vector3(0, fontSize +
title.
itemGap, 0);
385 titleObject.transform.localPosition = titlePosition;
386 titleObject.hideFlags = chartHideFlags;
387 ChartHelper.HideAllObject(titleObject);
389 var titleText = ChartHelper.AddTextObject(s_TitleObjectName, titleObject.transform, anchorMin, anchorMax,
392 titleText.SetLocalPosition(Vector3.zero +
title.
textStyle.offsetv3);
395 var subText = ChartHelper.AddTextObject(s_SubTitleObjectName, titleObject.transform, anchorMin, anchorMax,
402 title.refreshComponent();
405 private void InitLegends()
407 for (
int i = 0; i < m_Legends.Count; i++)
409 var
legend = m_Legends[i];
415 private void InitLegend(Legend
legend)
418 legend.refreshComponent = delegate ()
421 var legendObject = ChartHelper.AddObject(s_LegendObjectName +
legend.index, transform, m_ChartMinAnchor,
422 m_ChartMaxAnchor, m_ChartPivot, m_ChartSizeDelta);
423 legend.gameObject = legendObject;
424 legendObject.hideFlags = chartHideFlags;
425 SeriesHelper.UpdateSerieNameList(
this, ref m_LegendRealShowName);
429 datas =
new List<string>();
430 for (
int i = 0; i < m_LegendRealShowName.Count; i++)
432 if (
legend.
data.Contains(m_LegendRealShowName[i])) datas.Add(m_LegendRealShowName[i]);
437 datas = m_LegendRealShowName;
440 for (
int i = 0; i < datas.Count; i++)
442 if (!SeriesHelper.IsLegalLegendName(datas[i]))
continue;
446 ChartHelper.HideAllObject(legendObject);
448 for (
int i = 0; i < datas.Count; i++)
450 if (!SeriesHelper.IsLegalLegendName(datas[i]))
continue;
452 var readIndex = m_LegendRealShowName.IndexOf(datas[i]);
454 var bgColor = LegendHelper.GetIconColor(
this, readIndex, datas[i], active);
455 var item = LegendHelper.AddLegendItem(
legend, i, datas[i], legendObject.transform, m_Theme,
456 legendName, bgColor, active, readIndex);
458 ChartHelper.ClearEventListener(item.button.gameObject);
459 ChartHelper.AddEventListener(item.button.gameObject, EventTriggerType.PointerDown, (data) =>
461 if (data.selectedObject == null || legend.selectedMode == Legend.SelectedMode.None) return;
462 var temp = data.selectedObject.name.Split(
'_');
463 string selectedName = temp[1];
464 int clickedIndex = int.Parse(temp[0]);
465 if (legend.selectedMode == Legend.SelectedMode.Multiple)
467 OnLegendButtonClick(clickedIndex, selectedName, !IsActiveByLegend(selectedName));
471 var btnList = legend.buttonList.Values.ToArray();
472 if (btnList.Length == 1)
474 OnLegendButtonClick(0, selectedName, !IsActiveByLegend(selectedName));
478 for (int n = 0; n < btnList.Length; n++)
480 temp = btnList[n].name.Split(
'_');
481 selectedName = btnList[n].legendName;
482 var index = btnList[n].index;
483 OnLegendButtonClick(n, selectedName, index == clickedIndex ? true : false);
488 ChartHelper.AddEventListener(item.button.gameObject, EventTriggerType.PointerEnter, (data) =>
490 if (item.button == null) return;
491 var temp = item.button.name.Split(
'_');
492 string selectedName = temp[1];
493 int index = int.Parse(temp[0]);
494 OnLegendButtonEnter(index, selectedName);
496 ChartHelper.AddEventListener(item.button.gameObject, EventTriggerType.PointerExit, (data) =>
498 if (item.button == null) return;
499 var temp = item.button.name.Split(
'_');
500 string selectedName = temp[1];
501 int index = int.Parse(temp[0]);
502 OnLegendButtonExit(index, selectedName);
505 if (legend.selectedMode == Legend.SelectedMode.Single)
507 for (
int n = 0; n < m_LegendRealShowName.Count; n++)
509 OnLegendButtonClick(n, m_LegendRealShowName[n], n == 0 ?
true :
false);
512 LegendHelper.ResetItemPosition(legend, m_ChartPosition, m_ChartWidth, m_ChartHeight);
514 legend.refreshComponent();
517 private void InitSerieLabel()
519 m_SerieLabelRoot = ChartHelper.AddObject(s_SerieLabelObjectName, transform, m_ChartMinAnchor,
520 m_ChartMaxAnchor, m_ChartPivot, m_ChartSizeDelta);
521 m_SerieLabelRoot.hideFlags = chartHideFlags;
522 SerieLabelPool.ReleaseAll(m_SerieLabelRoot.transform);
524 for (
int i = 0; i < m_Series.Count; i++)
526 var serie = m_Series.list[i];
528 SerieHelper.UpdateCenter(serie, chartPosition, chartWidth, chartHeight);
529 for (
int j = 0; j < serie.data.Count; j++)
531 var serieData = serie.data[j];
532 serieData.index = count;
533 serieData.labelObject =
null;
534 AddSerieLabel(serie, serieData, ref count);
538 SerieLabelHelper.UpdateLabelText(m_Series, m_Theme, m_LegendRealShowName);
542 protected void AddSerieLabel(Serie serie, SerieData serieData, ref
int count)
544 if (m_SerieLabelRoot ==
null)
return;
545 if (count == -1) count = serie.dataCount;
546 var serieLabel = SerieHelper.GetSerieLabel(serie, serieData);
547 var serieEmphasisLable = SerieHelper.GetSerieEmphasisLabel(serie, serieData);
548 var iconStyle = SerieHelper.GetIconStyle(serie, serieData);
549 if (serie.IsPerformanceMode())
return;
550 if (!serieLabel.show && (serieEmphasisLable ==
null || !serieEmphasisLable.show) && !iconStyle.show)
return;
551 if (serie.animation.enable && serie.animation.HasFadeOut())
return;
552 var textName = ChartCached.GetSerieLabelName(s_SerieLabelObjectName, serie.index, serieData.index);
553 var color = Color.grey;
556 color = (serieLabel.position == SerieLabel.Position.Inside) ? Color.white :
557 (Color)m_Theme.GetColor(count);
561 color = !ChartHelper.IsClearColor(serieLabel.textStyle.color) ? serieLabel.textStyle.color :
562 (Color)m_Theme.GetColor(serie.index);
564 var labelObj = SerieLabelPool.Get(textName, m_SerieLabelRoot.transform, serieLabel, color,
565 iconStyle.width, iconStyle.height, theme);
566 var iconImage = labelObj.transform.Find(
"Icon").GetComponent<Image>();
567 var isAutoSize = serieLabel.backgroundWidth == 0 || serieLabel.backgroundHeight == 0;
568 var item =
new ChartLabel();
569 item.SetLabel(labelObj, isAutoSize, serieLabel.paddingLeftRight, serieLabel.paddingTopBottom);
570 item.SetIcon(iconImage);
571 item.SetIconActive(iconStyle.show);
572 serieData.labelObject = item;
574 foreach (var dataIndex
in serieData.children)
576 AddSerieLabel(serie, serie.GetSerieData(dataIndex), ref count);
581 private void InitSerieTitle()
583 var titleObject = ChartHelper.AddObject(s_SerieTitleObjectName, transform, m_ChartMinAnchor,
584 m_ChartMaxAnchor, m_ChartPivot,
new Vector2(chartWidth, chartHeight));
585 titleObject.hideFlags = chartHideFlags;
586 ChartHelper.HideAllObject(titleObject);
587 for (
int i = 0; i < m_Series.Count; i++)
589 var serie = m_Series.list[i];
590 var textStyle = serie.titleStyle.textStyle;
591 var titleColor = ChartHelper.IsClearColor(textStyle.color) ? m_Theme.GetColor(i) : (Color32)textStyle.color;
592 var anchorMin =
new Vector2(0.5f, 0.5f);
593 var anchorMax =
new Vector2(0.5f, 0.5f);
594 var pivot =
new Vector2(0.5f, 0.5f);
596 var sizeDelta =
new Vector2(50, fontSize + 2);
597 var txt = ChartHelper.AddTextObject(
"title_" + i, titleObject.transform, anchorMin, anchorMax,
598 pivot, sizeDelta, textStyle, theme.common);
600 txt.SetColor(titleColor);
601 txt.SetLocalPosition(Vector2.zero);
602 txt.SetLocalEulerAngles(Vector2.zero);
603 txt.SetActive(serie.titleStyle.show);
604 serie.titleStyle.runtimeText = txt;
605 serie.titleStyle.UpdatePosition(serie.runtimeCenterPos);
606 var serieData = serie.GetSerieData(0);
607 if (serieData !=
null)
609 txt.SetText(serieData.name);
614 private void InitTooltip()
616 tooltip.painter = m_PainterTop;
617 tooltip.refreshComponent = delegate ()
619 tooltip.gameObject = ChartHelper.AddObject(
"tooltip", transform, m_ChartMinAnchor,
620 m_ChartMaxAnchor, m_ChartPivot, m_ChartSizeDelta);
621 var tooltipObject = tooltip.gameObject;
622 tooltipObject.transform.localPosition = Vector3.zero;
623 tooltipObject.hideFlags = chartHideFlags;
624 DestroyImmediate(tooltipObject.GetComponent<Image>());
625 var parent = tooltipObject.transform;
626 var textStyle = tooltip.textStyle;
627 ChartHelper.HideAllObject(tooltipObject.transform);
628 GameObject content = ChartHelper.AddTooltipContent(
"content", parent, textStyle, m_Theme);
629 tooltip.SetObj(tooltipObject);
630 tooltip.SetContentObj(content);
631 tooltip.SetContentBackgroundColor(TooltipHelper.GetTexBackgroundColor(tooltip, m_Theme.tooltip));
632 tooltip.SetContentTextColor(TooltipHelper.GetTexColor(tooltip, m_Theme.tooltip));
633 tooltip.SetActive(
false);
635 tooltip.refreshComponent();
638 private Vector3 GetLegendPosition(Legend legend,
int i)
640 return legend.location.GetPosition(chartWidth, chartHeight);
643 protected override bool IsNeedCheckPointerPos()
645 return (tooltip.show && tooltip.runtimeInited)
649 private void CheckTooltip()
651 if (!isPointerInChart || !tooltip.show || !tooltip.runtimeInited)
653 if (tooltip.IsActive())
655 tooltip.ClearValue();
656 tooltip.SetActive(
false);
657 m_PainterTop.Refresh();
661 for (
int i = 0; i < tooltip.runtimeDataIndex.Count; i++)
663 tooltip.runtimeDataIndex[i] = -1;
665 Vector2 local = pointerPos;
666 if (canvas ==
null)
return;
668 if (local == Vector2.zero)
670 if (tooltip.IsActive())
672 tooltip.SetActive(
false);
673 m_PainterTop.Refresh();
677 if (!IsInChart(local))
679 if (tooltip.IsActive())
681 tooltip.SetActive(
false);
682 m_PainterTop.Refresh();
686 tooltip.runtimePointerPos = local;
687 CheckAllTooptip(local);
690 private void CheckAllTooptip(Vector2 localPostion)
692 tooltip.runtimeGridIndex = -1;
694 foreach (var draw
in m_DrawSeries)
695 actived = actived || draw.CheckTootipArea(localPostion);
696 CheckTootipArea(localPostion, actived);
699 protected virtual void CheckTootipArea(Vector2 localPostion,
bool isActivedOther)
703 protected override void CheckRefreshChart()
705 if (m_Painter ==
null)
return;
709 foreach (var painter
in m_PainterList) painter.Refresh();
710 if (m_PainterTop !=
null) m_PainterTop.Refresh();
711 m_RefreshChart =
false;
715 protected override void CheckRefreshPainter()
717 if (m_Painter ==
null)
return;
718 m_Painter.CheckRefresh();
719 foreach (var painter
in m_PainterList) painter.CheckRefresh();
720 if (m_PainterTop !=
null) m_PainterTop.CheckRefresh();
723 protected void CheckRefreshLabel()
727 m_ReinitLabel =
false;
728 SeriesHelper.UpdateSerieNameList(
this, ref m_LegendRealShowName);
733 m_ReinitTitle =
false;
738 m_RefreshLabel =
false;
743 public void Internal_CheckAnimation()
745 if (!m_CheckAnimation)
747 m_CheckAnimation =
true;
752 protected virtual void OnRefreshLabel()
754 foreach (var drawSerie
in m_DrawSeries) drawSerie.RefreshLabel();
757 protected override void OnSizeChanged()
759 base.OnSizeChanged();
760 m_ChartWidth = m_GraphWidth;
761 m_ChartHeight = m_GraphHeight;
764 m_ChartPosition = m_GraphPosition;
765 m_ChartMinAnchor = m_GraphMinAnchor;
766 m_ChartMaxAnchor = m_GraphMaxAnchor;
767 m_ChartPivot = m_GraphPivot;
768 m_ChartSizeDelta = m_GraphSizeDelta;
769 m_ChartRect = m_GraphRect;
771 SetAllComponentDirty();
772 m_Series.SetLabelDirty();
773 m_ReinitLabel =
true;
777 protected override void OnLocalPositionChanged()
779 m_Background.SetAllDirty();
782 protected virtual void OnThemeChanged()
786 protected virtual void OnYMaxValueChanged()
790 public virtual void OnDataZoomRangeChanged(DataZoom dataZoom)
794 public override void OnPointerDown(PointerEventData eventData)
796 base.OnPointerDown(eventData);
797 foreach (var drawSerie
in m_DrawSeries) drawSerie.OnPointerDown(eventData);
798 foreach (var handler
in m_ComponentHandlers) handler.OnPointerDown(eventData);
801 public override void OnBeginDrag(PointerEventData eventData)
803 base.OnBeginDrag(eventData);
804 foreach (var handler
in m_ComponentHandlers) handler.OnBeginDrag(eventData);
807 public override void OnDrag(PointerEventData eventData)
809 base.OnDrag(eventData);
810 foreach (var handler
in m_ComponentHandlers) handler.OnDrag(eventData);
813 public override void OnEndDrag(PointerEventData eventData)
815 base.OnEndDrag(eventData);
816 foreach (var handler
in m_ComponentHandlers) handler.OnEndDrag(eventData);
819 public override void OnScroll(PointerEventData eventData)
821 base.OnScroll(eventData);
822 foreach (var handler
in m_ComponentHandlers) handler.OnScroll(eventData);
825 protected virtual void OnLegendButtonClick(
int index,
string legendName,
bool show)
828 foreach (var drawSerie
in m_DrawSeries)
829 clicked = clicked || drawSerie.OnLegendButtonClick(index, legendName, show);
832 foreach (var serie
in m_Series.GetSeries(legendName))
834 SetActive(serie.index, show);
835 RefreshPainter(serie);
837 OnYMaxValueChanged();
841 protected virtual void OnLegendButtonEnter(
int index,
string legendName)
844 foreach (var drawSerie
in m_DrawSeries)
845 enter = enter || drawSerie.OnLegendButtonEnter(index, legendName);
848 foreach (var serie
in m_Series.GetSeries(legendName))
850 serie.highlighted =
true;
851 RefreshPainter(serie);
856 protected virtual void OnLegendButtonExit(
int index,
string legendName)
859 foreach (var drawSerie
in m_DrawSeries)
860 exit = exit || drawSerie.OnLegendButtonExit(index, legendName);
863 foreach (var serie
in m_Series.GetSeries(legendName))
865 serie.highlighted =
false;
866 RefreshPainter(serie);
871 protected virtual void UpdateTooltip()
875 protected override void OnDrawPainterBase(VertexHelper vh, Painter painter)
880 foreach (var draw
in m_ComponentHandlers) draw.DrawBase(vh);
881 foreach (var draw
in m_DrawSeries) draw.DrawBase(vh);
882 if (m_OnCustomDrawBaseCallback !=
null)
884 m_OnCustomDrawBaseCallback(vh);
888 protected virtual void OnDrawPainterSerie(VertexHelper vh, Painter painter)
891 var maxPainter = settings.maxPainter;
892 var maxSeries = m_Series.Count;
893 var rate = Mathf.CeilToInt(maxSeries * 1.0f / maxPainter);
894 m_PainterTop.Refresh();
895 for (
int i = painter.index * rate; i < (painter.index + 1) * rate && i < maxSeries; i++)
897 var serie = m_Series.GetSerie(i);
898 if (m_OnCustomDrawSerieBeforeCallback !=
null)
900 m_OnCustomDrawSerieBeforeCallback.Invoke(vh, serie);
902 DrawPainterSerie(vh, serie);
903 if (m_OnCustomDrawSerieAfterCallback !=
null)
905 m_OnCustomDrawSerieAfterCallback(vh, serie);
908 m_RefreshLabel =
true;
911 protected virtual void OnDrawPainterTop(VertexHelper vh, Painter painter)
916 foreach (var draw
in m_ComponentHandlers) draw.DrawTop(vh);
917 if (m_OnCustomDrawTopCallback !=
null)
919 m_OnCustomDrawTopCallback(vh);
924 protected virtual void DrawPainterSerie(VertexHelper vh, Serie serie)
926 foreach (var drawSerie
in m_DrawSeries)
928 drawSerie.DrawSerie(vh, serie);
932 protected virtual void DrawPainterTop(VertexHelper vh)
936 protected virtual void DrawTooltip(VertexHelper vh)
940 protected override void DrawBackground(VertexHelper vh)
942 Vector3 p1 =
new Vector3(chartX, chartY + chartHeight);
943 Vector3 p2 =
new Vector3(chartX + chartWidth, chartY + chartHeight);
944 Vector3 p3 =
new Vector3(chartX + chartWidth, chartY);
945 Vector3 p4 =
new Vector3(chartX, chartY);
946 var backgroundColor = ThemeHelper.GetBackgroundColor(m_Theme, m_Background);
947 UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, backgroundColor);
950 protected virtual void DrawLegend(VertexHelper vh)
952 if (m_Series.Count == 0)
return;
953 foreach (var legend
in m_Legends)
955 if (!legend.show)
continue;
956 if (legend.iconType == Legend.Type.Custom)
continue;
957 foreach (var kv
in legend.buttonList)
960 var rect = item.GetIconRect();
961 var radius = Mathf.Min(rect.width, rect.height) / 2;
962 var color = item.GetIconColor();
963 var iconType = legend.iconType;
964 if (legend.iconType == Legend.Type.Auto)
966 var serie = m_Series.GetSerie(item.legendName);
967 if (serie !=
null && serie.type ==
SerieType.Line)
969 var sp =
new Vector3(rect.center.x - rect.width / 2, rect.center.y);
970 var ep =
new Vector3(rect.center.x + rect.width / 2, rect.center.y);
971 UGL.DrawLine(vh, sp, ep, m_Settings.legendIconLineWidth, color);
972 if (!serie.symbol.show)
continue;
973 switch (serie.symbol.type)
978 iconType = Legend.Type.Circle;
981 iconType = Legend.Type.Diamond;
984 iconType = Legend.Type.EmptyCircle;
987 iconType = Legend.Type.Rect;
990 iconType = Legend.Type.Triangle;
996 iconType = Legend.Type.Rect;
1001 case Legend.Type.Rect:
1002 var cornerRadius = m_Settings.legendIconCornerRadius;
1003 UGL.DrawRoundRectangle(vh, rect.center, rect.width, rect.height, color, color,
1004 0, cornerRadius,
false, 0.5f);
1006 case Legend.Type.Circle:
1007 UGL.DrawCricle(vh, rect.center, radius, color);
1009 case Legend.Type.Diamond:
1010 UGL.DrawDiamond(vh, rect.center, radius, color);
1012 case Legend.Type.EmptyCircle:
1013 var backgroundColor = ThemeHelper.GetBackgroundColor(m_Theme, m_Background);
1014 UGL.DrawEmptyCricle(vh, rect.center, radius, 2 * m_Settings.legendIconLineWidth,
1015 color, color, backgroundColor, 1f);
1017 case Legend.Type.Triangle:
1018 UGL.DrawTriangle(vh, rect.center, 1.2f * radius, color);
1025 public void DrawSymbol(VertexHelper vh, SerieSymbolType type,
float symbolSize,
1026 float tickness, Vector3 pos, Color32 color, Color32 toColor, Color32 fillColor,
float gap,
float[] cornerRadius)
1028 DrawSymbol(vh, type, symbolSize, tickness, pos, color, toColor, fillColor, gap, cornerRadius, Vector3.zero);
1031 public void DrawSymbol(VertexHelper vh, SerieSymbolType type,
float symbolSize,
1032 float tickness, Vector3 pos, Color32 color, Color32 toColor, Color32 fillColor,
float gap,
float[] cornerRadius, Vector3 startPos)
1034 var backgroundColor = ThemeHelper.GetBackgroundColor(m_Theme, m_Background);
1035 if (ChartHelper.IsClearColor(fillColor))
1036 fillColor = backgroundColor;
1037 var smoothness = settings.cicleSmoothness;
1038 ChartDrawer.DrawSymbol(vh, type, symbolSize, tickness, pos, color, toColor, gap,
1039 cornerRadius, fillColor, backgroundColor, smoothness, startPos);
1042 public void DrawLabelBackground(VertexHelper vh, Serie serie, SerieData serieData)
1044 if (serieData ==
null || serieData.labelObject ==
null)
return;
1045 var serieLabel = SerieHelper.GetSerieLabel(serie, serieData);
1046 if (!serieLabel.show)
return;
1047 var invert = serieLabel.autoOffset
1049 && SerieHelper.IsDownPoint(serie, serieData.index)
1050 && !serie.areaStyle.show;
1051 var centerPos = Vector3.zero;
1053 centerPos = SerieLabelHelper.GetRealLabelPosition(serieData, serieLabel);
1055 centerPos = serieData.labelPosition + serieLabel.offset * (invert ? -1 : 1);
1056 var labelHalfWid = serieData.labelObject.GetLabelWidth() / 2;
1057 var labelHalfHig = serieData.GetLabelHeight() / 2;
1058 var p1 =
new Vector3(centerPos.x - labelHalfWid, centerPos.y + labelHalfHig);
1059 var p2 =
new Vector3(centerPos.x + labelHalfWid, centerPos.y + labelHalfHig);
1060 var p3 =
new Vector3(centerPos.x + labelHalfWid, centerPos.y - labelHalfHig);
1061 var p4 =
new Vector3(centerPos.x - labelHalfWid, centerPos.y - labelHalfHig);
1063 if (serieLabel.textStyle.rotate > 0)
1065 p1 = ChartHelper.RotateRound(p1, centerPos, Vector3.forward, serieLabel.textStyle.rotate);
1066 p2 = ChartHelper.RotateRound(p2, centerPos, Vector3.forward, serieLabel.textStyle.rotate);
1067 p3 = ChartHelper.RotateRound(p3, centerPos, Vector3.forward, serieLabel.textStyle.rotate);
1068 p4 = ChartHelper.RotateRound(p4, centerPos, Vector3.forward, serieLabel.textStyle.rotate);
1071 UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, serieLabel.textStyle.backgroundColor);
1073 if (serieLabel.border)
1075 UGL.DrawBorder(vh, centerPos, serieData.GetLabelWidth(), serieData.GetLabelHeight(),
1076 serieLabel.borderWidth, serieLabel.borderColor, serieLabel.textStyle.rotate);
1080 protected int GetPainterIndexBySerie(Serie serie)
1082 var maxPainter = settings.maxPainter;
1083 var maxSeries = m_Series.Count;
1084 if (maxPainter >= maxSeries)
return serie.index;
1087 var rate = Mathf.CeilToInt(maxSeries * 1.0f / maxPainter);
1088 return serie.index / rate;