1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846 |
- /******************************************/
- /* */
- /* Copyright (c) 2021 monitor1394 */
- /* https://github.com/monitor1394 */
- /* */
- /******************************************/
- using UnityEngine;
- using UnityEngine.UI;
- using System.Collections.Generic;
- using System.Text;
- using XUGL;
- using System;
- namespace XCharts
- {
- public partial class CoordinateChart : BaseChart
- {
- private static readonly string s_DefaultDataZoom = "datazoom";
- private static readonly string s_DefaultAxisName = "name";
- protected override void InitComponent()
- {
- base.InitComponent();
- if (m_Grids.Count == 0) m_Grids = new List<Grid>() { Grid.defaultGrid };
- if (m_DataZooms.Count == 0) m_DataZooms = new List<DataZoom>() { DataZoom.defaultDataZoom };
- if (m_VisualMaps.Count == 0) m_VisualMaps = new List<VisualMap> { new VisualMap() };
- InitDefaultAxes();
- CheckMinMaxValue();
- InitGrid();
- InitDataZoom();
- InitAxisX();
- InitAxisY();
- tooltip.UpdateToTop();
- var handler = new MarkLineHandler(this);
- m_ComponentHandlers.Add(handler);
- handler.Init();
- }
- protected override void Update()
- {
- CheckMinMaxValue();
- CheckRaycastTarget();
- base.Update();
- }
- #if UNITY_EDITOR
- protected override void Reset()
- {
- base.Reset();
- m_Grids.Clear();
- m_DataZooms.Clear();
- m_VisualMaps.Clear();
- m_XAxes.Clear();
- m_YAxes.Clear();
- Awake();
- }
- #endif
- private void RefreshSeriePainterByGridIndex(int gridIndex)
- {
- foreach (var serie in m_Series.list)
- {
- var axis = GetXAxis(serie.xAxisIndex);
- if (axis == null) continue;
- var grid = GetGrid(axis.index);
- if (grid == null) continue;
- if (grid.index == gridIndex)
- {
- RefreshPainter(serie);
- }
- }
- }
- private void RefreshSeriePainterByAxisIndex(Axis axis)
- {
- var grid = GetGrid(axis.index);
- if (grid == null) return;
- RefreshSeriePainterByGridIndex(grid.index);
- }
- public override void OnDataZoomRangeChanged(DataZoom dataZoom)
- {
- foreach (var index in dataZoom.xAxisIndexs)
- {
- var axis = GetXAxis(index);
- if (axis != null && axis.show) axis.SetAllDirty();
- }
- foreach (var index in dataZoom.yAxisIndexs)
- {
- var axis = GetYAxis(index);
- if (axis != null && axis.show) axis.SetAllDirty();
- }
- }
- protected override void DrawPainterBase(VertexHelper vh)
- {
- base.DrawPainterBase(vh);
- if (!SeriesHelper.IsAnyClipSerie(m_Series))
- {
- DrawCoordinate(vh);
- }
- }
- protected override void DrawBackground(VertexHelper vh)
- {
- if (SeriesHelper.IsAnyClipSerie(m_Series))
- {
- var xLineDiff = xAxis0.axisLine.GetWidth(m_Theme.axis.lineWidth);
- var yLineDiff = yAxis0.axisLine.GetWidth(m_Theme.axis.lineWidth);
- var xSplitDiff = xAxis0.splitLine.GetWidth(m_Theme.axis.splitLineWidth);
- var ySplitDiff = yAxis0.splitLine.GetWidth(m_Theme.axis.splitLineWidth);
- foreach (var grid in m_Grids)
- {
- var cpty = grid.runtimeY + grid.runtimeHeight + ySplitDiff;
- var cp1 = new Vector3(grid.runtimeX - yLineDiff, grid.runtimeY - xLineDiff);
- var cp2 = new Vector3(grid.runtimeX - yLineDiff, cpty);
- var cp3 = new Vector3(grid.runtimeX + grid.runtimeWidth + xSplitDiff, cpty);
- var cp4 = new Vector3(grid.runtimeX + grid.runtimeWidth + xSplitDiff, grid.runtimeY - xLineDiff);
- var backgroundColor = ThemeHelper.GetBackgroundColor(m_Theme, m_Background);
- UGL.DrawQuadrilateral(vh, cp1, cp2, cp3, cp4, backgroundColor);
- }
- }
- else
- {
- base.DrawBackground(vh);
- }
- }
- protected void DrawClip(VertexHelper vh)
- {
- if (!SeriesHelper.IsAnyClipSerie(m_Series)) return;
- var xLineDiff = xAxis0.axisLine.GetWidth(m_Theme.axis.lineWidth);
- var yLineDiff = yAxis0.axisLine.GetWidth(m_Theme.axis.lineWidth);
- var xSplitDiff = xAxis0.splitLine.GetWidth(m_Theme.axis.splitLineWidth);
- var ySplitDiff = yAxis0.splitLine.GetWidth(m_Theme.axis.splitLineWidth);
- var backgroundColor = ThemeHelper.GetBackgroundColor(m_Theme, m_Background);
- var lp1 = new Vector3(m_ChartX, m_ChartY);
- var lp2 = new Vector3(m_ChartX, m_ChartY + chartHeight);
- var lp3 = new Vector3(grid.runtimeX - yLineDiff, m_ChartY + chartHeight);
- var lp4 = new Vector3(grid.runtimeX - yLineDiff, m_ChartY);
- UGL.DrawQuadrilateral(vh, lp1, lp2, lp3, lp4, backgroundColor);
- var rp1 = new Vector3(grid.runtimeX + grid.runtimeWidth, m_ChartY);
- var rp2 = new Vector3(grid.runtimeX + grid.runtimeWidth, m_ChartY + chartHeight);
- var rp3 = new Vector3(m_ChartX + chartWidth, m_ChartY + chartHeight);
- var rp4 = new Vector3(m_ChartX + chartWidth, m_ChartY);
- UGL.DrawQuadrilateral(vh, rp1, rp2, rp3, rp4, backgroundColor);
- var up1 = new Vector3(grid.runtimeX - yLineDiff, grid.runtimeY + grid.runtimeHeight + ySplitDiff);
- var up2 = new Vector3(grid.runtimeX - yLineDiff, m_ChartY + chartHeight);
- var up3 = new Vector3(grid.runtimeX + grid.runtimeWidth + xSplitDiff, m_ChartY + chartHeight);
- var up4 = new Vector3(grid.runtimeX + grid.runtimeWidth + xSplitDiff,
- grid.runtimeY + grid.runtimeHeight + ySplitDiff);
- UGL.DrawQuadrilateral(vh, up1, up2, up3, up4, backgroundColor);
- var dp1 = new Vector3(grid.runtimeX - yLineDiff, m_ChartY);
- var dp2 = new Vector3(grid.runtimeX - yLineDiff, grid.runtimeY - xLineDiff);
- var dp3 = new Vector3(grid.runtimeX + grid.runtimeWidth + xSplitDiff, grid.runtimeY - xLineDiff);
- var dp4 = new Vector3(grid.runtimeX + grid.runtimeWidth + xSplitDiff, m_ChartY);
- UGL.DrawQuadrilateral(vh, dp1, dp2, dp3, dp4, backgroundColor);
- }
- protected override void DrawPainterSerie(VertexHelper vh, Serie serie)
- {
- base.DrawPainterSerie(vh, serie);
- var colorIndex = m_LegendRealShowName.IndexOf(serie.legendName);
- bool yCategory = IsAnyYAxisIsCategory();
- switch (serie.type)
- {
- case SerieType.Line:
- serie.dataPoints.Clear();
- if (yCategory) DrawYLineSerie(vh, serie, colorIndex);
- else DrawXLineSerie(vh, serie, colorIndex);
- if (!SeriesHelper.IsStack(m_Series))
- {
- DrawLinePoint(vh, serie);
- DrawLineArrow(vh, serie);
- }
- break;
- case SerieType.Bar:
- serie.dataPoints.Clear();
- if (yCategory) DrawYBarSerie(vh, serie, colorIndex);
- else DrawXBarSerie(vh, serie, colorIndex);
- break;
- case SerieType.Scatter:
- case SerieType.EffectScatter:
- serie.dataPoints.Clear();
- DrawScatterSerie(vh, colorIndex, serie);
- break;
- case SerieType.Heatmap:
- serie.dataPoints.Clear();
- DrawHeatmapSerie(vh, colorIndex, serie);
- break;
- case SerieType.Candlestick:
- serie.dataPoints.Clear();
- DrawCandlestickSerie(vh, colorIndex, serie);
- break;
- }
- }
- protected override void DrawPainterTop(VertexHelper vh)
- {
- DrawClip(vh);
- if (SeriesHelper.IsAnyClipSerie(m_Series))
- {
- DrawCoordinate(vh);
- }
- DrawAxisTick(vh);
- DrawLabelBackground(vh);
- if (SeriesHelper.IsStack(m_Series))
- {
- foreach (var serie in m_Series.list)
- {
- DrawLinePoint(vh, serie);
- DrawLineArrow(vh, serie);
- }
- }
- bool yCategory = IsAnyYAxisIsCategory();
- if (yCategory) DrawYTooltipIndicator(vh);
- else DrawXTooltipIndicator(vh);
- }
- protected override void CheckTootipArea(Vector2 local, bool isActivedOther)
- {
- if (isActivedOther)
- {
- foreach (var axis in m_XAxes) axis.SetTooltipLabelActive(false);
- foreach (var axis in m_YAxes) axis.SetTooltipLabelActive(false);
- return;
- }
- var grid = GetGrid(local);
- if (grid == null)
- {
- tooltip.runtimeGridIndex = -1;
- tooltip.ClearValue();
- UpdateTooltip();
- }
- else
- {
- if (tooltip.runtimeGridIndex != grid.index)
- {
- tooltip.runtimeGridIndex = grid.index;
- RefreshSeriePainterByGridIndex(grid.index);
- }
- UpdateTooltipValue(local);
- }
- if (tooltip.IsSelected())
- {
- tooltip.UpdateContentPos(local + tooltip.offset);
- UpdateTooltip();
- if (tooltip.IsDataIndexChanged() || tooltip.type == Tooltip.Type.Corss)
- {
- tooltip.UpdateLastDataIndex();
- m_PainterTop.Refresh();
- }
- }
- else if (tooltip.IsActive())
- {
- tooltip.SetActive(false);
- m_PainterTop.Refresh();
- }
- }
- protected virtual void UpdateTooltipValue(Vector2 local)
- {
- var isCartesian = IsValue();
- var grid = GetGrid(tooltip.runtimeGridIndex);
- for (int i = 0; i < m_XAxes.Count; i++)
- {
- var xAxis = m_XAxes[i];
- var yAxis = m_YAxes[i];
- if (!xAxis.show && !yAxis.show) continue;
- if (isCartesian && xAxis.show && yAxis.show)
- {
- var yRate = (yAxis.runtimeMaxValue - yAxis.runtimeMinValue) / grid.runtimeHeight;
- var xRate = (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) / grid.runtimeWidth;
- var yValue = yRate * (local.y - grid.runtimeY - yAxis.runtimeZeroYOffset);
- if (yAxis.runtimeMinValue > 0) yValue += yAxis.runtimeMinValue;
- tooltip.runtimeYValues[i] = yValue;
- var xValue = xRate * (local.x - grid.runtimeX - xAxis.runtimeZeroXOffset);
- if (xAxis.runtimeMinValue > 0) xValue += xAxis.runtimeMinValue;
- tooltip.runtimeXValues[i] = xValue;
- for (int j = 0; j < m_Series.Count; j++)
- {
- var serie = m_Series.GetSerie(j);
- for (int n = 0; n < serie.data.Count; n++)
- {
- var serieData = serie.data[n];
- var xdata = serieData.GetData(0, xAxis.inverse);
- var ydata = serieData.GetData(1, yAxis.inverse);
- var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
- var symbolSize = symbol.GetSize(serieData == null ? null : serieData.data,
- m_Theme.serie.lineSymbolSize);
- if (Math.Abs(xValue - xdata) / xRate < symbolSize
- && Math.Abs(yValue - ydata) / yRate < symbolSize)
- {
- tooltip.runtimeDataIndex[i] = n;
- RefreshPainter(serie);
- serieData.highlighted = true;
- }
- else
- {
- serieData.highlighted = false;
- }
- }
- }
- }
- else if (IsCategory())
- {
- var dataZoomX = DataZoomHelper.GetAxisRelatedDataZoom(xAxis, dataZooms);
- var dataCount = m_Series.list.Count > 0 ? m_Series.list[0].GetDataList(dataZoomX).Count : 0;
- for (int j = 0; j < xAxis.GetDataNumber(dataZoomX); j++)
- {
- float splitWid = AxisHelper.GetDataWidth(xAxis, grid.runtimeWidth, dataCount, dataZoomX);
- float pX = grid.runtimeX + j * splitWid;
- if ((xAxis.boundaryGap && (local.x > pX && local.x <= pX + splitWid)) ||
- (!xAxis.boundaryGap && (local.x > pX - splitWid / 2 && local.x <= pX + splitWid / 2)))
- {
- tooltip.runtimeXValues[i] = j;
- tooltip.runtimeDataIndex[i] = j;
- break;
- }
- }
- var dataZoomY = DataZoomHelper.GetAxisRelatedDataZoom(yAxis, dataZooms);
- dataCount = m_Series.list.Count > 0 ? m_Series.list[0].GetDataList(dataZoomY).Count : 0;
- for (int j = 0; j < yAxis.GetDataNumber(dataZoomY); j++)
- {
- float splitWid = AxisHelper.GetDataWidth(yAxis, grid.runtimeHeight, dataCount, dataZoomY);
- float pY = grid.runtimeY + j * splitWid;
- if ((yAxis.boundaryGap && (local.y > pY && local.y <= pY + splitWid)) ||
- (!yAxis.boundaryGap && (local.y > pY - splitWid / 2 && local.y <= pY + splitWid / 2)))
- {
- tooltip.runtimeYValues[i] = j;
- break;
- }
- }
- }
- else if (xAxis.IsCategory())
- {
- var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(xAxis, dataZooms);
- var dataCount = m_Series.list.Count > 0 ? m_Series.list[0].GetDataList(dataZoom).Count : 0;
- var value = (yAxis.runtimeMaxValue - yAxis.runtimeMinValue) * (local.y - grid.runtimeY - yAxis.runtimeZeroYOffset) / grid.runtimeHeight;
- if (yAxis.runtimeMinValue > 0) value += yAxis.runtimeMinValue;
- tooltip.runtimeYValues[i] = value;
- for (int j = 0; j < xAxis.GetDataNumber(dataZoom); j++)
- {
- float splitWid = AxisHelper.GetDataWidth(xAxis, grid.runtimeWidth, dataCount, dataZoom);
- float pX = grid.runtimeX + j * splitWid;
- if ((xAxis.boundaryGap && (local.x > pX && local.x <= pX + splitWid)) ||
- (!xAxis.boundaryGap && (local.x > pX - splitWid / 2 && local.x <= pX + splitWid / 2)))
- {
- tooltip.runtimeXValues[i] = j;
- tooltip.runtimeDataIndex[i] = j;
- RefreshSeriePainterByAxisIndex(xAxis);
- break;
- }
- }
- }
- else if (yAxis.IsCategory())
- {
- var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(yAxis, dataZooms);
- var dataCount = m_Series.list.Count > 0 ? m_Series.list[0].GetDataList(dataZoom).Count : 0;
- var value = (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) * (local.x - grid.runtimeX - xAxis.runtimeZeroXOffset) / grid.runtimeWidth;
- if (xAxis.runtimeMinValue > 0) value += xAxis.runtimeMinValue;
- tooltip.runtimeXValues[i] = value;
- for (int j = 0; j < yAxis.GetDataNumber(dataZoom); j++)
- {
- float splitWid = AxisHelper.GetDataWidth(yAxis, grid.runtimeHeight, dataCount, dataZoom);
- float pY = grid.runtimeY + j * splitWid;
- if ((yAxis.boundaryGap && (local.y > pY && local.y <= pY + splitWid)) ||
- (!yAxis.boundaryGap && (local.y > pY - splitWid / 2 && local.y <= pY + splitWid / 2)))
- {
- tooltip.runtimeYValues[i] = j;
- tooltip.runtimeDataIndex[i] = j;
- RefreshSeriePainterByAxisIndex(yAxis);
- break;
- }
- }
- }
- }
- }
- protected StringBuilder sb = new StringBuilder(100);
- protected override void UpdateTooltip()
- {
- base.UpdateTooltip();
- int index;
- Axis tempAxis;
- bool isCartesian = IsValue();
- if (isCartesian)
- {
- index = tooltip.runtimeDataIndex[0];
- tempAxis = m_XAxes[0];
- }
- else if (m_XAxes[0].type == Axis.AxisType.Value)
- {
- index = (int)tooltip.runtimeYValues[0];
- tempAxis = m_YAxes[0];
- }
- else
- {
- index = (int)tooltip.runtimeXValues[0];
- tempAxis = m_XAxes[0];
- }
- if (index < 0)
- {
- if (tooltip.IsActive())
- {
- tooltip.SetActive(false);
- RefreshChart();
- }
- return;
- }
- UpdateSerieGridIndex();
- RefreshSeriePainterByGridIndex(grid.index);
- var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(tempAxis, dataZooms);
- var content = TooltipHelper.GetFormatterContent(tooltip, index, this, dataZoom, isCartesian);
- TooltipHelper.SetContentAndPosition(tooltip, content, chartRect);
- tooltip.SetActive(true);
- for (int i = 0; i < m_XAxes.Count; i++)
- {
- UpdateAxisTooltipLabel(i, m_XAxes[i]);
- }
- for (int i = 0; i < m_YAxes.Count; i++)
- {
- UpdateAxisTooltipLabel(i, m_YAxes[i]);
- }
- }
- internal string GetTooltipCategory(int dataIndex, DataZoom dataZoom = null)
- {
- bool isCartesian = IsValue();
- var index = -1;
- Axis tempAxis;
- if (isCartesian)
- {
- index = tooltip.runtimeDataIndex[0];
- tempAxis = m_XAxes[0];
- }
- else if (m_XAxes[0].type == Axis.AxisType.Value)
- {
- index = (int)tooltip.runtimeYValues[0];
- tempAxis = m_YAxes[0];
- }
- else
- {
- index = (int)tooltip.runtimeXValues[0];
- tempAxis = m_XAxes[0];
- }
- return tempAxis.GetData(index, dataZoom);
- }
- internal string GetTooltipCategory(int dataIndex, Serie serie, DataZoom dataZoom = null)
- {
- bool isCartesian = IsValue();
- var index = -1;
- Axis tempAxis;
- if (isCartesian)
- {
- index = tooltip.runtimeDataIndex[0];
- tempAxis = GetXAxis(serie.xAxisIndex);
- }
- else if (m_XAxes[0].type == Axis.AxisType.Value)
- {
- index = (int)tooltip.runtimeYValues[0];
- tempAxis = GetYAxis(serie.yAxisIndex);
- }
- else
- {
- index = (int)tooltip.runtimeXValues[0];
- tempAxis = GetXAxis(serie.xAxisIndex);
- }
- return tempAxis == null ? "" : tempAxis.GetData(index, dataZoom);
- }
- protected void UpdateAxisTooltipLabel(int axisIndex, Axis axis)
- {
- var showTooltipLabel = axis.show && tooltip.type == Tooltip.Type.Corss;
- axis.SetTooltipLabelActive(showTooltipLabel);
- if (!showTooltipLabel) return;
- var labelText = "";
- var labelPos = Vector2.zero;
- var grid = GetAxisGridOrDefault(axis);
- var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(axis, dataZooms);
- if (axis is XAxis)
- {
- var posY = axisIndex > 0 ? grid.runtimeY + grid.runtimeHeight : grid.runtimeY;
- var diff = axisIndex > 0
- ? -axis.axisLabel.textStyle.GetFontSize(m_Theme.tooltip) - axis.axisLabel.margin - 3.5f
- : axis.axisLabel.margin / 2 + 1;
- if (axis.IsValue())
- {
- labelText = ChartCached.NumberToStr(tooltip.runtimeXValues[axisIndex], axis.axisLabel.numericFormatter);
- labelPos = new Vector2(tooltip.runtimePointerPos.x, posY - diff);
- }
- else
- {
- labelText = axis.GetData((int)tooltip.runtimeXValues[axisIndex], dataZoom);
- var splitWidth = AxisHelper.GetDataWidth(axis, grid.runtimeWidth, 0, dataZoom);
- var index = (int)tooltip.runtimeXValues[axisIndex];
- var px = grid.runtimeX + index * splitWidth + (axis.boundaryGap ? splitWidth / 2 : 0);
- labelPos = new Vector2(px, posY - diff);
- }
- }
- else if (axis is YAxis)
- {
- var posX = axisIndex > 0 ? grid.runtimeX + grid.runtimeWidth : grid.runtimeX;
- var diff = axisIndex > 0 ? -axis.axisLabel.margin + 3 : axis.axisLabel.margin - 3;
- if (axis.IsValue())
- {
- labelText = ChartCached.NumberToStr(tooltip.runtimeYValues[axisIndex], axis.axisLabel.numericFormatter);
- labelPos = new Vector2(posX - diff, tooltip.runtimePointerPos.y);
- }
- else
- {
- labelText = axis.GetData((int)tooltip.runtimeYValues[axisIndex], dataZoom);
- var splitWidth = AxisHelper.GetDataWidth(axis, grid.runtimeHeight, 0, dataZoom);
- var index = (int)tooltip.runtimeYValues[axisIndex];
- var py = grid.runtimeY + index * splitWidth + (axis.boundaryGap ? splitWidth / 2 : 0);
- labelPos = new Vector2(posX - diff, py);
- }
- }
- axis.UpdateTooptipLabelText(labelText);
- axis.UpdateTooltipLabelPos(labelPos);
- }
- private void InitDefaultAxes()
- {
- if (m_XAxes.Count <= 0)
- {
- var axis1 = XAxis.defaultXAxis;
- var axis2 = XAxis.defaultXAxis;
- axis1.show = true;
- axis2.show = false;
- axis1.position = Axis.AxisPosition.Bottom;
- axis2.position = Axis.AxisPosition.Top;
- m_XAxes.Add(axis1);
- m_XAxes.Add(axis2);
- }
- if (m_YAxes.Count <= 0)
- {
- var axis1 = YAxis.defaultYAxis;
- var axis2 = YAxis.defaultYAxis;
- axis1.show = true;
- axis1.splitNumber = 5;
- axis1.boundaryGap = false;
- axis2.show = false;
- axis1.position = Axis.AxisPosition.Left;
- axis2.position = Axis.AxisPosition.Right;
- m_YAxes.Add(axis1);
- m_YAxes.Add(axis2);
- }
- foreach (var axis in m_XAxes) axis.runtimeMinValue = axis.runtimeMaxValue = 0;
- foreach (var axis in m_YAxes) axis.runtimeMinValue = axis.runtimeMaxValue = 0;
- }
- private void InitAxisY()
- {
- for (int i = 0; i < m_YAxes.Count; i++)
- {
- InitYAxis(i, m_YAxes[i]);
- }
- }
- private void InitYAxis(int yAxisIndex, YAxis yAxis)
- {
- yAxis.painter = m_Painter;
- yAxis.refreshComponent = delegate ()
- {
- InitAxisRuntimeData(yAxis);
- string objName = ChartCached.GetYAxisName(yAxisIndex);
- var axisObj = ChartHelper.AddObject(objName, transform, graphAnchorMin,
- graphAnchorMax, chartPivot, new Vector2(chartWidth, chartHeight));
- yAxis.gameObject = axisObj;
- yAxis.runtimeAxisLabelList.Clear();
- axisObj.SetActive(yAxis.show);
- axisObj.hideFlags = chartHideFlags;
- ChartHelper.HideAllObject(axisObj);
- var grid = GetAxisGridOrDefault(yAxis);
- if (grid == null) return;
- if (!yAxis.show) return;
- var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(yAxis, dataZooms);
- var axisLabelTextStyle = yAxis.axisLabel.textStyle;
- int splitNumber = AxisHelper.GetScaleNumber(yAxis, grid.runtimeHeight, dataZoom);
- float totalWidth = 0;
- float eachWidth = AxisHelper.GetEachWidth(yAxis, grid.runtimeHeight, dataZoom);
- float gapWidth = yAxis.boundaryGap ? eachWidth / 2 : 0;
- float textWidth = yAxis.axisLabel.width > 0
- ? yAxis.axisLabel.width
- : grid.left;
- float textHeight = yAxis.axisLabel.height > 0
- ? yAxis.axisLabel.height
- : 20f;
- if (yAxis.IsCategory() && yAxis.boundaryGap)
- {
- splitNumber -= 1;
- }
- for (int i = 0; i < splitNumber; i++)
- {
- ChartLabel txt;
- var inside = yAxis.axisLabel.inside;
- var isPercentStack = SeriesHelper.IsPercentStack(m_Series, SerieType.Bar);
- var labelName = AxisHelper.GetLabelName(yAxis, grid.runtimeHeight, i, yAxis.runtimeMinValue,
- yAxis.runtimeMaxValue, dataZoom, isPercentStack);
- if ((inside && yAxis.IsLeft()) || (!inside && yAxis.IsRight()))
- {
- txt = ChartHelper.AddAxisLabelObject(splitNumber, i, objName + i, axisObj.transform, Vector2.zero,
- Vector2.zero, new Vector2(0, 0.5f), new Vector2(textWidth, textHeight), yAxis, theme.axis,
- labelName);
- txt.label.SetAlignment(axisLabelTextStyle.GetAlignment(TextAnchor.MiddleLeft));
- }
- else
- {
- txt = ChartHelper.AddAxisLabelObject(splitNumber, i, objName + i, axisObj.transform, Vector2.zero,
- Vector2.zero, new Vector2(1, 0.5f), new Vector2(textWidth, textHeight), yAxis, theme.axis,
- labelName);
- txt.label.SetAlignment(axisLabelTextStyle.GetAlignment(TextAnchor.MiddleRight));
- }
- var labelWidth = AxisHelper.GetScaleWidth(yAxis, grid.runtimeHeight, i + 1, dataZoom);
- if (i == 0) yAxis.axisLabel.SetRelatedText(txt.label, labelWidth);
- txt.SetPosition(GetLabelYPosition(totalWidth + gapWidth, i, yAxisIndex, yAxis));
- yAxis.runtimeAxisLabelList.Add(txt);
- totalWidth += labelWidth;
- }
- if (yAxis.axisName.show)
- {
- var axisNameTextStyle = yAxis.axisName.textStyle;
- var offset = axisNameTextStyle.offset;
- ChartText axisName = null;
- var xAxis = GetXAxis(yAxisIndex);
- var zeroPos = new Vector3(grid.runtimeX + (xAxis == null ? 0 : xAxis.runtimeZeroXOffset), grid.runtimeY);
- switch (yAxis.axisName.location)
- {
- case AxisName.Location.Start:
- axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform, new Vector2(0.5f, 0.5f),
- new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(100, 20), axisNameTextStyle,
- m_Theme.axis);
- axisName.SetAlignment(axisNameTextStyle.GetAlignment(TextAnchor.MiddleCenter));
- axisName.SetLocalPosition(yAxis.position == Axis.AxisPosition.Right ?
- new Vector2(grid.runtimeX + grid.runtimeWidth + offset.x + yAxis.offset, grid.runtimeY - offset.y) :
- new Vector2(zeroPos.x + offset.x + yAxis.offset, grid.runtimeY - offset.y));
- break;
- case AxisName.Location.Middle:
- axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform, new Vector2(1, 0.5f),
- new Vector2(1, 0.5f), new Vector2(1, 0.5f), new Vector2(100, 20), axisNameTextStyle,
- m_Theme.axis);
- axisName.SetAlignment(axisNameTextStyle.GetAlignment(TextAnchor.MiddleRight));
- axisName.SetLocalPosition(yAxis.position == Axis.AxisPosition.Right ?
- new Vector2(grid.runtimeX + grid.runtimeWidth - offset.x + yAxis.offset, grid.runtimeY + grid.runtimeHeight / 2 + offset.y) :
- new Vector2(grid.runtimeX - offset.x + yAxis.offset, grid.runtimeY + grid.runtimeHeight / 2 + offset.y));
- break;
- case AxisName.Location.End:
- axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform, new Vector2(0.5f, 0.5f),
- new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(100, 20), axisNameTextStyle,
- m_Theme.axis);
- axisName.SetAlignment(axisNameTextStyle.GetAlignment(TextAnchor.MiddleCenter));
- axisName.SetLocalPosition(yAxis.position == Axis.AxisPosition.Right ?
- new Vector2(grid.runtimeX + grid.runtimeWidth + offset.x + yAxis.offset, grid.runtimeY + grid.runtimeHeight + offset.y) :
- new Vector2(zeroPos.x + offset.x + yAxis.offset, grid.runtimeY + grid.runtimeHeight + offset.y));
- break;
- }
- axisName.SetText(yAxis.axisName.name);
- }
- //init tooltip label
- if (tooltip.runtimeGameObject)
- {
- Vector2 privot = yAxis.position == Axis.AxisPosition.Right ? new Vector2(0, 0.5f) : new Vector2(1, 0.5f);
- var labelParent = tooltip.runtimeGameObject.transform;
- var labelName = ChartCached.GetAxisTooltipLabel(objName);
- GameObject labelObj = ChartHelper.AddTooltipLabel(labelName, labelParent, m_Theme, privot);
- yAxis.SetTooltipLabel(labelObj);
- yAxis.SetTooltipLabelColor(m_Theme.tooltip.labelBackgroundColor, m_Theme.tooltip.labelTextColor);
- yAxis.SetTooltipLabelActive(yAxis.show && tooltip.show && tooltip.type == Tooltip.Type.Corss);
- }
- };
- yAxis.refreshComponent();
- }
- protected virtual void InitAxisRuntimeData(Axis axis)
- {
- }
- internal void InitAxisX()
- {
- for (int i = 0; i < m_XAxes.Count; i++)
- {
- InitXAxis(i, m_XAxes[i]);
- }
- }
- private void InitXAxis(int xAxisIndex, XAxis xAxis)
- {
- xAxis.painter = m_Painter;
- xAxis.refreshComponent = delegate ()
- {
- string objName = ChartCached.GetXAxisName(xAxisIndex);
- var axisObj = ChartHelper.AddObject(objName, transform, graphAnchorMin,
- graphAnchorMax, chartPivot, new Vector2(chartWidth, chartHeight));
- xAxis.gameObject = axisObj;
- xAxis.runtimeAxisLabelList.Clear();
- axisObj.SetActive(xAxis.show);
- axisObj.hideFlags = chartHideFlags;
- ChartHelper.HideAllObject(axisObj);
- var grid = GetAxisGridOrDefault(xAxis);
- if (grid == null) return;
- if (!xAxis.show) return;
- var axisLabelTextStyle = xAxis.axisLabel.textStyle;
- var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(xAxis, dataZooms);
- int splitNumber = AxisHelper.GetScaleNumber(xAxis, grid.runtimeWidth, dataZoom);
- float totalWidth = 0;
- float eachWidth = AxisHelper.GetEachWidth(xAxis, grid.runtimeWidth, dataZoom);
- float gapWidth = xAxis.boundaryGap ? eachWidth / 2 : 0;
- float textWidth = xAxis.axisLabel.width > 0
- ? xAxis.axisLabel.width
- : AxisHelper.GetScaleWidth(xAxis, grid.runtimeWidth, 0, dataZoom);
- float textHeight = xAxis.axisLabel.height > 0
- ? xAxis.axisLabel.height
- : 20f;
- if (xAxis.IsCategory() && xAxis.boundaryGap)
- {
- splitNumber -= 1;
- }
- for (int i = 0; i < splitNumber; i++)
- {
- var labelWidth = AxisHelper.GetScaleWidth(xAxis, grid.runtimeWidth, i + 1, dataZoom);
- var inside = xAxis.axisLabel.inside;
- var isPercentStack = SeriesHelper.IsPercentStack(m_Series, SerieType.Bar);
- var labelName = AxisHelper.GetLabelName(xAxis, grid.runtimeWidth, i, xAxis.runtimeMinValue,
- xAxis.runtimeMaxValue, dataZoom, isPercentStack);
- var label = ChartHelper.AddAxisLabelObject(splitNumber, i, ChartCached.GetXAxisName(xAxisIndex, i),
- axisObj.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f),
- new Vector2(textWidth, textHeight), xAxis, theme.axis, labelName);
- if (i == 0) xAxis.axisLabel.SetRelatedText(label.label, labelWidth);
- label.label.SetAlignment(axisLabelTextStyle.GetAlignment(TextAnchor.MiddleCenter));
- label.SetPosition(GetLabelXPosition(totalWidth + gapWidth, i, xAxisIndex, xAxis));
- xAxis.runtimeAxisLabelList.Add(label);
- totalWidth += labelWidth;
- }
- if (xAxis.axisName.show)
- {
- var axisNameTextStyle = xAxis.axisName.textStyle;
- var offset = axisNameTextStyle.offset;
- ChartText axisName = null;
- var yAxis = GetYAxis(xAxisIndex);
- var zeroPos = new Vector3(grid.runtimeX, grid.runtimeY + (yAxis == null ? 0 : yAxis.runtimeZeroYOffset));
- switch (xAxis.axisName.location)
- {
- case AxisName.Location.Start:
- axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform, new Vector2(1, 0.5f),
- new Vector2(1, 0.5f), new Vector2(1, 0.5f), new Vector2(100, 20), axisNameTextStyle, theme.axis);
- axisName.SetAlignment(axisNameTextStyle.GetAlignment(TextAnchor.MiddleRight));
- axisName.SetLocalPosition(xAxis.position == Axis.AxisPosition.Top ?
- new Vector2(zeroPos.x - offset.x, grid.runtimeY + grid.runtimeHeight + offset.y + xAxis.offset) :
- new Vector2(zeroPos.x - offset.x, zeroPos.y + offset.y + xAxis.offset));
- break;
- case AxisName.Location.Middle:
- axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform, new Vector2(0.5f, 0.5f),
- new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(100, 20), axisNameTextStyle, theme.axis);
- axisName.SetAlignment(axisNameTextStyle.GetAlignment(TextAnchor.MiddleCenter));
- axisName.SetLocalPosition(xAxis.position == Axis.AxisPosition.Top ?
- new Vector2(grid.runtimeX + grid.runtimeWidth / 2 + offset.x, grid.runtimeY + grid.runtimeHeight - offset.y + xAxis.offset) :
- new Vector2(grid.runtimeX + grid.runtimeWidth / 2 + offset.x, grid.runtimeY - offset.y + xAxis.offset));
- break;
- case AxisName.Location.End:
- axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform, new Vector2(0, 0.5f),
- new Vector2(0, 0.5f), new Vector2(0, 0.5f), new Vector2(100, 20), axisNameTextStyle, theme.axis);
- axisName.SetAlignment(axisNameTextStyle.GetAlignment(TextAnchor.MiddleLeft));
- axisName.SetLocalPosition(xAxis.position == Axis.AxisPosition.Top ?
- new Vector2(grid.runtimeX + grid.runtimeWidth + offset.x, grid.runtimeY + grid.runtimeHeight + offset.y + xAxis.offset) :
- new Vector2(grid.runtimeX + grid.runtimeWidth + offset.x, zeroPos.y + offset.y + xAxis.offset));
- break;
- }
- axisName.SetText(xAxis.axisName.name);
- }
- if (tooltip.runtimeGameObject)
- {
- Vector2 privot = xAxis.position != Axis.AxisPosition.Top ? new Vector2(0.5f, 1) : new Vector2(0.5f, 1);
- var labelParent = tooltip.runtimeGameObject.transform;
- var labelName = ChartCached.GetAxisTooltipLabel(objName);
- GameObject labelObj = ChartHelper.AddTooltipLabel(labelName, labelParent, theme, privot);
- xAxis.SetTooltipLabel(labelObj);
- xAxis.SetTooltipLabelColor(theme.tooltip.labelBackgroundColor, theme.tooltip.labelTextColor);
- xAxis.SetTooltipLabelActive(xAxis.show && tooltip.show && tooltip.type == Tooltip.Type.Corss);
- }
- };
- xAxis.refreshComponent();
- }
- private void InitGrid()
- {
- for (int i = 0; i < m_Grids.Count; i++)
- {
- var grid = m_Grids[i];
- grid.index = i;
- grid.painter = m_Painter;
- grid.refreshComponent = delegate ()
- {
- OnCoordinateChanged();
- };
- grid.refreshComponent();
- }
- }
- private void InitDataZoom()
- {
- for (int i = 0; i < m_DataZooms.Count; i++)
- {
- var dataZoom = m_DataZooms[i];
- dataZoom.index = i;
- dataZoom.painter = m_PainterTop;
- dataZoom.refreshComponent = delegate ()
- {
- var dataZoomObject = ChartHelper.AddObject(s_DefaultDataZoom + dataZoom.index, transform, graphAnchorMin,
- graphAnchorMax, chartPivot, new Vector2(chartWidth, chartHeight));
- dataZoom.gameObject = dataZoomObject;
- dataZoomObject.hideFlags = chartHideFlags;
- ChartHelper.HideAllObject(dataZoomObject);
- var startLabel = ChartHelper.AddTextObject(s_DefaultDataZoom + "start", dataZoomObject.transform,
- Vector2.zero, Vector2.zero, new Vector2(1, 0.5f), new Vector2(200, 20), dataZoom.textStyle,
- m_Theme.dataZoom);
- startLabel.SetAlignment(TextAnchor.MiddleRight);
- var endLabel = ChartHelper.AddTextObject(s_DefaultDataZoom + "end", dataZoomObject.transform,
- Vector2.zero, Vector2.zero, new Vector2(0, 0.5f), new Vector2(200, 20), dataZoom.textStyle,
- m_Theme.dataZoom);
- endLabel.SetAlignment(TextAnchor.MiddleLeft);
- dataZoom.SetStartLabel(startLabel);
- dataZoom.SetEndLabel(endLabel);
- dataZoom.SetLabelActive(false);
- CheckRaycastTarget();
- foreach (var index in dataZoom.xAxisIndexs)
- {
- var xAxis = m_XAxes[index];
- if (xAxis != null)
- {
- xAxis.UpdateFilterData(dataZoom);
- }
- }
- if (m_Series != null)
- {
- m_Series.UpdateFilterData(dataZoom);
- }
- };
- dataZoom.refreshComponent();
- }
- }
- private Vector3 GetLabelYPosition(float scaleWid, int i, int yAxisIndex, YAxis yAxis)
- {
- var grid = GetAxisGridOrDefault(yAxis);
- var startX = yAxis.IsLeft() ? grid.runtimeX : grid.runtimeX + grid.runtimeWidth;
- var posX = 0f;
- var inside = yAxis.axisLabel.inside;
- if ((inside && yAxis.IsLeft()) || (!inside && yAxis.IsRight()))
- {
- posX = startX + yAxis.axisLabel.margin;
- }
- else
- {
- posX = startX - yAxis.axisLabel.margin;
- }
- posX += yAxis.offset;
- return new Vector3(posX, grid.runtimeY + scaleWid, 0) + yAxis.axisLabel.textStyle.offsetv3;
- }
- private Vector3 GetLabelXPosition(float scaleWid, int i, int xAxisIndex, XAxis xAxis)
- {
- var grid = GetAxisGridOrDefault(xAxis);
- var startY = grid.runtimeY + (xAxis.axisLabel.onZero ? m_YAxes[xAxisIndex].runtimeZeroYOffset : 0);
- if (xAxis.IsTop()) startY += grid.runtimeHeight;
- var posY = 0f;
- var inside = xAxis.axisLabel.inside;
- var fontSize = xAxis.axisLabel.textStyle.GetFontSize(m_Theme.axis);
- if ((inside && xAxis.IsBottom()) || (!inside && xAxis.IsTop()))
- {
- posY = startY + xAxis.axisLabel.margin + fontSize / 2;
- }
- else
- {
- posY = startY - xAxis.axisLabel.margin - fontSize / 2;
- }
- posY += xAxis.offset;
- return new Vector3(grid.runtimeX + scaleWid, posY) + xAxis.axisLabel.textStyle.offsetv3;
- }
- protected virtual void CheckMinMaxValue()
- {
- if (m_XAxes == null || m_YAxes == null) return;
- for (int i = 0; i < m_XAxes.Count; i++)
- {
- UpdateAxisMinMaxValue(i, m_XAxes[i]);
- }
- for (int i = 0; i < m_YAxes.Count; i++)
- {
- UpdateAxisMinMaxValue(i, m_YAxes[i]);
- }
- }
- private void UpdateAxisMinMaxValue(int axisIndex, Axis axis, bool updateChart = true)
- {
- if (!axis.show) return;
- if (axis.IsCategory())
- {
- axis.runtimeMinValue = 0;
- axis.runtimeMaxValue = SeriesHelper.GetMaxSerieDataCount(m_Series) - 1;
- return;
- }
- double tempMinValue = 0;
- double tempMaxValue = 0;
- GetSeriesMinMaxValue(axis, axisIndex, out tempMinValue, out tempMaxValue);
- if (tempMinValue != axis.runtimeMinValue || tempMaxValue != axis.runtimeMaxValue)
- {
- m_IsPlayingAnimation = true;
- var needCheck = !m_IsPlayingAnimation && axis.runtimeLastCheckInverse == axis.inverse;
- axis.UpdateMinValue(tempMinValue, needCheck);
- axis.UpdateMaxValue(tempMaxValue, needCheck);
- axis.runtimeZeroXOffset = 0;
- axis.runtimeZeroYOffset = 0;
- axis.runtimeLastCheckInverse = axis.inverse;
- if (tempMinValue != 0 || tempMaxValue != 0)
- {
- var grid = GetAxisGridOrDefault(axis);
- if (grid != null && axis is XAxis && axis.IsValue())
- {
- axis.runtimeZeroXOffset = axis.runtimeMinValue > 0 ? 0 :
- axis.runtimeMaxValue < 0 ? grid.runtimeWidth :
- (float)(Math.Abs(axis.runtimeMinValue) * (grid.runtimeWidth / (Math.Abs(axis.runtimeMinValue) + Math.Abs(axis.runtimeMaxValue))));
- }
- if (grid != null && axis is YAxis && axis.IsValue())
- {
- axis.runtimeZeroYOffset = axis.runtimeMinValue > 0 ? 0 :
- axis.runtimeMaxValue < 0 ? grid.runtimeHeight :
- (float)(Math.Abs(axis.runtimeMinValue) * (grid.runtimeHeight / (Math.Abs(axis.runtimeMinValue) + Math.Abs(axis.runtimeMaxValue))));
- }
- }
- var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(axis, dataZooms);
- if (dataZoom != null && dataZoom.enable)
- {
- if (axis is XAxis) dataZoom.SetXAxisIndexValueInfo(axisIndex, tempMinValue, tempMaxValue);
- else dataZoom.SetYAxisIndexValueInfo(axisIndex, tempMinValue, tempMaxValue);
- }
- if (updateChart)
- {
- UpdateAxisLabelText(axis);
- RefreshChart();
- }
- }
- if (axis.IsValueChanging(500) && !m_IsPlayingAnimation)
- {
- UpdateAxisLabelText(axis);
- RefreshChart();
- }
- }
- protected virtual void GetSeriesMinMaxValue(Axis axis, int axisIndex, out double tempMinValue, out double tempMaxValue)
- {
- if (IsValue())
- {
- if (axis is XAxis)
- {
- SeriesHelper.GetXMinMaxValue(m_Series, null, axisIndex, true, axis.inverse, out tempMinValue, out tempMaxValue);
- }
- else
- {
- SeriesHelper.GetYMinMaxValue(m_Series, null, axisIndex, true, axis.inverse, out tempMinValue, out tempMaxValue);
- }
- }
- else
- {
- SeriesHelper.GetYMinMaxValue(m_Series, null, axisIndex, false, axis.inverse, out tempMinValue, out tempMaxValue);
- }
- AxisHelper.AdjustMinMaxValue(axis, ref tempMinValue, ref tempMaxValue, true);
- }
- protected void UpdateAxisLabelText(Axis axis)
- {
- var grid = GetAxisGridOrDefault(axis);
- if (grid == null || axis == null) return;
- float runtimeWidth = axis is XAxis ? grid.runtimeWidth : grid.runtimeHeight;
- var isPercentStack = SeriesHelper.IsPercentStack(m_Series, SerieType.Bar);
- var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(axis, dataZooms);
- axis.UpdateLabelText(runtimeWidth, dataZoom, isPercentStack, 500);
- }
- protected virtual void OnCoordinateChanged()
- {
- UpdateCoordinate();
- for (int i = 0; i < m_XAxes.Count; i++)
- {
- m_XAxes[i].SetAllDirty();
- }
- for (int i = 0; i < m_YAxes.Count; i++)
- {
- m_YAxes[i].SetAllDirty();
- }
- }
- protected override void OnSizeChanged()
- {
- base.OnSizeChanged();
- OnCoordinateChanged();
- }
- private void DrawCoordinate(VertexHelper vh)
- {
- DrawGrid(vh);
- for (int i = 0; i < m_XAxes.Count; i++)
- {
- m_XAxes[i].index = i;
- DrawXAxisSplit(vh, i, m_XAxes[i]);
- }
- for (int i = 0; i < m_YAxes.Count; i++)
- {
- m_YAxes[i].index = i;
- DrawYAxisSplit(vh, i, m_YAxes[i]);
- }
- for (int i = 0; i < m_XAxes.Count; i++)
- {
- DrawXAxisLine(vh, i, m_XAxes[i]);
- }
- for (int i = 0; i < m_YAxes.Count; i++)
- {
- DrawYAxisLine(vh, i, m_YAxes[i]);
- }
- }
- private void DrawAxisTick(VertexHelper vh)
- {
- for (int i = 0; i < m_XAxes.Count; i++)
- {
- DrawXAxisTick(vh, i, m_XAxes[i]);
- }
- for (int i = 0; i < m_YAxes.Count; i++)
- {
- DrawYAxisTick(vh, i, m_YAxes[i]);
- }
- }
- private void DrawGrid(VertexHelper vh)
- {
- foreach (var grid in m_Grids)
- {
- if (grid.show && !ChartHelper.IsClearColor(grid.backgroundColor))
- {
- var p1 = new Vector2(grid.runtimeX, grid.runtimeY);
- var p2 = new Vector2(grid.runtimeX, grid.runtimeY + grid.runtimeHeight);
- var p3 = new Vector2(grid.runtimeX + grid.runtimeWidth, grid.runtimeY + grid.runtimeHeight);
- var p4 = new Vector2(grid.runtimeX + grid.runtimeWidth, grid.runtimeY);
- UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, grid.backgroundColor);
- }
- }
- }
- private void DrawYAxisSplit(VertexHelper vh, int yAxisIndex, YAxis yAxis)
- {
- if (AxisHelper.NeedShowSplit(yAxis))
- {
- var grid = GetAxisGridOrDefault(yAxis);
- if (grid == null) return;
- var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(yAxis, dataZooms);
- var size = AxisHelper.GetScaleNumber(yAxis, grid.runtimeWidth, dataZoom);
- var totalWidth = grid.runtimeY;
- var xAxis = GetRelatedXAxis(yAxis);
- var zeroPos = new Vector3(grid.runtimeX + xAxis.runtimeZeroXOffset, grid.runtimeY + yAxis.runtimeZeroYOffset);
- var lineColor = yAxis.splitLine.GetColor(m_Theme.axis.splitLineColor);
- var lineWidth = yAxis.splitLine.GetWidth(m_Theme.axis.lineWidth);
- var lineType = yAxis.splitLine.GetType(m_Theme.axis.splitLineType);
- for (int i = 0; i < size; i++)
- {
- var scaleWidth = AxisHelper.GetScaleWidth(yAxis, grid.runtimeHeight, i + 1, dataZoom);
- float pY = totalWidth;
- if (yAxis.boundaryGap && yAxis.axisTick.alignWithLabel)
- {
- pY -= scaleWidth / 2;
- }
- if (yAxis.splitArea.show && i < size - 1)
- {
- UGL.DrawQuadrilateral(vh, new Vector2(grid.runtimeX, pY),
- new Vector2(grid.runtimeX + grid.runtimeWidth, pY),
- new Vector2(grid.runtimeX + grid.runtimeWidth, pY + scaleWidth),
- new Vector2(grid.runtimeX, pY + scaleWidth),
- yAxis.splitArea.GetColor(i, m_Theme.axis));
- }
- if (yAxis.splitLine.show)
- {
- if (!xAxis.axisLine.show || !xAxis.axisLine.onZero || zeroPos.y != pY)
- {
- if (yAxis.splitLine.NeedShow(i))
- {
- ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, new Vector3(grid.runtimeX, pY),
- new Vector3(grid.runtimeX + grid.runtimeWidth, pY), lineColor);
- }
- }
- }
- totalWidth += scaleWidth;
- }
- }
- }
- private void DrawYAxisTick(VertexHelper vh, int yAxisIndex, YAxis yAxis)
- {
- if (AxisHelper.NeedShowSplit(yAxis))
- {
- var grid = GetAxisGridOrDefault(yAxis);
- var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(yAxis, dataZooms);
- var size = AxisHelper.GetScaleNumber(yAxis, grid.runtimeWidth, dataZoom);
- var totalWidth = grid.runtimeY;
- for (int i = 0; i < size; i++)
- {
- var scaleWidth = AxisHelper.GetScaleWidth(yAxis, grid.runtimeHeight, i + 1, dataZoom);
- if (i == 0 && (!yAxis.axisTick.showStartTick || yAxis.axisTick.alignWithLabel))
- {
- totalWidth += scaleWidth;
- continue;
- }
- if (i == size - 1 && !yAxis.axisTick.showEndTick)
- {
- totalWidth += scaleWidth;
- continue;
- }
- if (yAxis.axisTick.show)
- {
- float pX = 0;
- float pY = totalWidth;
- if (yAxis.boundaryGap && yAxis.axisTick.alignWithLabel) pY -= scaleWidth / 2;
- var startX = grid.runtimeX + GetYAxisOnZeroOffset(yAxis) + yAxis.offset;
- startX -= yAxis.axisLine.GetWidth(m_Theme.axis.lineWidth);
- if (yAxis.IsValue() && yAxis.IsRight()) startX += grid.runtimeWidth;
- bool inside = yAxis.axisTick.inside;
- if ((inside && yAxis.IsLeft()) || (!inside && yAxis.IsRight()))
- {
- pX += startX + yAxis.axisTick.GetLength(m_Theme.axis.tickLength);
- }
- else
- {
- pX += startX - yAxis.axisTick.GetLength(m_Theme.axis.tickLength);
- }
- UGL.DrawLine(vh, new Vector3(startX, pY), new Vector3(pX, pY),
- yAxis.axisTick.GetWidth(m_Theme.axis.tickWidth),
- yAxis.axisTick.GetColor(m_Theme.axis.tickColor));
- }
- totalWidth += scaleWidth;
- }
- }
- if (yAxis.show && yAxis.axisLine.show && yAxis.axisLine.showArrow)
- {
- var grid = GetAxisGridOrDefault(yAxis);
- var lineX = grid.runtimeX + GetYAxisOnZeroOffset(yAxis);
- if (yAxis.IsValue() && yAxis.IsRight()) lineX += grid.runtimeWidth;
- var inverse = yAxis.IsValue() && yAxis.inverse;
- var axisArrow = yAxis.axisLine.arrow;
- if (inverse)
- {
- var startPos = new Vector3(lineX, grid.runtimeY + grid.runtimeHeight);
- var arrowPos = new Vector3(lineX, grid.runtimeY);
- UGL.DrawArrow(vh, startPos, arrowPos, axisArrow.width, axisArrow.height,
- axisArrow.offset, axisArrow.dent,
- axisArrow.GetColor(yAxis.axisLine.GetColor(m_Theme.axis.lineColor)));
- }
- else
- {
- var lineWidth = yAxis.axisLine.GetWidth(m_Theme.axis.lineWidth);
- var startPos = new Vector3(lineX, grid.runtimeX);
- var arrowPos = new Vector3(lineX, grid.runtimeY + grid.runtimeHeight + lineWidth);
- UGL.DrawArrow(vh, startPos, arrowPos, axisArrow.width, axisArrow.height,
- axisArrow.offset, axisArrow.dent,
- axisArrow.GetColor(yAxis.axisLine.GetColor(m_Theme.axis.lineColor)));
- }
- }
- }
- private void DrawXAxisSplit(VertexHelper vh, int xAxisIndex, XAxis xAxis)
- {
- if (AxisHelper.NeedShowSplit(xAxis))
- {
- var grid = GetAxisGridOrDefault(xAxis);
- if (grid == null) return;
- var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(xAxis, dataZooms);
- var size = AxisHelper.GetScaleNumber(xAxis, grid.runtimeWidth, dataZoom);
- var totalWidth = grid.runtimeX;
- var yAxis = m_YAxes[xAxisIndex];
- var zeroPos = new Vector3(grid.runtimeX, grid.runtimeY + yAxis.runtimeZeroYOffset);
- var lineColor = xAxis.splitLine.GetColor(m_Theme.axis.splitLineColor);
- var lineWidth = xAxis.splitLine.GetWidth(m_Theme.axis.lineWidth);
- var lineType = xAxis.splitLine.GetType(m_Theme.axis.splitLineType);
- for (int i = 0; i < size; i++)
- {
- var scaleWidth = AxisHelper.GetScaleWidth(xAxis, grid.runtimeWidth, i + 1, dataZoom);
- float pX = totalWidth;
- if (xAxis.boundaryGap && xAxis.axisTick.alignWithLabel)
- {
- pX -= scaleWidth / 2;
- }
- if (xAxis.splitArea.show && i < size - 1)
- {
- UGL.DrawQuadrilateral(vh, new Vector2(pX, grid.runtimeY),
- new Vector2(pX, grid.runtimeY + grid.runtimeHeight),
- new Vector2(pX + scaleWidth, grid.runtimeY + grid.runtimeHeight),
- new Vector2(pX + scaleWidth, grid.runtimeY),
- xAxis.splitArea.GetColor(i, m_Theme.axis));
- }
- if (xAxis.splitLine.show)
- {
- if (!yAxis.axisLine.show || !yAxis.axisLine.onZero || zeroPos.x != pX)
- {
- if (xAxis.splitLine.NeedShow(i))
- {
- ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, new Vector3(pX, grid.runtimeY),
- new Vector3(pX, grid.runtimeY + grid.runtimeHeight), lineColor);
- }
- }
- }
- totalWidth += AxisHelper.GetScaleWidth(xAxis, grid.runtimeWidth, i + 1, dataZoom);
- }
- }
- }
- private void DrawXAxisTick(VertexHelper vh, int xAxisIndex, XAxis xAxis)
- {
- var grid = GetAxisGridOrDefault(xAxis);
- if (AxisHelper.NeedShowSplit(xAxis))
- {
- var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(xAxis, dataZooms);
- var size = AxisHelper.GetScaleNumber(xAxis, grid.runtimeWidth, dataZoom);
- var totalWidth = grid.runtimeX;
- var yAxis = m_YAxes[xAxisIndex];
- for (int i = 0; i < size; i++)
- {
- var scaleWidth = AxisHelper.GetScaleWidth(xAxis, grid.runtimeWidth, i + 1, dataZoom);
- if (i == 0 && (!xAxis.axisTick.showStartTick || xAxis.axisTick.alignWithLabel))
- {
- totalWidth += scaleWidth;
- continue;
- }
- if (i == size - 1 && !xAxis.axisTick.showEndTick)
- {
- totalWidth += scaleWidth;
- continue;
- }
- if (xAxis.axisTick.show)
- {
- float pX = totalWidth;
- float pY = 0;
- if (xAxis.boundaryGap && xAxis.axisTick.alignWithLabel) pX -= scaleWidth / 2;
- var startY = grid.runtimeY + xAxis.offset - xAxis.axisLine.GetWidth(m_Theme.axis.lineWidth);
- if (xAxis.IsTop()) startY += grid.runtimeHeight;
- else startY += GetXAxisOnZeroOffset(xAxis);
- bool inside = xAxis.axisTick.inside;
- if ((inside && xAxis.IsBottom()) || (!inside && xAxis.IsTop()))
- {
- pY += startY + xAxis.axisTick.GetLength(m_Theme.axis.tickLength);
- }
- else
- {
- pY += startY - xAxis.axisTick.GetLength(m_Theme.axis.tickLength);
- }
- UGL.DrawLine(vh, new Vector3(pX, startY), new Vector3(pX, pY),
- xAxis.axisTick.GetWidth(m_Theme.axis.tickWidth),
- xAxis.axisTick.GetColor(m_Theme.axis.tickColor));
- }
- totalWidth += scaleWidth;
- }
- }
- if (xAxis.show && xAxis.axisLine.show && xAxis.axisLine.showArrow)
- {
- var lineY = grid.runtimeY + xAxis.offset;
- if (xAxis.IsTop()) lineY += grid.runtimeHeight;
- else lineY += GetXAxisOnZeroOffset(xAxis);
- var inverse = xAxis.IsValue() && xAxis.inverse;
- var axisArrow = xAxis.axisLine.arrow;
- if (inverse)
- {
- var startPos = new Vector3(grid.runtimeX + grid.runtimeWidth, lineY);
- var arrowPos = new Vector3(grid.runtimeX, lineY);
- UGL.DrawArrow(vh, startPos, arrowPos, axisArrow.width, axisArrow.height,
- axisArrow.offset, axisArrow.dent,
- axisArrow.GetColor(xAxis.axisLine.GetColor(m_Theme.axis.lineColor)));
- }
- else
- {
- var startPos = new Vector3(grid.runtimeX, lineY);
- var arrowPos = new Vector3(grid.runtimeX + grid.runtimeWidth + xAxis.axisLine.GetWidth(m_Theme.axis.lineWidth), lineY);
- UGL.DrawArrow(vh, startPos, arrowPos, axisArrow.width, axisArrow.height,
- axisArrow.offset, axisArrow.dent,
- axisArrow.GetColor(xAxis.axisLine.GetColor(m_Theme.axis.lineColor)));
- }
- }
- }
- private void DrawXAxisLine(VertexHelper vh, int xAxisIndex, XAxis xAxis)
- {
- if (xAxis.show && xAxis.axisLine.show)
- {
- var grid = GetAxisGridOrDefault(xAxis);
- var inverse = xAxis.IsValue() && xAxis.inverse;
- var offset = AxisHelper.GetAxisLineSymbolOffset(xAxis);
- var lineY = grid.runtimeY + xAxis.offset;
- if (xAxis.IsTop()) lineY += grid.runtimeHeight;
- else lineY += GetXAxisOnZeroOffset(xAxis);
- var lineWidth = xAxis.axisLine.GetWidth(m_Theme.axis.lineWidth);
- var lineType = xAxis.axisLine.GetType(m_Theme.axis.lineType);
- var lineColor = xAxis.axisLine.GetColor(m_Theme.axis.lineColor);
- var left = new Vector3(grid.runtimeX - lineWidth - (inverse ? offset : 0), lineY);
- var right = new Vector3(grid.runtimeX + grid.runtimeWidth + lineWidth + (!inverse ? offset : 0), lineY);
- ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, left, right, lineColor);
- }
- }
- private void DrawYAxisLine(VertexHelper vh, int yAxisIndex, YAxis yAxis)
- {
- if (yAxis.show && yAxis.axisLine.show)
- {
- var grid = GetAxisGridOrDefault(yAxis);
- var offset = AxisHelper.GetAxisLineSymbolOffset(yAxis);
- var inverse = yAxis.IsValue() && yAxis.inverse;
- var lineX = grid.runtimeX + yAxis.offset;
- if (yAxis.IsRight()) lineX += grid.runtimeWidth;
- else lineX += GetYAxisOnZeroOffset(yAxis);
- var lineWidth = yAxis.axisLine.GetWidth(m_Theme.axis.lineWidth);
- var lineType = yAxis.axisLine.GetType(m_Theme.axis.lineType);
- var lineColor = yAxis.axisLine.GetColor(m_Theme.axis.lineColor);
- var bottom = new Vector3(lineX, grid.runtimeY - lineWidth - (inverse ? offset : 0));
- var top = new Vector3(lineX, grid.runtimeY + grid.runtimeHeight + lineWidth + (!inverse ? offset : 0));
- ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, bottom, top, lineColor);
- }
- }
- protected void DrawXTooltipIndicator(VertexHelper vh)
- {
- if (!tooltip.show || !tooltip.IsSelected()) return;
- if (tooltip.type == Tooltip.Type.None) return;
- if (tooltip.runtimeGridIndex < 0) return;
- var grid = GetGrid(tooltip.runtimeGridIndex);
- if (grid == null) return;
- var lineType = tooltip.lineStyle.GetType(m_Theme.tooltip.lineType);
- var lineWidth = tooltip.lineStyle.GetWidth(m_Theme.tooltip.lineWidth);
- for (int i = 0; i < m_XAxes.Count; i++)
- {
- var xAxis = m_XAxes[i];
- if (!xAxis.show) continue;
- if (tooltip.runtimeXValues[i] < 0) continue;
- var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(xAxis, dataZooms);
- int dataCount = m_Series.list.Count > 0 ? m_Series.list[0].GetDataList(dataZoom).Count : 0;
- float splitWidth = AxisHelper.GetDataWidth(xAxis, grid.runtimeWidth, dataCount, dataZoom);
- switch (tooltip.type)
- {
- case Tooltip.Type.Corss:
- case Tooltip.Type.Line:
- float pX = (float)(grid.runtimeX + tooltip.runtimeXValues[i] * splitWidth
- + (xAxis.boundaryGap ? splitWidth / 2 : 0));
- if (xAxis.IsValue()) pX = tooltip.runtimePointerPos.x;
- Vector2 sp = new Vector2(pX, grid.runtimeY);
- Vector2 ep = new Vector2(pX, grid.runtimeY + grid.runtimeHeight);
- var lineColor = TooltipHelper.GetLineColor(tooltip, m_Theme);
- ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, sp, ep, lineColor);
- if (tooltip.type == Tooltip.Type.Corss)
- {
- sp = new Vector2(grid.runtimeX, tooltip.runtimePointerPos.y);
- ep = new Vector2(grid.runtimeX + grid.runtimeWidth, tooltip.runtimePointerPos.y);
- ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, sp, ep, lineColor);
- }
- break;
- case Tooltip.Type.Shadow:
- float tooltipSplitWid = splitWidth < 1 ? 1 : splitWidth;
- pX = (float)(grid.runtimeX + splitWidth * tooltip.runtimeXValues[i] -
- (xAxis.boundaryGap ? 0 : splitWidth / 2));
- if (xAxis.IsValue()) pX = (float)tooltip.runtimeXValues[i];
- float pY = grid.runtimeY + grid.runtimeHeight;
- Vector3 p1 = new Vector3(pX, grid.runtimeY);
- Vector3 p2 = new Vector3(pX, pY);
- Vector3 p3 = new Vector3(pX + tooltipSplitWid, pY);
- Vector3 p4 = new Vector3(pX + tooltipSplitWid, grid.runtimeY);
- UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, m_Theme.tooltip.areaColor);
- break;
- }
- }
- }
- protected void DrawYTooltipIndicator(VertexHelper vh)
- {
- if (!tooltip.show || !tooltip.IsSelected()) return;
- if (tooltip.type == Tooltip.Type.None) return;
- if (tooltip.runtimeGridIndex < 0) return;
- var grid = GetGrid(tooltip.runtimeGridIndex);
- if (grid == null) return;
- var lineType = tooltip.lineStyle.GetType(m_Theme.tooltip.lineType);
- var lineWidth = tooltip.lineStyle.GetWidth(m_Theme.tooltip.lineWidth);
- for (int i = 0; i < m_YAxes.Count; i++)
- {
- var yAxis = m_YAxes[i];
- if (!yAxis.show) continue;
- if (tooltip.runtimeYValues[i] < 0) continue;
- var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(yAxis, dataZooms);
- int dataCount = m_Series.list.Count > 0 ? m_Series.list[0].GetDataList(dataZoom).Count : 0;
- float splitWidth = AxisHelper.GetDataWidth(yAxis, grid.runtimeHeight, dataCount, dataZoom);
- switch (tooltip.type)
- {
- case Tooltip.Type.Corss:
- case Tooltip.Type.Line:
- float pY = (float)(grid.runtimeY + tooltip.runtimeYValues[i] * splitWidth + (yAxis.boundaryGap ? splitWidth / 2 : 0));
- Vector2 sp = new Vector2(grid.runtimeX, pY);
- Vector2 ep = new Vector2(grid.runtimeX + grid.runtimeWidth, pY);
- var lineColor = TooltipHelper.GetLineColor(tooltip, m_Theme);
- ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, sp, ep, lineColor);
- if (tooltip.type == Tooltip.Type.Corss)
- {
- sp = new Vector2(grid.runtimeX, tooltip.runtimePointerPos.y);
- ep = new Vector2(grid.runtimeX + grid.runtimeWidth, tooltip.runtimePointerPos.y);
- ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, sp, ep, lineColor);
- }
- break;
- case Tooltip.Type.Shadow:
- float tooltipSplitWid = splitWidth < 1 ? 1 : splitWidth;
- float pX = grid.runtimeX + grid.runtimeWidth;
- pY = (float)(grid.runtimeY + splitWidth * tooltip.runtimeYValues[i] -
- (yAxis.boundaryGap ? 0 : splitWidth / 2));
- Vector3 p1 = new Vector3(grid.runtimeX, pY);
- Vector3 p2 = new Vector3(grid.runtimeX, pY + tooltipSplitWid);
- Vector3 p3 = new Vector3(pX, pY + tooltipSplitWid);
- Vector3 p4 = new Vector3(pX, pY);
- UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, m_Theme.tooltip.areaColor);
- break;
- }
- }
- }
- private void CheckRaycastTarget()
- {
- var anyDataZoom = false;
- foreach (var dataZoom in dataZooms)
- {
- if (dataZoom.enable) anyDataZoom = true;
- }
- var ray = anyDataZoom
- || (visualMap != null && visualMap.enable && visualMap.show && visualMap.calculable);
- if (raycastTarget != ray)
- {
- raycastTarget = ray;
- }
- }
- public bool IsAnyYAxisIsCategory()
- {
- foreach (var yAxis in m_YAxes)
- {
- if (yAxis.type == Axis.AxisType.Category)
- {
- return true;
- }
- }
- return false;
- }
- protected virtual void DrawLabelBackground(VertexHelper vh)
- {
- var isYAxis = IsAnyYAxisIsCategory();
- for (int n = 0; n < m_Series.Count; n++)
- {
- var serie = m_Series.GetSerie(n);
- if (!serie.show) continue;
- if (serie.IsPerformanceMode()) continue;
- if (!serie.IsCoordinateSerie()) continue;
- DataZoomHelper.GetSerieRelatedDataZoom(serie, dataZooms, out var xDataZoom, out var yDataZoom);
- var showData = serie.GetDataList(xDataZoom);
- for (int j = 0; j < showData.Count; j++)
- {
- var serieData = showData[j];
- if (serieData.labelObject == null) continue;
- var serieLabel = SerieHelper.GetSerieLabel(serie, serieData, serieData.highlighted);
- serieData.index = j;
- if (serieLabel.show && j < serie.dataPoints.Count)
- {
- var pos = serie.dataPoints[j];
- var isIngore = ChartHelper.IsIngore(pos);
- if (isIngore)
- {
- serieData.SetLabelActive(false);
- }
- else
- {
- Internal_RefreshLabelPosition(serie, serieData, serieLabel, pos, serie.type == SerieType.Bar, isYAxis);
- m_RefreshLabel = true;
- if (serieLabel.show) DrawLabelBackground(vh, serie, serieData);
- }
- }
- else
- {
- serieData.SetLabelActive(false);
- }
- }
- }
- }
- public void Internal_RefreshLabelPosition(Serie serie, SerieData serieData, SerieLabel serieLabel, Vector3 pos, bool IsNeedCheckPosition, bool isYAxis)
- {
- if (IsNeedCheckPosition)
- {
- var value = serieData.data[1];
- var zeroPos = Vector3.zero;
- var lastStackSerie = SeriesHelper.GetLastStackSerie(m_Series, serie.index);
- if (serieLabel.position == SerieLabel.Position.Bottom || serieLabel.position == SerieLabel.Position.Center)
- {
- if (isYAxis)
- {
- var xAxis = m_XAxes[serie.xAxisIndex];
- var grid = GetAxisGridOrDefault(xAxis);
- zeroPos = new Vector3(grid.runtimeX + xAxis.runtimeZeroXOffset, grid.runtimeY);
- }
- else
- {
- var yAxis = m_YAxes[serie.yAxisIndex];
- var grid = GetAxisGridOrDefault(yAxis);
- zeroPos = new Vector3(grid.runtimeX, grid.runtimeY + yAxis.runtimeZeroYOffset);
- }
- }
- var bottomPos = lastStackSerie == null ? zeroPos : lastStackSerie.dataPoints[serieData.index];
- switch (serieLabel.position)
- {
- case SerieLabel.Position.Center:
- pos = isYAxis ? new Vector3(bottomPos.x + (pos.x - bottomPos.x) / 2, pos.y) :
- new Vector3(pos.x, bottomPos.y + (pos.y - bottomPos.y) / 2);
- break;
- case SerieLabel.Position.Bottom:
- pos = isYAxis ? new Vector3(bottomPos.x, pos.y) : new Vector3(pos.x, bottomPos.y);
- break;
- }
- }
- serieData.labelPosition = pos;
- }
- protected override void OnRefreshLabel()
- {
- base.OnRefreshLabel();
- var isYAxis = IsAnyYAxisIsCategory();
- var anyPercentStack = SeriesHelper.IsPercentStack(m_Series, SerieType.Bar);
- for (int i = 0; i < m_Series.Count; i++)
- {
- var serie = m_Series.GetSerie(i);
- if (serie.IsPerformanceMode()) continue;
- if (!serie.IsCoordinateSerie()) continue;
- var total = serie.yTotal;
- var isPercentStack = SeriesHelper.IsPercentStack(m_Series, serie.stack, SerieType.Bar);
- DataZoomHelper.GetSerieRelatedDataZoom(serie, dataZooms, out var xDataZoom, out var yDataZoom);
- var showData = serie.GetDataList(xDataZoom);
- if (xDataZoom != null)
- ChartHelper.HideAllObject(m_SerieLabelRoot, "label_" + i);
- for (int j = 0; j < showData.Count; j++)
- {
- var serieData = showData[j];
- if (serieData.labelObject == null) continue;
- if (j >= serie.dataPoints.Count)
- {
- serieData.SetLabelActive(false);
- serieData.SetIconActive(false);
- continue;
- }
- serieData.labelObject.SetActive(true);
- var pos = serie.dataPoints[j];
- var serieLabel = SerieHelper.GetSerieLabel(serie, serieData);
- var iconStyle = SerieHelper.GetIconStyle(serie, serieData);
- var dimension = 1;
- var isIgnore = serie.IsIgnoreIndex(j);
- Internal_RefreshLabelPosition(serie, serieData, serieLabel, pos, serie.type == SerieType.Bar, isYAxis);
- serieData.labelObject.SetPosition(serieData.labelPosition);
- serieData.labelObject.UpdateIcon(iconStyle);
- if (serie.show && serieLabel.show && serieData.canShowLabel && !isIgnore)
- {
- double value = 0;
- if (serie.type == SerieType.Heatmap)
- {
- dimension = VisualMapHelper.GetDimension(visualMap, serieData.data.Count);
- }
- SerieLabelHelper.ResetLabel(serieData.labelObject.label, serieLabel, theme, i);
- value = serieData.data[dimension];
- var content = "";
- if (anyPercentStack && isPercentStack)
- {
- var tempTotal = Internal_GetBarSameStackTotalValue(serie.stack, j, SerieType.Custom);
- content = SerieLabelHelper.GetFormatterContent(serie, serieData, value, tempTotal,
- serieLabel, theme.GetColor(i));
- }
- else
- {
- content = SerieLabelHelper.GetFormatterContent(serie, serieData, value, total,
- serieLabel, theme.GetColor(i));
- }
- serieData.SetLabelActive(serieData.labelPosition != Vector3.zero);
- var invert = serieLabel.autoOffset
- && serie.type == SerieType.Line
- && SerieHelper.IsDownPoint(serie, j)
- && !serie.areaStyle.show;
- serieData.labelObject.SetLabelPosition(invert ? -serieLabel.offset : serieLabel.offset);
- if (serieData.labelObject.SetText(content)) RefreshChart();
- }
- else
- {
- serieData.SetLabelActive(false);
- }
- }
- }
- }
- public void Internal_CheckClipAndDrawPolygon(VertexHelper vh, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4,
- Color32 color, bool clip, Grid grid)
- {
- Internal_CheckClipAndDrawPolygon(vh, p1, p2, p3, p4, color, color, clip, grid);
- }
- public void Internal_CheckClipAndDrawPolygon(VertexHelper vh, Vector3 p, float radius, Color32 color,
- bool clip, bool vertical, Grid grid)
- {
- if (!IsInChart(p)) return;
- if (!clip || (clip && (IsInGrid(grid, p))))
- UGL.DrawSquare(vh, p, radius, color);
- }
- public void Internal_CheckClipAndDrawPolygon(VertexHelper vh, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4,
- Color32 startColor, Color32 toColor, bool clip, Grid grid)
- {
- ClampInChart(ref p1);
- ClampInChart(ref p2);
- ClampInChart(ref p3);
- ClampInChart(ref p4);
- if (clip)
- {
- p1 = ClampInGrid(grid, p1);
- p2 = ClampInGrid(grid, p2);
- p3 = ClampInGrid(grid, p3);
- p4 = ClampInGrid(grid, p4);
- }
- if (!clip || (clip && (IsInGrid(grid, p1) && IsInGrid(grid, p2) && IsInGrid(grid, p3) && IsInGrid(grid, p4))))
- UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, startColor, toColor);
- }
- public void Internal_CheckClipAndDrawPolygon(VertexHelper vh, ref Vector3 p1, ref Vector3 p2, ref Vector3 p3, ref Vector3 p4,
- Color32 startColor, Color32 toColor, bool clip, Grid grid)
- {
- ClampInChart(ref p1);
- ClampInChart(ref p2);
- ClampInChart(ref p3);
- ClampInChart(ref p4);
- if (clip)
- {
- p1 = ClampInGrid(grid, p1);
- p2 = ClampInGrid(grid, p2);
- p3 = ClampInGrid(grid, p3);
- p4 = ClampInGrid(grid, p4);
- }
- if (!clip
- || (clip && (IsInGrid(grid, p1) && IsInGrid(grid, p2) && IsInGrid(grid, p3) && IsInGrid(grid, p4))))
- UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, startColor, toColor);
- }
- public void Internal_CheckClipAndDrawTriangle(VertexHelper vh, Vector3 p1, Vector3 p2, Vector3 p3, Color32 color,
- bool clip, Grid grid)
- {
- Internal_CheckClipAndDrawTriangle(vh, p1, p2, p3, color, color, color, clip, grid);
- }
- public void Internal_CheckClipAndDrawTriangle(VertexHelper vh, Vector3 p1, Vector3 p2, Vector3 p3, Color32 color,
- Color32 color2, Color32 color3, bool clip, Grid grid)
- {
- if (!IsInChart(p1) || !IsInChart(p2) || !IsInChart(p3)) return;
- if (!clip || (clip && (IsInGrid(grid, p1) || IsInGrid(grid, p2) || IsInGrid(grid, p3))))
- UGL.DrawTriangle(vh, p1, p2, p3, color, color2, color3);
- }
- public void Internal_CheckClipAndDrawLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size, Color32 color,
- bool clip, Grid grid)
- {
- if (!IsInChart(p1) || !IsInChart(p2)) return;
- if (!clip || (clip && (IsInGrid(grid, p1) || IsInGrid(grid, p2))))
- UGL.DrawLine(vh, p1, p2, size, color);
- }
- public void Internal_CheckClipAndDrawSymbol(VertexHelper vh, SerieSymbolType type, float symbolSize, float tickness,
- Vector3 pos, Color32 color, Color32 toColor, Color32 backgroundColor, float gap, bool clip, float[] cornerRadius,
- Grid grid, Vector3 startPos)
- {
- if (!IsInChart(pos)) return;
- if (!clip || (clip && (IsInGrid(grid, pos))))
- DrawSymbol(vh, type, symbolSize, tickness, pos, color, toColor, backgroundColor, gap, cornerRadius, startPos);
- }
- public void Internal_CheckClipAndDrawZebraLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size, float zebraWidth,
- float zebraGap, Color32 color, Color32 toColor, bool clip, Grid grid)
- {
- ClampInChart(ref p1);
- ClampInChart(ref p2);
- UGL.DrawZebraLine(vh, p1, p2, size, zebraWidth, zebraGap, color, toColor);
- }
- protected Color32 GetXLerpColor(Color32 areaColor, Color32 areaToColor, Vector3 pos, Grid grid)
- {
- if (ChartHelper.IsValueEqualsColor(areaColor, areaToColor)) return areaColor;
- return Color32.Lerp(areaToColor, areaColor, (pos.y - grid.runtimeY) / grid.runtimeHeight);
- }
- protected Color32 GetYLerpColor(Color32 areaColor, Color32 areaToColor, Vector3 pos, Grid grid)
- {
- if (ChartHelper.IsValueEqualsColor(areaColor, areaToColor)) return areaColor;
- return Color32.Lerp(areaToColor, areaColor, (pos.x - grid.runtimeX) / grid.runtimeWidth);
- }
- public Grid GetAxisGridOrDefault(Axis axis)
- {
- var index = axis.gridIndex;
- if (index >= 0 && index < m_Grids.Count)
- {
- return m_Grids[index];
- }
- else if (m_Grids.Count > 0)
- {
- return m_Grids[0];
- }
- else
- {
- return null;
- }
- }
- public Grid GetDataZoomGridOrDefault(DataZoom dataZoom)
- {
- Grid grid = null;
- if (dataZoom.xAxisIndexs != null && dataZoom.xAxisIndexs.Count > 0)
- {
- var xAxis = GetXAxis(dataZoom.xAxisIndexs[0]);
- grid = GetGrid(xAxis.gridIndex);
- }
- else if (dataZoom.yAxisIndexs != null && dataZoom.yAxisIndexs.Count > 0)
- {
- var yAxis = GetYAxis(dataZoom.yAxisIndexs[0]);
- grid = GetGrid(yAxis.gridIndex);
- }
- if (grid == null) return m_Grids[0];
- else return grid;
- }
- public Grid GetSerieGridOrDefault(Serie serie)
- {
- var xAxis = GetSerieXAxisOrDefault(serie);
- var yAxis = GetSerieYAxisOrDefault(serie);
- Grid grid = GetGrid(xAxis.gridIndex);
- if (xAxis.gridIndex != yAxis.gridIndex)
- {
- Debug.LogErrorFormat("serie {0}:{1} xAxisIndex:{2} and yAxisIndex:{3} not in the same grid.",
- serie.index, serie.name, serie.xAxisIndex, serie.yAxisIndex);
- }
- if (grid == null)
- {
- grid = m_Grids[0];
- grid.index = 0;
- }
- else
- {
- grid.index = xAxis.gridIndex;
- }
- return grid;
- }
- public XAxis GetSerieXAxisOrDefault(Serie serie)
- {
- var axis = GetXAxis(serie.xAxisIndex);
- if (axis == null)
- {
- Debug.LogErrorFormat("serie {0}:{1} xAxisIndex:{2} not exist.", serie.index, serie.name, serie.xAxisIndex);
- axis = m_XAxes[0];
- }
- return axis;
- }
- public YAxis GetSerieYAxisOrDefault(Serie serie)
- {
- var axis = GetYAxis(serie.yAxisIndex);
- if (axis == null)
- {
- Debug.LogErrorFormat("serie {0}:{1} yAxisIndex:{2} not exist.", serie.index, serie.name, serie.xAxisIndex);
- return m_YAxes[0];
- }
- return axis;
- }
- protected void UpdateSerieGridIndex()
- {
- for (int i = 0; i < m_Series.Count; i++)
- {
- var serie = m_Series.GetSerie(i);
- serie.index = i;
- var grid = GetSerieGridOrDefault(serie);
- serie.runtimeGridIndex = grid.index;
- }
- }
- public float GetXAxisOnZeroOffset(XAxis axis)
- {
- if (!axis.axisLine.onZero) return 0;
- foreach (var yAxis in m_YAxes)
- {
- if (yAxis.IsValue() && yAxis.gridIndex == axis.gridIndex) return yAxis.runtimeZeroYOffset;
- }
- return 0;
- }
- public float GetYAxisOnZeroOffset(YAxis axis)
- {
- if (!axis.axisLine.onZero) return 0;
- foreach (var xAxis in m_XAxes)
- {
- if (xAxis.IsValue() && xAxis.gridIndex == axis.gridIndex) return xAxis.runtimeZeroXOffset;
- }
- return 0;
- }
- public YAxis GetRelatedYAxis(XAxis axis)
- {
- foreach (var yAxis in m_YAxes)
- {
- if (yAxis.gridIndex == axis.gridIndex) return yAxis;
- }
- return m_YAxes[0];
- }
- public XAxis GetRelatedXAxis(YAxis axis)
- {
- foreach (var xAxis in m_XAxes)
- {
- if (xAxis.gridIndex == axis.gridIndex) return xAxis;
- }
- return m_XAxes[0];
- }
- }
- }
|