From c9addaf02ccbff0eb957efb8e5e514c06534a526 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Thu, 13 Jan 2022 21:45:59 +0800 Subject: [PATCH] 3.0 - bar chart --- Editor/Series/BarEditor.cs | 1 + Editor/Series/SerieListEditor.cs | 4 ++ Resources/XCTheme-Default.asset | 7 +-- Runtime/Chart/BaseChart_API.cs | 7 +-- Runtime/Component/Axis/AxisHelper.cs | 47 ++++++++++++++--- Runtime/Component/Tooltip/TooltipHelper.cs | 17 +++++-- Runtime/Component/Tooltip/TooltipView.cs | 8 ++- Runtime/Helper/SeriesHelper.cs | 3 ++ Runtime/Internal/BaseChart.Serie.cs | 6 +-- Runtime/Internal/Basic/BaseSerie.cs | 11 ---- Runtime/Internal/Utilities/ChartHelper.cs | 12 +++-- Runtime/Internal/XCSettings.cs | 1 + Runtime/Serie/Bar/Bar.cs | 2 +- Runtime/Serie/Bar/BarHandler.cs | 56 ++++++++++++--------- Runtime/Serie/Bar/SimplifiedBarHandler.cs | 6 +-- Runtime/Serie/InteractData.cs | 17 +++++-- Runtime/Serie/Line/LineHandler.GridCoord.cs | 13 +++-- Runtime/Serie/Line/SimplifiedLineHandler.cs | 8 +-- Runtime/Serie/Serie.cs | 15 +++--- Runtime/Serie/SerieHandler.cs | 48 ++++++++++++++---- Runtime/Theme/Theme.cs | 10 ---- Runtime/Theme/ThemeStyle.cs | 2 +- 22 files changed, 195 insertions(+), 106 deletions(-) diff --git a/Editor/Series/BarEditor.cs b/Editor/Series/BarEditor.cs index 802f1ec3..ab0fa0bf 100644 --- a/Editor/Series/BarEditor.cs +++ b/Editor/Series/BarEditor.cs @@ -38,6 +38,7 @@ namespace XCharts.Editor PropertyField("m_Large"); PropertyField("m_LargeThreshold"); PropertyField("m_Clip"); + PropertyField("m_PlaceHolder"); }); PropertyField("m_ItemStyle"); PropertyField("m_Animation"); diff --git a/Editor/Series/SerieListEditor.cs b/Editor/Series/SerieListEditor.cs index 15a82962..0f0d3984 100644 --- a/Editor/Series/SerieListEditor.cs +++ b/Editor/Series/SerieListEditor.cs @@ -160,6 +160,8 @@ namespace XCharts.Editor { editor.serie.AddExtraComponent(type); RefreshEditors(); + chart.RefreshAllComponent(); + EditorUtility.SetDirty(chart); }, size == 0)); } foreach (var type in attribute.types) @@ -169,6 +171,8 @@ namespace XCharts.Editor { editor.serie.RemoveExtraComponent(type); RefreshEditors(); + chart.RefreshAllComponent(); + EditorUtility.SetDirty(chart); }, size > 0)); } } diff --git a/Resources/XCTheme-Default.asset b/Resources/XCTheme-Default.asset index d73c98e4..1c121596 100644 --- a/Resources/XCTheme-Default.asset +++ b/Resources/XCTheme-Default.asset @@ -3,8 +3,9 @@ --- !u!114 &11400000 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 @@ -134,7 +135,7 @@ MonoBehaviour: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} m_TextColor: {r: 0, g: 0, b: 0, a: 1} m_TextBackgroundColor: {r: 1, g: 1, b: 1, a: 1} - m_FontSize: 22 + m_FontSize: 20 m_LineType: 0 m_LineWidth: 0.8 m_LineColor: diff --git a/Runtime/Chart/BaseChart_API.cs b/Runtime/Chart/BaseChart_API.cs index 8963d63c..1ca1b59f 100644 --- a/Runtime/Chart/BaseChart_API.cs +++ b/Runtime/Chart/BaseChart_API.cs @@ -1,5 +1,4 @@ - -using UnityEngine; +using UnityEngine; using System.Collections.Generic; using System; using UnityEngine.UI; @@ -113,7 +112,7 @@ namespace XCharts /// public virtual void ClearData() { - foreach(var serie in m_Series) + foreach (var serie in m_Series) serie.ClearData(); foreach (var component in m_Components) component.ClearData(); @@ -214,6 +213,8 @@ namespace XCharts Debug.LogError("UpdateTheme: not support switch to Custom theme."); return false; } + if (m_Theme.sharedTheme == null) + m_Theme.sharedTheme = XCThemeMgr.GetTheme(ThemeType.Default); m_Theme.sharedTheme.CopyTheme(theme); return true; } diff --git a/Runtime/Component/Axis/AxisHelper.cs b/Runtime/Component/Axis/AxisHelper.cs index ac0767fb..1a70fb36 100644 --- a/Runtime/Component/Axis/AxisHelper.cs +++ b/Runtime/Component/Axis/AxisHelper.cs @@ -488,17 +488,46 @@ namespace XCharts } } - public static float GetAxisPosition(GridCoord grid, Axis axis, float scaleWidth, double value) + /// + /// 获得数值value在坐标轴上的坐标位置 + /// + /// + /// + /// + /// + /// + public static float GetAxisValuePosition(GridCoord grid, Axis axis, float scaleWidth, double value) { - return GetAxisPositionInternal(grid, axis, scaleWidth, value, true); + return GetAxisPositionInternal(grid, axis, scaleWidth, value, true, false); } + /// + /// 获得数值value在坐标轴上相对起点的距离 + /// + /// + /// + /// + /// + /// + public static float GetAxisValueDistance(GridCoord grid, Axis axis, float scaleWidth, double value) + { + return GetAxisPositionInternal(grid, axis, scaleWidth, value, false, false); + } + + /// + /// 获得数值value在坐标轴上对于的长度 + /// + /// + /// + /// + /// + /// public static float GetAxisValueLength(GridCoord grid, Axis axis, float scaleWidth, double value) { - return GetAxisPositionInternal(grid, axis, scaleWidth, value, false); + return GetAxisPositionInternal(grid, axis, scaleWidth, value, false, true); } - private static float GetAxisPositionInternal(GridCoord grid, Axis axis, float scaleWidth, double value, bool includeGridXY) + private static float GetAxisPositionInternal(GridCoord grid, Axis axis, float scaleWidth, double value, bool includeGridXY, bool realLength) { var isY = axis is YAxis; var gridHeight = isY ? grid.context.height : grid.context.width; @@ -521,8 +550,14 @@ namespace XCharts } else { - var yDataHig = (axis.context.minMaxRange == 0) ? 0f : - (float)((value - axis.context.minValue) / axis.context.minMaxRange * gridHeight); + var yDataHig = 0f; + if (axis.context.minMaxRange != 0) + { + if (!realLength || (realLength && axis.context.minValue > 0)) + yDataHig = (float)((value - axis.context.minValue) / axis.context.minMaxRange * gridHeight); + else + yDataHig = (float)(value / axis.context.minMaxRange * gridHeight); + } return includeGridXY ? gridXY + yDataHig : yDataHig; diff --git a/Runtime/Component/Tooltip/TooltipHelper.cs b/Runtime/Component/Tooltip/TooltipHelper.cs index 896d90d9..1d2d00d8 100644 --- a/Runtime/Component/Tooltip/TooltipHelper.cs +++ b/Runtime/Component/Tooltip/TooltipHelper.cs @@ -22,10 +22,19 @@ namespace XCharts tooltip.numericFormatter, null, chart); } } + for (int i = tooltip.context.data.param.Count - 1; i >= 0; i--) + { + var param = tooltip.context.data.param[i]; + if (TooltipHelper.IsIgnoreItemFormatter(param.itemFormatter)) + { + tooltip.context.data.param.RemoveAt(i); + } + } foreach (var param in tooltip.context.data.param) { if (!string.IsNullOrEmpty(param.itemFormatter)) { + param.columns.Clear(); var content = param.itemFormatter; FormatterHelper.ReplaceSerieLabelContent(ref content, param.numericFormatter, @@ -35,9 +44,6 @@ namespace XCharts param.category, param.serieData.name, param.color); - - param.columns.Clear(); - foreach (var item in content.Split('|')) { param.columns.Add(item); @@ -46,6 +52,11 @@ namespace XCharts } } + public static bool IsIgnoreItemFormatter(string itemFormatter) + { + return "-".Equals(itemFormatter); + } + public static void LimitInRect(Tooltip tooltip, Rect chartRect) { if (tooltip.view == null) diff --git a/Runtime/Component/Tooltip/TooltipView.cs b/Runtime/Component/Tooltip/TooltipView.cs index 261f3c1a..b62468fa 100644 --- a/Runtime/Component/Tooltip/TooltipView.cs +++ b/Runtime/Component/Tooltip/TooltipView.cs @@ -76,8 +76,12 @@ namespace XCharts { var item = GetItem(i); var param = data.param[i]; + if (param.columns.Count <= 0) + { + item.gameObject.SetActive(false); + continue; + } item.gameObject.SetActive(true); - for (int j = 0; j < param.columns.Count; j++) { var column = GetItemColumn(item, j); @@ -135,7 +139,7 @@ namespace XCharts } else { - if (!string.IsNullOrEmpty(title.text.text)) + if (!string.IsNullOrEmpty(title.GetText())) maxHig += tooltip.titleHeight; maxHig += tooltip.itemHeight * tooltip.context.data.param.Count; maxHig += tooltip.paddingTopBottom * 2; diff --git a/Runtime/Helper/SeriesHelper.cs b/Runtime/Helper/SeriesHelper.cs index 3bb4db92..bd727319 100644 --- a/Runtime/Helper/SeriesHelper.cs +++ b/Runtime/Helper/SeriesHelper.cs @@ -24,6 +24,7 @@ namespace XCharts for (int n = 0; n < series.Count; n++) { var serie = series[n]; + if (serie.placeHolder) continue; if (serie.useDataNameForColor) { for (int i = 0; i < serie.data.Count; i++) @@ -52,6 +53,7 @@ namespace XCharts for (int n = 0; n < chart.series.Count; n++) { var serie = chart.series[n]; + if (serie.placeHolder) continue; if (serie.useDataNameForColor) { for (int i = 0; i < serie.data.Count; i++) @@ -81,6 +83,7 @@ namespace XCharts for (int n = 0; n < series.Count; n++) { var serie = series[n]; + if (serie.placeHolder) continue; if (serie.useDataNameForColor) { bool found = false; diff --git a/Runtime/Internal/BaseChart.Serie.cs b/Runtime/Internal/BaseChart.Serie.cs index ff1703c6..3469ca68 100644 --- a/Runtime/Internal/BaseChart.Serie.cs +++ b/Runtime/Internal/BaseChart.Serie.cs @@ -788,9 +788,9 @@ namespace XCharts Debug.LogError("Serie no Handler:" + serie.GetType()); return; } - var attrubte = serie.GetType().GetAttribute(); - var handler = (SerieHandler)Activator.CreateInstance(attrubte.handler); - handler.attribute = attrubte; + var attribute = serie.GetType().GetAttribute(); + var handler = (SerieHandler)Activator.CreateInstance(attribute.handler); + handler.attribute = attribute; handler.chart = this; handler.SetSerie(serie); serie.handler = handler; diff --git a/Runtime/Internal/Basic/BaseSerie.cs b/Runtime/Internal/Basic/BaseSerie.cs index 19aa8dd2..9cb275fb 100644 --- a/Runtime/Internal/Basic/BaseSerie.cs +++ b/Runtime/Internal/Basic/BaseSerie.cs @@ -73,16 +73,5 @@ namespace XCharts if (handler != null) handler.RefreshLabelNextFrame(); } - -#if UNITY_EDITOR - protected virtual void Reset() - { - } - - protected virtual void OnValidate() - { - SetAllDirty(); - } -#endif } } \ No newline at end of file diff --git a/Runtime/Internal/Utilities/ChartHelper.cs b/Runtime/Internal/Utilities/ChartHelper.cs index 774691d9..172f3f87 100644 --- a/Runtime/Internal/Utilities/ChartHelper.cs +++ b/Runtime/Internal/Utilities/ChartHelper.cs @@ -653,8 +653,9 @@ namespace XCharts count++; intvalue = (int)(max * Mathf.Pow(10, count)); } - if (max > 0) return 1 / Mathf.Pow(10, count - 1); - else return -1 / Mathf.Pow(10, count); + var pow = Mathf.Pow(10, count); + if (max > 0) return (int)((max * pow + 1)) / pow; + else return (int)((max * pow - 1)) / pow; } if (ceilRate == 0) { @@ -694,8 +695,9 @@ namespace XCharts count++; intvalue = (int)(min * Mathf.Pow(10, count)); } - if (min > 0) return 1 / Mathf.Pow(10, count); - else return -1 / Mathf.Pow(10, count - 1); + var pow = Mathf.Pow(10, count); + if (min > 0) return (int)((min * pow + 1)) / pow; + else return (int)((min * pow - 1)) / pow; } if (ceilRate == 0) { @@ -797,7 +799,7 @@ namespace XCharts } - + public static Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle) { diff --git a/Runtime/Internal/XCSettings.cs b/Runtime/Internal/XCSettings.cs index 57a32e38..3b7dec92 100644 --- a/Runtime/Internal/XCSettings.cs +++ b/Runtime/Internal/XCSettings.cs @@ -153,6 +153,7 @@ namespace XCharts public static bool AddCustomTheme(Theme theme) { if (theme == null) return false; + if (Instance == null || Instance.m_CustomThemes == null) return false; if (!Instance.m_CustomThemes.Contains(theme)) { Instance.m_CustomThemes.Add(theme); diff --git a/Runtime/Serie/Bar/Bar.cs b/Runtime/Serie/Bar/Bar.cs index c9d6c317..e43fb76b 100644 --- a/Runtime/Serie/Bar/Bar.cs +++ b/Runtime/Serie/Bar/Bar.cs @@ -14,7 +14,7 @@ namespace XCharts typeof(LabelStyle), typeof(IconStyle), typeof(Emphasis))] - public class Bar : Serie, INeedSerieContainer, ISimplifiedSerie + public class Bar : Serie, INeedSerieContainer { public int containerIndex { get; internal set; } public int containterInstanceId { get; internal set; } diff --git a/Runtime/Serie/Bar/BarHandler.cs b/Runtime/Serie/Bar/BarHandler.cs index 6697d4b7..390d18dd 100644 --- a/Runtime/Serie/Bar/BarHandler.cs +++ b/Runtime/Serie/Bar/BarHandler.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; -using System.Text; using UnityEngine; using UnityEngine.UI; using XUGL; @@ -32,6 +31,21 @@ namespace XCharts DrawBarSerie(vh, serie, serie.context.colorIndex); } + public override Vector3 GetSerieDataLabelPosition(SerieData serieData, LabelStyle label) + { + switch (label.position) + { + case LabelStyle.Position.Bottom: + var center = serieData.context.rect.center; + return new Vector3(center.x, center.y - serieData.context.rect.height / 2); + case LabelStyle.Position.Center: + case LabelStyle.Position.Inside: + return serieData.context.rect.center; + default: + return serieData.context.position; + } + } + private void UpdateSerieContext() { if (m_SerieGrid == null) @@ -129,7 +143,6 @@ namespace XCharts return; if (m_SerieGrid == null) return; - var dataZoom = chart.GetDataZoomOfAxis(axis); var showData = serie.GetDataList(dataZoom); @@ -137,6 +150,7 @@ namespace XCharts return; var axisLength = isY ? m_SerieGrid.context.height : m_SerieGrid.context.width; + var relativedAxisLength = isY ? m_SerieGrid.context.width : m_SerieGrid.context.height; var axisXY = isY ? m_SerieGrid.context.y : m_SerieGrid.context.x; var isStack = SeriesHelper.IsStack(chart.series, serie.stack); @@ -200,7 +214,7 @@ namespace XCharts if (isPercentStack) { var valueTotal = chart.GetSerieSameStackTotalValue(serie.stack, i); - barHig = valueTotal != 0 ? (float)(relativedValue / valueTotal * axisLength) : 0; + barHig = valueTotal != 0 ? (float)(relativedValue / valueTotal * relativedAxisLength) : 0; } else { @@ -208,7 +222,6 @@ namespace XCharts } float currHig = AnimationStyleHelper.CheckDataAnimation(chart, serie, i, barHig); - Vector3 plb, plt, prt, prb, top; UpdateRectPosition(m_SerieGrid, isY, relativedValue, pX, pY, space, borderWidth, barWidth, currHig, out plb, out plt, out prt, out prb, out top); @@ -216,25 +229,24 @@ namespace XCharts serieData.context.position = top; serieData.context.rect = Rect.MinMaxRect(plb.x, plb.y, prb.x, prt.y); serie.context.dataPoints.Add(top); - if (serie.show && currHig != 0) + if (serie.show && currHig != 0 && !serie.placeHolder) { switch (serie.barType) { case BarType.Normal: DrawNormalBar(vh, serie, serieData, itemStyle, colorIndex, highlight, space, barWidth, - pX, pY, plb, plt, prt, prb, false, m_SerieGrid, areaColor, areaToColor); + pX, pY, plb, plt, prt, prb, isY, m_SerieGrid, axis, areaColor, areaToColor); break; case BarType.Zebra: DrawZebraBar(vh, serie, serieData, itemStyle, colorIndex, highlight, space, barWidth, - pX, pY, plb, plt, prt, prb, false, m_SerieGrid, areaColor, areaToColor); + pX, pY, plb, plt, prt, prb, isY, m_SerieGrid, axis, areaColor, areaToColor); break; case BarType.Capsule: DrawCapsuleBar(vh, serie, serieData, itemStyle, colorIndex, highlight, space, barWidth, - pX, pY, plb, plt, prt, prb, false, m_SerieGrid, areaColor, areaToColor); + pX, pY, plb, plt, prt, prb, isY, m_SerieGrid, axis, areaColor, areaToColor); break; } } - if (serie.animation.CheckDetailBreak(top, isY)) { break; @@ -265,7 +277,7 @@ namespace XCharts if (axis.context.minMaxRange <= 0) pY = grid.context.y; else pY = grid.context.y + (float)((value - axis.context.minValue) / axis.context.minMaxRange) * (grid.context.height - barWidth); } - pX = AxisHelper.GetAxisPosition(grid, relativedAxis, categoryWidth, 0); + pX = AxisHelper.GetAxisValuePosition(grid, relativedAxis, categoryWidth, 0); if (isStack) { for (int n = 0; n < m_StackSerieData.Count - 1; n++) @@ -283,7 +295,7 @@ namespace XCharts if (axis.context.minMaxRange <= 0) pX = grid.context.x; else pX = grid.context.x + (float)((value - axis.context.minValue) / axis.context.minMaxRange) * (grid.context.width - barWidth); } - pY = AxisHelper.GetAxisPosition(grid, relativedAxis, categoryWidth, 0); + pY = AxisHelper.GetAxisValuePosition(grid, relativedAxis, categoryWidth, 0); if (isStack) { for (int n = 0; n < m_StackSerieData.Count - 1; n++) @@ -319,8 +331,8 @@ namespace XCharts if (yValue < 0) { plb = new Vector3(pX + space + borderWidth, pY - borderWidth); - plt = new Vector3(pX + space + borderWidth, pY + currHig + borderWidth); - prt = new Vector3(pX + space + barWidth - borderWidth, pY + currHig + borderWidth); + plt = new Vector3(pX + space + borderWidth, pY + currHig - borderWidth); + prt = new Vector3(pX + space + barWidth - borderWidth, pY + currHig - borderWidth); prb = new Vector3(pX + space + barWidth - borderWidth, pY - borderWidth); } else @@ -344,10 +356,9 @@ namespace XCharts private void DrawNormalBar(VertexHelper vh, Serie serie, SerieData serieData, ItemStyle itemStyle, int colorIndex, bool highlight, float space, float barWidth, float pX, float pY, Vector3 plb, Vector3 plt, Vector3 prt, - Vector3 prb, bool isYAxis, GridCoord grid, Color32 areaColor, Color32 areaToColor) + Vector3 prb, bool isYAxis, GridCoord grid, Axis axis, Color32 areaColor, Color32 areaToColor) { - - DrawBarBackground(vh, serie, serieData, itemStyle, colorIndex, highlight, pX, pY, space, barWidth, isYAxis, grid); + DrawBarBackground(vh, serie, serieData, itemStyle, colorIndex, highlight, pX, pY, space, barWidth, isYAxis, grid, axis); var borderWidth = itemStyle.runtimeBorderWidth; if (isYAxis) { @@ -410,9 +421,9 @@ namespace XCharts private void DrawZebraBar(VertexHelper vh, Serie serie, SerieData serieData, ItemStyle itemStyle, int colorIndex, bool highlight, float space, float barWidth, float pX, float pY, Vector3 plb, Vector3 plt, Vector3 prt, - Vector3 prb, bool isYAxis, GridCoord grid, Color32 barColor, Color32 barToColor) + Vector3 prb, bool isYAxis, GridCoord grid, Axis axis, Color32 barColor, Color32 barToColor) { - DrawBarBackground(vh, serie, serieData, itemStyle, colorIndex, highlight, pX, pY, space, barWidth, isYAxis, grid); + DrawBarBackground(vh, serie, serieData, itemStyle, colorIndex, highlight, pX, pY, space, barWidth, isYAxis, grid, axis); if (isYAxis) { plt = (plb + plt) / 2; @@ -431,9 +442,9 @@ namespace XCharts private void DrawCapsuleBar(VertexHelper vh, Serie serie, SerieData serieData, ItemStyle itemStyle, int colorIndex, bool highlight, float space, float barWidth, float pX, float pY, Vector3 plb, Vector3 plt, Vector3 prt, - Vector3 prb, bool isYAxis, GridCoord grid, Color32 areaColor, Color32 areaToColor) + Vector3 prb, bool isYAxis, GridCoord grid, Axis axis, Color32 areaColor, Color32 areaToColor) { - DrawBarBackground(vh, serie, serieData, itemStyle, colorIndex, highlight, pX, pY, space, barWidth, isYAxis, grid); + DrawBarBackground(vh, serie, serieData, itemStyle, colorIndex, highlight, pX, pY, space, barWidth, isYAxis, grid, axis); var borderWidth = itemStyle.runtimeBorderWidth; var radius = barWidth / 2 - borderWidth; var isGradient = !ChartHelper.IsValueEqualsColor(areaColor, areaToColor); @@ -548,13 +559,13 @@ namespace XCharts } private void DrawBarBackground(VertexHelper vh, Serie serie, SerieData serieData, ItemStyle itemStyle, - int colorIndex, bool highlight, float pX, float pY, float space, float barWidth, bool isYAxis, GridCoord grid) + int colorIndex, bool highlight, float pX, float pY, float space, float barWidth, bool isYAxis, + GridCoord grid, Axis axis) { var color = SerieHelper.GetItemBackgroundColor(serie, serieData, chart.theme, colorIndex, highlight, false); if (ChartHelper.IsClearColor(color)) return; if (isYAxis) { - var axis = chart.GetChartComponent(serie.yAxisIndex); var axisWidth = axis.axisLine.GetWidth(chart.theme.axis.lineWidth); Vector3 plt = new Vector3(grid.context.x + axisWidth, pY + space + barWidth); Vector3 prt = new Vector3(grid.context.x + axisWidth + grid.context.width, pY + space + barWidth); @@ -595,7 +606,6 @@ namespace XCharts } else { - var axis = chart.GetChartComponent(serie.xAxisIndex); var axisWidth = axis.axisLine.GetWidth(chart.theme.axis.lineWidth); Vector3 plb = new Vector3(pX + space, grid.context.y + axisWidth); Vector3 plt = new Vector3(pX + space, grid.context.y + grid.context.height + axisWidth); diff --git a/Runtime/Serie/Bar/SimplifiedBarHandler.cs b/Runtime/Serie/Bar/SimplifiedBarHandler.cs index 25b0328d..2bd9f194 100644 --- a/Runtime/Serie/Bar/SimplifiedBarHandler.cs +++ b/Runtime/Serie/Bar/SimplifiedBarHandler.cs @@ -190,7 +190,7 @@ namespace XCharts var pY = 0f; UpdateXYPosition(m_SerieGrid, isY, axis, relativedAxis, i, categoryWidth, barWidth, value, ref pX, ref pY); - var barHig = AxisHelper.GetAxisValueLength(m_SerieGrid, relativedAxis, categoryWidth, relativedValue); + var barHig = AxisHelper.GetAxisValueDistance(m_SerieGrid, relativedAxis, categoryWidth, relativedValue); var currHig = AnimationStyleHelper.CheckDataAnimation(chart, serie, i, barHig); Vector3 plb, plt, prt, prb, top; @@ -233,7 +233,7 @@ namespace XCharts if (axis.context.minMaxRange <= 0) pY = grid.context.y; else pY = grid.context.y + (float)((value - axis.context.minValue) / axis.context.minMaxRange) * (grid.context.height - barWidth); } - pX = AxisHelper.GetAxisPosition(grid, relativedAxis, categoryWidth, 0); + pX = AxisHelper.GetAxisValuePosition(grid, relativedAxis, categoryWidth, 0); } else { @@ -246,7 +246,7 @@ namespace XCharts if (axis.context.minMaxRange <= 0) pX = grid.context.x; else pX = grid.context.x + (float)((value - axis.context.minValue) / axis.context.minMaxRange) * (grid.context.width - barWidth); } - pY = AxisHelper.GetAxisPosition(grid, relativedAxis, categoryWidth, 0); + pY = AxisHelper.GetAxisValuePosition(grid, relativedAxis, categoryWidth, 0); } } diff --git a/Runtime/Serie/InteractData.cs b/Runtime/Serie/InteractData.cs index 161fd6aa..938744e5 100644 --- a/Runtime/Serie/InteractData.cs +++ b/Runtime/Serie/InteractData.cs @@ -74,7 +74,7 @@ namespace XCharts public bool TryGetValue(ref float value, ref bool interacting, float animationDuration = 250) { - if (!m_ValueEnable || m_PreviousValue == 0) + if (!IsValueEnable() || m_PreviousValue == 0) return false; if (m_UpdateFlag) { @@ -99,7 +99,7 @@ namespace XCharts public bool TryGetColor(ref Color32 color, ref bool interacting, float animationDuration = 250) { - if (!m_ValueEnable) + if (!IsValueEnable()) return false; if (m_UpdateFlag) { @@ -124,7 +124,7 @@ namespace XCharts public bool TryGetColor(ref Color32 color, ref Color32 toColor, ref bool interacting, float animationDuration = 250) { - if (!m_ValueEnable) + if (!IsValueEnable()) return false; if (m_UpdateFlag) { @@ -150,7 +150,7 @@ namespace XCharts } public bool TryGetValueAndColor(ref float value, ref Color32 color, ref Color32 toColor, ref bool interacting, float animationDuration = 250) { - if (!m_ValueEnable) + if (!IsValueEnable()) return false; if (m_UpdateFlag) { @@ -181,5 +181,14 @@ namespace XCharts { m_ValueEnable = false; } + + private bool IsValueEnable() + { +#if UNITY_EDITOR + if (!Application.isPlaying) + return false; +#endif + return m_ValueEnable; + } } } \ No newline at end of file diff --git a/Runtime/Serie/Line/LineHandler.GridCoord.cs b/Runtime/Serie/Line/LineHandler.GridCoord.cs index e9ad4e15..afebe5cc 100644 --- a/Runtime/Serie/Line/LineHandler.GridCoord.cs +++ b/Runtime/Serie/Line/LineHandler.GridCoord.cs @@ -231,7 +231,6 @@ namespace XCharts var symbolEmptyColor = SerieHelper.GetItemBackgroundColor(serie, serieData, theme, serie.index, highlight, false); var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, theme, highlight); var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, highlight); - chart.DrawClipSymbol(vh, symbol.type, symbolSize, symbolBorder, pos, symbolColor, symbolToColor, symbolEmptyColor, symbol.gap, clip, cornerRadius, m_SerieGrid, i > 0 ? serie.context.dataPoints[i - 1] : m_SerieGrid.context.position); @@ -410,14 +409,14 @@ namespace XCharts { float xPos, yPos; var gridXY = isY ? grid.context.x : grid.context.y; - + var valueHig = 0f; if (isY) { - var valueHig = AxisHelper.GetAxisValueLength(grid, relativedAxis, scaleWid, yValue); + valueHig = AxisHelper.GetAxisValueDistance(grid, relativedAxis, scaleWid, yValue); valueHig = AnimationStyleHelper.CheckDataAnimation(chart, serie, i, valueHig); xPos = gridXY + valueHig; - yPos = AxisHelper.GetAxisPosition(grid, axis, scaleWid, xValue); + yPos = AxisHelper.GetAxisValuePosition(grid, axis, scaleWid, xValue); if (isStack) { @@ -428,11 +427,11 @@ namespace XCharts else { - var valueHig = AxisHelper.GetAxisValueLength(grid, relativedAxis, scaleWid, yValue); + valueHig = AxisHelper.GetAxisValueDistance(grid, relativedAxis, scaleWid, yValue); valueHig = AnimationStyleHelper.CheckDataAnimation(chart, serie, i, valueHig); yPos = gridXY + valueHig; - xPos = AxisHelper.GetAxisPosition(grid, axis, scaleWid, xValue); + xPos = AxisHelper.GetAxisValuePosition(grid, axis, scaleWid, xValue); if (isStack) { @@ -441,7 +440,7 @@ namespace XCharts } } np = new Vector3(xPos, yPos); - return yPos; + return valueHig; } } } \ No newline at end of file diff --git a/Runtime/Serie/Line/SimplifiedLineHandler.cs b/Runtime/Serie/Line/SimplifiedLineHandler.cs index f391e7eb..a33b0625 100644 --- a/Runtime/Serie/Line/SimplifiedLineHandler.cs +++ b/Runtime/Serie/Line/SimplifiedLineHandler.cs @@ -259,20 +259,20 @@ namespace XCharts if (isY) { - var valueHig = AxisHelper.GetAxisValueLength(grid, relativedAxis, scaleWid, yValue); + var valueHig = AxisHelper.GetAxisValueDistance(grid, relativedAxis, scaleWid, yValue); valueHig = AnimationStyleHelper.CheckDataAnimation(chart, serie, i, valueHig); xPos = gridXY + valueHig; - yPos = AxisHelper.GetAxisPosition(grid, axis, scaleWid, xValue); + yPos = AxisHelper.GetAxisValuePosition(grid, axis, scaleWid, xValue); } else { - var valueHig = AxisHelper.GetAxisValueLength(grid, relativedAxis, scaleWid, yValue); + var valueHig = AxisHelper.GetAxisValueDistance(grid, relativedAxis, scaleWid, yValue); valueHig = AnimationStyleHelper.CheckDataAnimation(chart, serie, i, valueHig); yPos = gridXY + valueHig; - xPos = AxisHelper.GetAxisPosition(grid, axis, scaleWid, xValue); + xPos = AxisHelper.GetAxisValuePosition(grid, axis, scaleWid, xValue); } np = new Vector3(xPos, yPos); return yPos; diff --git a/Runtime/Serie/Serie.cs b/Runtime/Serie/Serie.cs index 8a6271f7..1dc86160 100644 --- a/Runtime/Serie/Serie.cs +++ b/Runtime/Serie/Serie.cs @@ -220,6 +220,7 @@ namespace XCharts [SerializeField] private int m_LargeThreshold = 200; [SerializeField] private bool m_AvoidLabelOverlap = false; [SerializeField] private RadarType m_RadarType = RadarType.Multiple; + [SerializeField] private bool m_PlaceHolder = false; [SerializeField] private SerieDataSortType m_DataSortType = SerieDataSortType.Descending; [SerializeField] private Orient m_Orient = Orient.Vertical; @@ -231,16 +232,10 @@ namespace XCharts [SerializeField] private bool m_InsertDataToHead; [SerializeField] private LineStyle m_LineStyle = new LineStyle(); - //[SerializeField] private AreaStyle m_AreaStyle = AreaStyle.defaultAreaStyle; [SerializeField] private SymbolStyle m_Symbol = new SymbolStyle(); - //[SerializeField] private LabelStyle m_Label = new LabelStyle(); - //[SerializeField] private LabelLine m_LabelLine = new LabelLine(); [SerializeField] private AnimationStyle m_Animation = new AnimationStyle(); - //[SerializeField] private LineArrow m_LineArrow = new LineArrow(); [SerializeField] private ItemStyle m_ItemStyle = new ItemStyle(); - //[SerializeField] private Emphasis m_Emphasis = new Emphasis(); [SerializeField] private TitleStyle m_TitleStyle = new TitleStyle(); - //[SerializeField] private IconStyle m_IconStyle = new IconStyle(); [SerializeField] private List m_Data = new List(); [NonSerialized] internal int m_FilterStart; @@ -861,6 +856,14 @@ namespace XCharts set { if (PropertyUtil.SetStruct(ref m_Align, value)) SetVerticesDirty(); } } /// + /// 占位模式。占位模式时,数据有效但不参与渲染和显示。 + /// + public bool placeHolder + { + get { return m_PlaceHolder; } + set { if (PropertyUtil.SetStruct(ref m_PlaceHolder, value)) SetAllDirty(); } + } + /// /// 系列中的数据内容数组。SerieData可以设置1到n维数据。 /// public List data { get { return m_Data; } } diff --git a/Runtime/Serie/SerieHandler.cs b/Runtime/Serie/SerieHandler.cs index 0ff15c5f..0f0bfc7d 100644 --- a/Runtime/Serie/SerieHandler.cs +++ b/Runtime/Serie/SerieHandler.cs @@ -30,7 +30,9 @@ namespace XCharts public virtual void OnScroll(PointerEventData eventData) { } public virtual void RefreshLabelNextFrame() { } public virtual void RefreshLabelInternal() { } - public virtual void UpdateTooltipSerieParams(int dataIndex, bool showCategory, string category, string marker, string itemFormatter, string numericFormatter, ref List paramList, ref string title) { } + public virtual void UpdateTooltipSerieParams(int dataIndex, bool showCategory, string category, string marker, + string itemFormatter, string numericFormatter, ref List paramList, ref string title) + { } public virtual void OnLegendButtonClick(int index, string legendName, bool show) { } public virtual void OnLegendButtonEnter(int index, string legendName) { } public virtual void OnLegendButtonExit(int index, string legendName) { } @@ -43,6 +45,7 @@ namespace XCharts private static readonly string s_SerieTitleObjectName = "serie"; protected GameObject m_SerieRoot; protected bool m_InitedLabel; + protected bool m_NeedInitComponent; protected bool m_RefreshLabel; protected bool m_LastCheckContextFlag = false; protected bool m_LegendEnter = false; @@ -54,9 +57,15 @@ namespace XCharts { this.serie = (T)serie; this.serie.context.param.serieType = typeof(T); + m_NeedInitComponent = true; } public override void Update() { + if (m_NeedInitComponent) + { + m_NeedInitComponent = false; + InitComponent(); + } if (m_RefreshLabel) { m_RefreshLabel = false; @@ -99,6 +108,7 @@ namespace XCharts public override void InitComponent() { + m_InitedLabel = false; InitRoot(); InitSerieLabel(); InitSerieTitle(); @@ -138,7 +148,7 @@ namespace XCharts private void InitRoot() { - m_InitedLabel = false; + if (m_SerieRoot != null) return; var objName = s_SerieTitleObjectName + "_" + serie.index; m_SerieRoot = ChartHelper.AddObject(objName, chart.transform, chart.chartMinAnchor, chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta); @@ -151,8 +161,8 @@ namespace XCharts { if (m_SerieRoot == null) InitRoot(); - var serieLabelRoot = ChartHelper.AddObject(s_SerieLabelObjectName, m_SerieRoot.transform, chart.chartMinAnchor, - chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta); + var serieLabelRoot = ChartHelper.AddObject(s_SerieLabelObjectName, m_SerieRoot.transform, + chart.chartMinAnchor, chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta); serieLabelRoot.hideFlags = chart.chartHideFlags; SerieLabelPool.ReleaseAll(serieLabelRoot.transform); int count = 0; @@ -218,7 +228,9 @@ namespace XCharts if (m_SerieRoot == null) InitRoot(); var textStyle = serie.titleStyle.textStyle; - var titleColor = ChartHelper.IsClearColor(textStyle.color) ? chart.theme.GetColor(serie.index) : (Color32)textStyle.color; + var titleColor = ChartHelper.IsClearColor(textStyle.color) + ? chart.theme.GetColor(serie.index) + : (Color32)textStyle.color; var anchorMin = new Vector2(0.5f, 0.5f); var anchorMax = new Vector2(0.5f, 0.5f); var pivot = new Vector2(0.5f, 0.5f); @@ -244,20 +256,19 @@ namespace XCharts { if (!m_InitedLabel) return; - var colorIndex = chart.GetLegendRealShowNameIndex(serie.legendName); var total = serie.yTotal; foreach (var serieData in serie.data) { if (serieData.labelObject == null) continue; - var serieLabel = SerieHelper.GetSerieLabel(serie, serieData); var iconStyle = SerieHelper.GetIconStyle(serie, serieData); var isIgnore = serie.IsIgnoreIndex(serieData.index); serieData.labelObject.SetPosition(serieData.context.position); serieData.labelObject.UpdateIcon(iconStyle); - if (serie.show && serieLabel != null && serieLabel.show && serieData.context.canShowLabel && !isIgnore) + if (serie.show && serieLabel != null + && serieLabel.show && serieData.context.canShowLabel && !isIgnore) { var value = serieData.GetData(1); var content = SerieLabelHelper.GetFormatterContent(serie, serieData, value, total, @@ -266,9 +277,11 @@ namespace XCharts && serie is Line && SerieHelper.IsDownPoint(serie, serieData.index) && (serie.areaStyle == null || !serie.areaStyle.show); + var labelPosition = GetSerieDataLabelPosition(serieData, serieLabel); SerieLabelHelper.ResetLabel(serieData.labelObject.label, serieLabel, chart.theme); serieData.SetLabelActive(!isIgnore); - serieData.labelObject.SetPosition(serieData.context.position + (invert ? -serieLabel.offset : serieLabel.offset)); + serieData.labelObject.SetPosition(labelPosition + + (invert ? -serieLabel.offset : serieLabel.offset)); serieData.labelObject.SetText(content); } else @@ -278,6 +291,11 @@ namespace XCharts } } + public virtual Vector3 GetSerieDataLabelPosition(SerieData serieData, LabelStyle label) + { + return serieData.context.position; + } + protected void UpdateCoordSerieParams(ref List paramList, ref string title, int dataIndex, bool showCategory, string category, string marker, string itemFormatter, string numericFormatter) @@ -292,6 +310,10 @@ namespace XCharts if (serieData == null) return; + itemFormatter = SerieHelper.GetItemFormatter(serie, serieData, itemFormatter); + if (TooltipHelper.IsIgnoreItemFormatter(itemFormatter)) + return; + var param = serie.context.param; param.serieName = serie.serieName; param.serieIndex = serie.index; @@ -302,7 +324,7 @@ namespace XCharts param.total = serie.yTotal; param.color = chart.GetLegendRealShowNameColor(serie.serieName); param.marker = SerieHelper.GetItemMarker(serie, serieData, marker); - param.itemFormatter = SerieHelper.GetItemFormatter(serie, serieData, itemFormatter); + param.itemFormatter = itemFormatter; param.numericFormatter = SerieHelper.GetNumericFormatter(serie, serieData, numericFormatter); param.columns.Clear(); @@ -327,6 +349,10 @@ namespace XCharts if (serieData == null) return; + itemFormatter = SerieHelper.GetItemFormatter(serie, serieData, itemFormatter); + if (TooltipHelper.IsIgnoreItemFormatter(itemFormatter)) + return; + var param = serie.context.param; param.serieName = serie.serieName; param.serieIndex = serie.index; @@ -337,7 +363,7 @@ namespace XCharts param.total = SerieHelper.GetMaxData(serie, dimension); param.color = chart.theme.GetColor(dataIndex); param.marker = SerieHelper.GetItemMarker(serie, serieData, marker); - param.itemFormatter = SerieHelper.GetItemFormatter(serie, serieData, itemFormatter); + param.itemFormatter = itemFormatter; param.numericFormatter = SerieHelper.GetNumericFormatter(serie, serieData, numericFormatter); ; param.columns.Clear(); diff --git a/Runtime/Theme/Theme.cs b/Runtime/Theme/Theme.cs index b55e5cee..56e1c94b 100644 --- a/Runtime/Theme/Theme.cs +++ b/Runtime/Theme/Theme.cs @@ -104,12 +104,6 @@ namespace XCharts set { m_TMPFont = value; - if(value) - { - m_TMPFontName = value.name; - m_TMPFontInstanceId = value.GetInstanceID(); - } - SetComponentDirty(); SyncTMPFontToSubComponent(); } } @@ -364,11 +358,7 @@ namespace XCharts subTitle.tmpFont = tmpFont; legend.tmpFont = tmpFont; axis.tmpFont = tmpFont; - radiusAxis.tmpFont = tmpFont; - angleAxis.tmpFont = tmpFont; - polar.tmpFont = tmpFont; gauge.tmpFont = tmpFont; - radar.tmpFont = tmpFont; tooltip.tmpFont = tmpFont; dataZoom.tmpFont = tmpFont; visualMap.tmpFont = tmpFont; diff --git a/Runtime/Theme/ThemeStyle.cs b/Runtime/Theme/ThemeStyle.cs index 56cfe8ef..e6032cbd 100644 --- a/Runtime/Theme/ThemeStyle.cs +++ b/Runtime/Theme/ThemeStyle.cs @@ -155,7 +155,7 @@ namespace XCharts public void CheckWarning(StringBuilder sb) { #if dUI_TextMeshPro - if (m_Profile.tmpFont == null) + if (sharedTheme.tmpFont == null) { sb.AppendFormat("warning:theme->tmpFont is null\n"); }