123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.UI;
- using XUGL;
-
- namespace XCharts.Runtime
- {
- [UnityEngine.Scripting.Preserve]
- internal sealed class MarkAreaHandler : MainComponentHandler<MarkArea>
- {
- private GameObject m_MarkLineLabelRoot;
- private bool m_NeedUpdateLabelPosition;
-
- public override void InitComponent()
- {
- m_MarkLineLabelRoot = ChartHelper.AddObject("markarea" + component.index, chart.transform, chart.chartMinAnchor,
- chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta);
- m_MarkLineLabelRoot.hideFlags = chart.chartHideFlags;
- ChartHelper.HideAllObject(m_MarkLineLabelRoot);
- InitMarkArea(component);
- }
-
- public override void DrawBase(VertexHelper vh)
- {
- DrawMarkArea(vh, component);
- }
-
- public override void Update()
- {
- if (m_NeedUpdateLabelPosition)
- {
- m_NeedUpdateLabelPosition = false;
- if (component.runtimeLabel != null)
- {
- component.runtimeLabel.SetPosition(component.runtimeLabelPosition);
- }
- }
- }
-
- private void InitMarkArea(MarkArea markArea)
- {
- markArea.painter = chart.m_PainterUpper;
- markArea.refreshComponent = delegate()
- {
- var label = ChartHelper.AddChartLabel("label", m_MarkLineLabelRoot.transform, markArea.label, chart.theme.axis,
- component.text, Color.clear, TextAnchor.MiddleCenter);
- UpdateRuntimeData(component);
- label.SetActive(markArea.label.show);
- label.SetPosition(component.runtimeLabelPosition);
- label.SetText(component.text);
- markArea.runtimeLabel = label;
- };
- markArea.refreshComponent();
- }
-
- private void DrawMarkArea(VertexHelper vh, MarkArea markArea)
- {
- if (!markArea.show) return;
- var serie = chart.GetSerie(markArea.serieIndex);
- if (serie == null || !serie.show || !markArea.show) return;
-
- UpdateRuntimeData(markArea);
-
- var colorIndex = chart.GetLegendRealShowNameIndex(serie.legendName);
- var serieColor = SerieHelper.GetLineColor(serie, null, chart.theme, colorIndex, SerieState.Normal);
- var areaColor = markArea.itemStyle.GetColor(serieColor);
- UGL.DrawRectangle(vh, markArea.runtimeRect, areaColor, areaColor);
- }
-
- private void UpdateRuntimeData(MarkArea markArea)
- {
- var serie = chart.GetSerie(markArea.serieIndex);
- if (serie == null || !serie.show || !markArea.show) return;
- var yAxis = chart.GetChartComponent<YAxis>(serie.yAxisIndex);
- var xAxis = chart.GetChartComponent<XAxis>(serie.xAxisIndex);
- var grid = chart.GetChartComponent<GridCoord>(xAxis.gridIndex);
- var dataZoom = chart.GetDataZoomOfAxis(xAxis);
- var showData = serie.GetDataList(dataZoom);
-
- var lt = GetPosition(markArea.start, serie, dataZoom, xAxis, yAxis, grid, showData, true);
- var rb = GetPosition(markArea.end, serie, dataZoom, xAxis, yAxis, grid, showData, false);
- var lb = new Vector3(lt.x, rb.y);
-
- markArea.runtimeRect = new Rect(lb.x, lb.y, rb.x - lb.x, lt.y - lb.y);
- UpdateLabelPosition(markArea);
- }
-
- private void UpdateLabelPosition(MarkArea markArea)
- {
- if (!markArea.label.show) return;
- m_NeedUpdateLabelPosition = true;
- var rect = markArea.runtimeRect;
- switch (markArea.label.position)
- {
- case LabelStyle.Position.Center:
- markArea.runtimeLabelPosition = rect.center;
- break;
- case LabelStyle.Position.Left:
- markArea.runtimeLabelPosition = rect.center + new Vector2(rect.width / 2, 0);
- break;
- case LabelStyle.Position.Right:
- markArea.runtimeLabelPosition = rect.center - new Vector2(rect.width / 2, 0);
- break;
- case LabelStyle.Position.Top:
- markArea.runtimeLabelPosition = rect.center + new Vector2(0, rect.height / 2);
- break;
- case LabelStyle.Position.Bottom:
- markArea.runtimeLabelPosition = rect.center - new Vector2(0, rect.height / 2);
- break;
- default:
- markArea.runtimeLabelPosition = rect.center + new Vector2(0, rect.height / 2);
- break;
- }
- markArea.runtimeLabelPosition += markArea.label.offset;
- }
-
- private Vector3 GetPosition(MarkAreaData data, Serie serie, DataZoom dataZoom, XAxis xAxis, YAxis yAxis,
- GridCoord grid, List<SerieData> showData, bool start)
- {
- var pos = Vector3.zero;
- switch (data.type)
- {
- case MarkAreaType.Min:
- data.runtimeValue = SerieHelper.GetMinData(serie, data.dimension, dataZoom);
- return GetPosition(xAxis, yAxis, grid, data.runtimeValue, start);
- case MarkAreaType.Max:
- data.runtimeValue = SerieHelper.GetMaxData(serie, data.dimension, dataZoom);
- return GetPosition(xAxis, yAxis, grid, data.runtimeValue, start);
- case MarkAreaType.Average:
- data.runtimeValue = SerieHelper.GetAverageData(serie, data.dimension, dataZoom);
- return GetPosition(xAxis, yAxis, grid, data.runtimeValue, start);
- case MarkAreaType.Median:
- data.runtimeValue = SerieHelper.GetMedianData(serie, data.dimension, dataZoom);
- return GetPosition(xAxis, yAxis, grid, data.runtimeValue, start);
- case MarkAreaType.None:
- if (data.xPosition != 0 || data.yPosition != 0)
- {
- var pX = grid.context.x + data.xPosition;
- var pY = grid.context.y + data.yPosition;
- return new Vector3(pX, pY);
- }
- else if (data.yValue != 0)
- {
- data.runtimeValue = data.yValue;
- if (yAxis.IsCategory())
- {
- var pY = AxisHelper.GetAxisPosition(grid, yAxis, data.yValue, showData.Count, dataZoom);
- return start ?
- new Vector3(grid.context.x, pY) :
- new Vector3(grid.context.x + grid.context.width, pY);
- }
- else
- {
- return GetPosition(xAxis, yAxis, grid, data.runtimeValue, start);
- }
- }
- else
- {
- data.runtimeValue = data.xValue;
- if (xAxis.IsCategory())
- {
- var pX = AxisHelper.GetAxisPosition(grid, xAxis, data.xValue, showData.Count, dataZoom);
- return start ? new Vector3(pX, grid.context.y + grid.context.height) :
- new Vector3(pX, grid.context.y);
- }
- else
- {
- return GetPosition(xAxis, yAxis, grid, data.xValue, start);
- }
- }
- default:
- break;
- }
- return pos;
- }
-
- private Vector3 GetPosition(Axis xAxis, Axis yAxis, GridCoord grid, double value, bool start)
- {
- if (yAxis.IsCategory())
- {
- var pX = AxisHelper.GetAxisPosition(grid, xAxis, value);
- return start ?
- new Vector3(pX, grid.context.y + grid.context.height) :
- new Vector3(pX, grid.context.y);
- }
- else
- {
- var pY = AxisHelper.GetAxisPosition(grid, yAxis, value);
- return start ?
- new Vector3(grid.context.x, pY + grid.context.height) :
- new Vector3(grid.context.x + grid.context.width, pY);
- }
- }
- }
- }
|