From 18ed060c6751bc5ce0056e6666bab78d2963c5c8 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Thu, 23 Dec 2021 13:23:18 +0800 Subject: [PATCH] 3.0 - interaction --- .../ChildComponents/ComponentThemeDrawer.cs | 3 +- Assets/XCharts/Resources/XCSettings.asset | 10 +- Assets/XCharts/Resources/XCTheme-Dark.asset | 5 +- .../XCharts/Resources/XCTheme-Default.asset | 5 +- .../Component/Radar/RadarCoordHandler.cs | 4 +- .../Component/Tooltip/TooltipHandler.cs | 5 + Assets/XCharts/Runtime/Helper/SerieHelper.cs | 19 +- Assets/XCharts/Runtime/Internal/BaseChart.cs | 2 +- .../Runtime/Internal/Basic/BaseSerie.cs | 1 + Assets/XCharts/Runtime/Internal/XCSettings.cs | 8 +- .../XCharts/Runtime/Serie/Bar/BarHandler.cs | 143 +++++++++--- Assets/XCharts/Runtime/Serie/InteractData.cs | 191 ++++++++++++++++ .../Runtime/Serie/InteractData.cs.meta | 11 + .../Serie/Line/LineHandler.GridCoord.cs | 216 ++++++++++++++---- .../XCharts/Runtime/Serie/Line/LineHelper.cs | 33 ++- .../XCharts/Runtime/Serie/Pie/PieHandler.cs | 89 +++++--- Assets/XCharts/Runtime/Serie/Radar/Radar.cs | 4 +- .../Runtime/Serie/Radar/RadarHandler.cs | 80 +++++-- .../Serie/Scatter/BaseScatterHandler.cs | 125 +++++----- Assets/XCharts/Runtime/Serie/SerieContext.cs | 5 +- Assets/XCharts/Runtime/Serie/SerieData.cs | 5 +- Assets/XCharts/Runtime/Serie/SerieHandler.cs | 4 +- Assets/XCharts/Runtime/Theme/SerieTheme.cs | 21 +- 23 files changed, 739 insertions(+), 250 deletions(-) create mode 100644 Assets/XCharts/Runtime/Serie/InteractData.cs create mode 100644 Assets/XCharts/Runtime/Serie/InteractData.cs.meta diff --git a/Assets/XCharts/Editor/ChildComponents/ComponentThemeDrawer.cs b/Assets/XCharts/Editor/ChildComponents/ComponentThemeDrawer.cs index 15264b71..f530f08d 100644 --- a/Assets/XCharts/Editor/ChildComponents/ComponentThemeDrawer.cs +++ b/Assets/XCharts/Editor/ChildComponents/ComponentThemeDrawer.cs @@ -175,9 +175,8 @@ namespace XCharts ++EditorGUI.indentLevel; PropertyField(prop, "m_LineWidth"); PropertyField(prop, "m_LineSymbolSize"); - PropertyField(prop, "m_LineSymbolSelectedSize"); PropertyField(prop, "m_ScatterSymbolSize"); - PropertyField(prop, "m_ScatterSymbolSelectedSize"); + PropertyField(prop, "m_SelectedRate"); PropertyField(prop, "m_PieTooltipExtraRadius"); PropertyField(prop, "m_PieSelectedOffset"); PropertyField(prop, "m_CandlestickColor"); diff --git a/Assets/XCharts/Resources/XCSettings.asset b/Assets/XCharts/Resources/XCSettings.asset index 030f4b39..00e4a7d1 100644 --- a/Assets/XCharts/Resources/XCSettings.asset +++ b/Assets/XCharts/Resources/XCSettings.asset @@ -33,8 +33,8 @@ MonoBehaviour: m_DataZoomDataLineWidth: 0.5 m_VisualMapBorderWidth: 0 m_SerieLineWidth: 1.8 - m_SerieLineSymbolSize: 4 - m_SerieLineSymbolSelectedSize: 8 + m_SerieLineSymbolSize: 5 + m_SerieLineSymbolSelectedSize: 7 m_SerieScatterSymbolSize: 20 m_SerieScatterSymbolSelectedSize: 30 m_SerieCandlestickBorderWidth: 1 @@ -48,8 +48,8 @@ MonoBehaviour: m_PieTooltipExtraRadius: 8 m_PieSelectedOffset: 8 m_CustomThemes: - - {fileID: 11400000, guid: 22c71b519a1e34731aee339407499441, type: 2} + - {fileID: 0} - {fileID: 11400000, guid: 289d2fc7f4ce24f73b9ed8ec52639f72, type: 2} - {fileID: 11400000, guid: e1dc23a10de1e4c5dbfbaf74c4dfd218, type: 2} - - {fileID: 11400000, guid: 675c10db67ba545eb8a55e10f9ed5668, type: 2} - - {fileID: 11400000, guid: 6e2f85adf3fea474b95fcc1f3341c4f6, type: 2} + - {fileID: 0} + - {fileID: 0} diff --git a/Assets/XCharts/Resources/XCTheme-Dark.asset b/Assets/XCharts/Resources/XCTheme-Dark.asset index a9ac1239..5dc1dd64 100644 --- a/Assets/XCharts/Resources/XCTheme-Dark.asset +++ b/Assets/XCharts/Resources/XCTheme-Dark.asset @@ -186,11 +186,10 @@ MonoBehaviour: m_TriangeLen: 20 m_Serie: m_LineWidth: 1.8 - m_LineSymbolSize: 4 - m_LineSymbolSelectedSize: 8 + m_LineSymbolSize: 5 m_ScatterSymbolSize: 20 - m_ScatterSymbolSelectedSize: 30 m_PieTooltipExtraRadius: 8 + m_SelectedRate: 1.3 m_PieSelectedOffset: 8 m_CandlestickColor: serializedVersion: 2 diff --git a/Assets/XCharts/Resources/XCTheme-Default.asset b/Assets/XCharts/Resources/XCTheme-Default.asset index 734e4343..d73c98e4 100644 --- a/Assets/XCharts/Resources/XCTheme-Default.asset +++ b/Assets/XCharts/Resources/XCTheme-Default.asset @@ -186,11 +186,10 @@ MonoBehaviour: m_TriangeLen: 20 m_Serie: m_LineWidth: 1.8 - m_LineSymbolSize: 4 - m_LineSymbolSelectedSize: 8 + m_LineSymbolSize: 5 m_ScatterSymbolSize: 20 - m_ScatterSymbolSelectedSize: 30 m_PieTooltipExtraRadius: 8 + m_SelectedRate: 1.3 m_PieSelectedOffset: 8 m_CandlestickColor: serializedVersion: 2 diff --git a/Assets/XCharts/Runtime/Component/Radar/RadarCoordHandler.cs b/Assets/XCharts/Runtime/Component/Radar/RadarCoordHandler.cs index 0f6cffdf..bf3dbba0 100644 --- a/Assets/XCharts/Runtime/Component/Radar/RadarCoordHandler.cs +++ b/Assets/XCharts/Runtime/Component/Radar/RadarCoordHandler.cs @@ -91,7 +91,7 @@ namespace XCharts Vector3 p = radar.context.center; Vector3 p1; float angle = 2 * Mathf.PI / indicatorNum; - var lineColor = radar.axisLine.GetColor(chart.theme.axis.lineColor); + var lineColor = radar.axisLine.GetColor(chart.theme.axis.splitLineColor); var lineWidth = radar.axisLine.GetWidth(chart.theme.axis.lineWidth); var lineType = radar.axisLine.GetType(chart.theme.axis.lineType); var splitLineColor = radar.splitLine.GetColor(chart.theme.axis.splitLineColor); @@ -132,7 +132,7 @@ namespace XCharts Vector3 p1, p2, p3, p4; Vector3 p = radar.context.center; float angle = 2 * Mathf.PI / indicatorNum; - var lineColor = radar.axisLine.GetColor(chart.theme.axis.lineColor); + var lineColor = radar.axisLine.GetColor(chart.theme.axis.splitLineColor); var lineWidth = radar.axisLine.GetWidth(chart.theme.axis.lineWidth); var lineType = radar.axisLine.GetType(chart.theme.axis.lineType); var splitLineColor = radar.splitLine.GetColor(chart.theme.axis.splitLineColor); diff --git a/Assets/XCharts/Runtime/Component/Tooltip/TooltipHandler.cs b/Assets/XCharts/Runtime/Component/Tooltip/TooltipHandler.cs index 64290f0e..1391339d 100644 --- a/Assets/XCharts/Runtime/Component/Tooltip/TooltipHandler.cs +++ b/Assets/XCharts/Runtime/Component/Tooltip/TooltipHandler.cs @@ -339,6 +339,7 @@ namespace XCharts string category = null; var showCategory = false; + var isTriggerByAxis = false; var dataIndex = -1; tooltip.context.data.param.Clear(); tooltip.context.pointer = chart.pointerPos; @@ -346,6 +347,7 @@ namespace XCharts { if (tooltip.trigger == Tooltip.Trigger.Axis) { + isTriggerByAxis = true; GetAxisCategory(m_PointerContainer.index, ref dataIndex, ref category); if (series.Count <= 1) { @@ -360,6 +362,9 @@ namespace XCharts for (int i = 0; i < series.Count; i++) { var serie = series[i]; + serie.context.isTriggerByAxis = isTriggerByAxis; + if (isTriggerByAxis) + serie.context.pointerItemDataIndex = dataIndex; serie.handler.UpdateTooltipSerieParams(dataIndex, showCategory, category, tooltip.marker, tooltip.itemFormatter, tooltip.numericFormatter, ref tooltip.context.data.param, diff --git a/Assets/XCharts/Runtime/Helper/SerieHelper.cs b/Assets/XCharts/Runtime/Helper/SerieHelper.cs index 9ee6774c..43af283b 100644 --- a/Assets/XCharts/Runtime/Helper/SerieHelper.cs +++ b/Assets/XCharts/Runtime/Helper/SerieHelper.cs @@ -433,6 +433,14 @@ namespace XCharts } } + public static LabelStyle GetSerieEmphasisLabel(Serie serie, SerieData serieData) + { + if (!serie.IsPerformanceMode() && serieData.emphasis != null && serieData.emphasis.show) + return serieData.emphasis.label; + else if (serie.emphasis.show) return serie.emphasis.label; + else return null; + } + public static LabelLine GetSerieLabelLine(Serie serie, SerieData serieData, bool highlight = false) { if (highlight) @@ -518,11 +526,18 @@ namespace XCharts return color; } - public static float GetSymbolBorder(Serie serie, SerieData serieData, ThemeStyle theme, bool highlight, bool useLineWidth = true) + public static float GetSymbolBorder(Serie serie, SerieData serieData, ThemeStyle theme, bool highlight) { var itemStyle = GetItemStyle(serie, serieData, highlight); if (itemStyle != null && itemStyle.borderWidth != 0) return itemStyle.borderWidth; - else return serie.lineStyle.GetWidth(theme.serie.lineWidth); + else return serie.lineStyle.GetWidth(theme.serie.lineWidth) * 2; + } + + public static float GetSymbolBorder(Serie serie, SerieData serieData, ThemeStyle theme, bool highlight, float defaultWidth) + { + var itemStyle = GetItemStyle(serie, serieData, highlight); + if (itemStyle != null && itemStyle.borderWidth != 0) return itemStyle.borderWidth; + else return defaultWidth; } public static float[] GetSymbolCornerRadius(Serie serie, SerieData serieData, bool highlight) diff --git a/Assets/XCharts/Runtime/Internal/BaseChart.cs b/Assets/XCharts/Runtime/Internal/BaseChart.cs index f27400c5..d4e8451d 100644 --- a/Assets/XCharts/Runtime/Internal/BaseChart.cs +++ b/Assets/XCharts/Runtime/Internal/BaseChart.cs @@ -574,7 +574,7 @@ namespace XCharts var serie = m_Series[i]; serie.context.colorIndex = GetLegendRealShowNameIndex(serie.legendName); serie.context.dataPoints.Clear(); - serie.context.dataIgnore.Clear(); + serie.context.dataIgnores.Clear(); AnimationStyleHelper.UpdateSerieAnimation(serie); if (m_OnCustomDrawSerieBeforeCallback != null) { diff --git a/Assets/XCharts/Runtime/Internal/Basic/BaseSerie.cs b/Assets/XCharts/Runtime/Internal/Basic/BaseSerie.cs index c33076ec..f753ff1d 100644 --- a/Assets/XCharts/Runtime/Internal/Basic/BaseSerie.cs +++ b/Assets/XCharts/Runtime/Internal/Basic/BaseSerie.cs @@ -27,6 +27,7 @@ namespace XCharts [NonSerialized] protected bool m_ComponentDirty; [NonSerialized] protected Painter m_Painter; [NonSerialized] public SerieContext context = new SerieContext(); + [NonSerialized] public InteractData interact = new InteractData(); internal SerieHandler handler { get; set; } diff --git a/Assets/XCharts/Runtime/Internal/XCSettings.cs b/Assets/XCharts/Runtime/Internal/XCSettings.cs index def4a35f..a802b94c 100644 --- a/Assets/XCharts/Runtime/Internal/XCSettings.cs +++ b/Assets/XCharts/Runtime/Internal/XCSettings.cs @@ -53,10 +53,9 @@ namespace XCharts [SerializeField] [Range(0, 20)] private float m_VisualMapBorderWidth = 0f; [SerializeField] [Range(0, 20)] private float m_SerieLineWidth = 1.8f; - [SerializeField] [Range(0, 200)] private float m_SerieLineSymbolSize = 4f; - [SerializeField] [Range(0, 200)] private float m_SerieLineSymbolSelectedSize = 8f; + [SerializeField] [Range(0, 200)] private float m_SerieLineSymbolSize = 5f; [SerializeField] [Range(0, 200)] private float m_SerieScatterSymbolSize = 20f; - [SerializeField] [Range(0, 200)] private float m_SerieScatterSymbolSelectedSize = 30f; + [SerializeField] [Range(0, 200)] private float m_SerieSelectedRate = 1.3f; [SerializeField] [Range(0, 10)] private float m_SerieCandlestickBorderWidth = 1f; [SerializeField] private bool m_EditorShowAllListData = false; @@ -103,9 +102,8 @@ namespace XCharts #region serie public static float serieLineWidth { get { return Instance.m_SerieLineWidth; } } public static float serieLineSymbolSize { get { return Instance.m_SerieLineSymbolSize; } } - public static float serieLineSymbolSelectedSize { get { return Instance.m_SerieLineSymbolSelectedSize; } } public static float serieScatterSymbolSize { get { return Instance.m_SerieScatterSymbolSize; } } - public static float serieScatterSymbolSelectedSize { get { return Instance.m_SerieScatterSymbolSelectedSize; } } + public static float serieSelectedRate { get { return Instance.m_SerieSelectedRate; } } public static float serieCandlestickBorderWidth { get { return Instance.m_SerieCandlestickBorderWidth; } } #endregion diff --git a/Assets/XCharts/Runtime/Serie/Bar/BarHandler.cs b/Assets/XCharts/Runtime/Serie/Bar/BarHandler.cs index 6e7f2baa..151463e2 100644 --- a/Assets/XCharts/Runtime/Serie/Bar/BarHandler.cs +++ b/Assets/XCharts/Runtime/Serie/Bar/BarHandler.cs @@ -17,6 +17,7 @@ namespace XCharts internal sealed class BarHandler : SerieHandler { List> m_StackSerieData = new List>(); + private GridCoord m_SerieGrid; public override void Update() { @@ -32,6 +33,26 @@ namespace XCharts marker, itemFormatter, numericFormatter); } + public override bool OnLegendButtonEnter(int index, string legendName) + { + if (chart.GetLegendRealShowNameIndex(serie.serieName) == index) + { + serie.context.isLegendEnter = true; + return true; + } + return false; + } + + public override bool OnLegendButtonExit(int index, string legendName) + { + if (chart.GetLegendRealShowNameIndex(serie.serieName) == index) + { + serie.context.isLegendEnter = false; + return true; + } + return false; + } + public override void DrawSerie(VertexHelper vh) { DrawBarSerie(vh, serie, serie.context.colorIndex); @@ -39,23 +60,71 @@ namespace XCharts private void UpdateSerieContext() { - if (!chart.isPointerInChart) return; - serie.context.pointerItemDataIndex = -1; - serie.context.pointerEnter = false; - foreach (var serieData in serie.data) + if (m_SerieGrid == null) + return; + + var needCheck = (chart.isPointerInChart && m_SerieGrid.IsPointerEnter()) || serie.context.isLegendEnter; + var needInteract = false; + if (!needCheck) { - if (serieData.context.rect.Contains(chart.pointerPos)) + if (m_LastCheckContextFlag != needCheck) { - serie.context.pointerItemDataIndex = serieData.index; - serie.context.pointerEnter = true; - serieData.context.highlight = true; - chart.RefreshTopPainter(); + m_LastCheckContextFlag = needCheck; + serie.context.pointerItemDataIndex = -1; + serie.context.pointerEnter = false; + foreach (var serieData in serie.data) + { + var barColor = SerieHelper.GetItemColor(serie, serieData, chart.theme, serie.context.colorIndex, false); + var barToColor = SerieHelper.GetItemToColor(serie, serieData, chart.theme, serie.context.colorIndex, false); + serieData.interact.SetColor(ref needInteract, barColor, barToColor); + } + if (needInteract) + { + chart.RefreshPainter(serie); + } } - else + return; + } + m_LastCheckContextFlag = needCheck; + if (serie.context.isLegendEnter) + { + serie.context.pointerEnter = true; + foreach (var serieData in serie.data) { - serieData.context.highlight = false; + var barColor = SerieHelper.GetItemColor(serie, serieData, chart.theme, serie.context.colorIndex, true); + var barToColor = SerieHelper.GetItemToColor(serie, serieData, chart.theme, serie.context.colorIndex, true); + serieData.interact.SetColor(ref needInteract, barColor, barToColor); } } + else + { + serie.context.pointerItemDataIndex = -1; + serie.context.pointerEnter = false; + foreach (var serieData in serie.data) + { + if (serieData.context.rect.Contains(chart.pointerPos)) + { + serie.context.pointerItemDataIndex = serieData.index; + serie.context.pointerEnter = true; + serieData.context.highlight = true; + + var barColor = SerieHelper.GetItemColor(serie, serieData, chart.theme, serie.context.colorIndex, true); + var barToColor = SerieHelper.GetItemToColor(serie, serieData, chart.theme, serie.context.colorIndex, true); + serieData.interact.SetColor(ref needInteract, barColor, barToColor); + } + else + { + serieData.context.highlight = false; + var barColor = SerieHelper.GetItemColor(serie, serieData, chart.theme, serie.context.colorIndex, false); + var barToColor = SerieHelper.GetItemToColor(serie, serieData, chart.theme, serie.context.colorIndex, false); + serieData.interact.SetColor(ref needInteract, barColor, barToColor); + } + } + } + if (needInteract) + { + chart.RefreshPainter(serie); + } } private void DrawBarSerie(VertexHelper vh, Bar serie, int colorIndex) @@ -67,7 +136,6 @@ namespace XCharts Axis axis; Axis relativedAxis; - GridCoord grid; if (isY) { @@ -79,13 +147,13 @@ namespace XCharts axis = chart.GetChartComponent(serie.xAxisIndex); relativedAxis = chart.GetChartComponent(serie.yAxisIndex); } - grid = chart.GetChartComponent(axis.gridIndex); + m_SerieGrid = chart.GetChartComponent(axis.gridIndex); if (axis == null) return; if (relativedAxis == null) return; - if (grid == null) + if (m_SerieGrid == null) return; var dataZoom = chart.GetDataZoomOfAxis(axis); @@ -94,8 +162,8 @@ namespace XCharts if (showData.Count <= 0) return; - var axisLength = isY ? grid.context.height : grid.context.width; - var axisXY = isY ? grid.context.y : grid.context.x; + var axisLength = isY ? m_SerieGrid.context.height : m_SerieGrid.context.width; + var axisXY = isY ? m_SerieGrid.context.y : m_SerieGrid.context.x; var isStack = SeriesHelper.IsStack(chart.series, serie.stack); if (isStack) @@ -117,8 +185,13 @@ namespace XCharts float dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); double yMinValue = relativedAxis.context.minValue; double yMaxValue = relativedAxis.context.maxValue; - serie.containerIndex = grid.index; - serie.containterInstanceId = grid.instanceId; + + var areaColor = ColorUtil.clearColor32; + var areaToColor = ColorUtil.clearColor32; + var interacting = false; + + serie.containerIndex = m_SerieGrid.index; + serie.containterInstanceId = m_SerieGrid.instanceId; serie.animation.InitProgress(axisXY, axisXY + axisLength); for (int i = serie.minShow; i < maxCount; i++) { @@ -138,9 +211,16 @@ namespace XCharts var relativedValue = serieData.GetCurrData(1, dataChangeDuration, relativedAxis.inverse, yMinValue, yMaxValue); var borderWidth = relativedValue == 0 ? 0 : itemStyle.runtimeBorderWidth; + if (!serieData.interact.TryGetColor(ref areaColor, ref areaToColor, ref interacting)) + { + areaColor = SerieHelper.GetItemColor(serie, serieData, chart.theme, colorIndex, highlight); + areaToColor = SerieHelper.GetItemToColor(serie, serieData, chart.theme, colorIndex, highlight); + serieData.interact.SetColor(ref interacting, areaColor, areaToColor); + } + var pX = 0f; var pY = 0f; - UpdateXYPosition(grid, isY, axis, relativedAxis, i, categoryWidth, barWidth, isStack, value, ref pX, ref pY); + UpdateXYPosition(m_SerieGrid, isY, axis, relativedAxis, i, categoryWidth, barWidth, isStack, value, ref pX, ref pY); var barHig = 0f; if (isPercentStack) @@ -150,13 +230,13 @@ namespace XCharts } else { - barHig = AxisHelper.GetAxisValueLength(grid, relativedAxis, categoryWidth, relativedValue); + barHig = AxisHelper.GetAxisValueLength(m_SerieGrid, relativedAxis, categoryWidth, relativedValue); } float currHig = AnimationStyleHelper.CheckDataAnimation(chart, serie, i, barHig); Vector3 plb, plt, prt, prb, top; - UpdateRectPosition(grid, isY, relativedValue, pX, pY, space, borderWidth, barWidth, currHig, + UpdateRectPosition(m_SerieGrid, isY, relativedValue, pX, pY, space, borderWidth, barWidth, currHig, out plb, out plt, out prt, out prb, out top); serieData.context.stackHeight = barHig; serieData.context.position = top; @@ -168,15 +248,15 @@ namespace XCharts { case BarType.Normal: DrawNormalBar(vh, serie, serieData, itemStyle, colorIndex, highlight, space, barWidth, - pX, pY, plb, plt, prt, prb, false, grid); + pX, pY, plb, plt, prt, prb, false, m_SerieGrid, areaColor, areaToColor); break; case BarType.Zebra: DrawZebraBar(vh, serie, serieData, itemStyle, colorIndex, highlight, space, barWidth, - pX, pY, plb, plt, prt, prb, false, grid); + pX, pY, plb, plt, prt, prb, false, m_SerieGrid, areaColor, areaToColor); break; case BarType.Capsule: DrawCapsuleBar(vh, serie, serieData, itemStyle, colorIndex, highlight, space, barWidth, - pX, pY, plb, plt, prt, prb, false, grid); + pX, pY, plb, plt, prt, prb, false, m_SerieGrid, areaColor, areaToColor); break; } } @@ -191,7 +271,7 @@ namespace XCharts serie.animation.CheckProgress(); chart.RefreshPainter(serie); } - if (dataChanging) + if (dataChanging || interacting) { chart.RefreshPainter(serie); } @@ -290,10 +370,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) + Vector3 prb, bool isYAxis, GridCoord grid, Color32 areaColor, Color32 areaToColor) { - var areaColor = SerieHelper.GetItemColor(serie, serieData, chart.theme, colorIndex, highlight); - var areaToColor = SerieHelper.GetItemToColor(serie, serieData, chart.theme, colorIndex, highlight); + DrawBarBackground(vh, serie, serieData, itemStyle, colorIndex, highlight, pX, pY, space, barWidth, isYAxis, grid); var borderWidth = itemStyle.runtimeBorderWidth; if (isYAxis) @@ -357,10 +436,8 @@ 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) + Vector3 prb, bool isYAxis, GridCoord grid, Color32 barColor, Color32 barToColor) { - var barColor = SerieHelper.GetItemColor(serie, serieData, chart.theme, colorIndex, highlight); - var barToColor = SerieHelper.GetItemToColor(serie, serieData, chart.theme, colorIndex, highlight); DrawBarBackground(vh, serie, serieData, itemStyle, colorIndex, highlight, pX, pY, space, barWidth, isYAxis, grid); if (isYAxis) { @@ -380,10 +457,8 @@ 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) + Vector3 prb, bool isYAxis, GridCoord grid, Color32 areaColor, Color32 areaToColor) { - var areaColor = SerieHelper.GetItemColor(serie, serieData, chart.theme, colorIndex, highlight); - var areaToColor = SerieHelper.GetItemToColor(serie, serieData, chart.theme, colorIndex, highlight); DrawBarBackground(vh, serie, serieData, itemStyle, colorIndex, highlight, pX, pY, space, barWidth, isYAxis, grid); var borderWidth = itemStyle.runtimeBorderWidth; var radius = barWidth / 2 - borderWidth; diff --git a/Assets/XCharts/Runtime/Serie/InteractData.cs b/Assets/XCharts/Runtime/Serie/InteractData.cs new file mode 100644 index 00000000..a40974ab --- /dev/null +++ b/Assets/XCharts/Runtime/Serie/InteractData.cs @@ -0,0 +1,191 @@ +/************************************************/ +/* */ +/* Copyright (c) 2018 - 2021 monitor1394 */ +/* https://github.com/monitor1394 */ +/* */ +/************************************************/ + +using UnityEngine; + +namespace XCharts +{ + public class InteractData + { + private float m_PreviousValue = 0; + private float m_TargetValue = 0; + private Color32 m_PreviousColor; + private Color32 m_TargetColor; + private Color32 m_PreviousToColor; + private Color32 m_TargetToColor; + private float m_UpdateTime = 0; + private bool m_UpdateFlag = false; + private bool m_ValueEnable = false; + + public void SetValue(ref bool needInteract, float size, bool highlight, float rate = 1.3f) + { + size = highlight ? size * rate : size; + SetValue(ref needInteract, size); + } + + public void SetValue(ref bool needInteract, float size) + { + if (m_TargetValue != size) + { + needInteract = true; + m_UpdateFlag = true; + m_ValueEnable = true; + m_UpdateTime = Time.time; + m_PreviousValue = m_TargetValue; + m_TargetValue = size; + } + } + + public void SetColor(ref bool needInteract, Color32 color) + { + if (!ChartHelper.IsValueEqualsColor(color, m_TargetColor)) + { + needInteract = true; + m_UpdateFlag = true; + m_ValueEnable = true; + m_UpdateTime = Time.time; + m_PreviousColor = m_TargetColor; + m_TargetColor = color; + } + } + public void SetColor(ref bool needInteract, Color32 color, Color32 toColor) + { + SetColor(ref needInteract, color); + if (!ChartHelper.IsValueEqualsColor(toColor, m_TargetToColor)) + { + needInteract = true; + m_UpdateFlag = true; + m_ValueEnable = true; + m_UpdateTime = Time.time; + m_PreviousToColor = m_TargetToColor; + m_TargetToColor = toColor; + } + } + + public void SetValueAndColor(ref bool needInteract, float value, Color32 color) + { + SetValue(ref needInteract, value); + SetColor(ref needInteract, color); + } + + public void SetValueAndColor(ref bool needInteract, float value, Color32 color, Color32 toColor) + { + SetValue(ref needInteract, value); + SetColor(ref needInteract, color, toColor); + } + + public bool TryGetValue(ref float value, ref bool interacting, float animationDuration = 250) + { + if (!m_ValueEnable || m_PreviousValue == 0) + return false; + if (m_UpdateFlag) + { + var time = Time.time - m_UpdateTime; + var total = animationDuration / 1000; + var rate = time / total; + if (rate > 1) rate = 1; + if (rate < 1) + { + interacting = true; + value = Mathf.Lerp(m_PreviousValue, m_TargetValue, rate); + return true; + } + else + { + m_UpdateFlag = false; + } + } + value = m_TargetValue; + return true; + } + + public bool TryGetColor(ref Color32 color, ref bool interacting, float animationDuration = 250) + { + if (!m_ValueEnable) + return false; + if (m_UpdateFlag) + { + var time = Time.time - m_UpdateTime; + var total = animationDuration / 1000; + var rate = time / total; + if (rate > 1) rate = 1; + if (rate < 1) + { + interacting = true; + color = Color32.Lerp(m_PreviousColor, m_TargetColor, rate); + return true; + } + else + { + m_UpdateFlag = false; + } + } + color = m_TargetColor; + return true; + } + + public bool TryGetColor(ref Color32 color, ref Color32 toColor, ref bool interacting, float animationDuration = 250) + { + if (!m_ValueEnable) + return false; + if (m_UpdateFlag) + { + var time = Time.time - m_UpdateTime; + var total = animationDuration / 1000; + var rate = time / total; + if (rate > 1) rate = 1; + if (rate < 1) + { + interacting = true; + color = Color32.Lerp(m_PreviousColor, m_TargetColor, rate); + toColor = Color32.Lerp(m_PreviousToColor, m_TargetToColor, rate); + return true; + } + else + { + m_UpdateFlag = false; + } + } + color = m_TargetColor; + toColor = m_TargetToColor; + return true; + } + public bool TryGetValueAndColor(ref float value, ref Color32 color, ref Color32 toColor, ref bool interacting, float animationDuration = 250) + { + if (!m_ValueEnable) + return false; + if (m_UpdateFlag) + { + var time = Time.time - m_UpdateTime; + var total = animationDuration / 1000; + var rate = time / total; + if (rate > 1) rate = 1; + if (rate < 1) + { + interacting = true; + value = Mathf.Lerp(m_PreviousValue, m_TargetValue, rate); + color = Color32.Lerp(m_PreviousColor, m_TargetColor, rate); + toColor = Color32.Lerp(m_PreviousToColor, m_TargetToColor, rate); + return true; + } + else + { + m_UpdateFlag = false; + } + } + value = m_TargetValue; + color = m_TargetColor; + toColor = m_TargetToColor; + return true; + } + + public void Reset() + { + m_ValueEnable = false; + } + } +} \ No newline at end of file diff --git a/Assets/XCharts/Runtime/Serie/InteractData.cs.meta b/Assets/XCharts/Runtime/Serie/InteractData.cs.meta new file mode 100644 index 00000000..86930fc1 --- /dev/null +++ b/Assets/XCharts/Runtime/Serie/InteractData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8ab01b44ab2454ef7ac2d71313c3d707 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XCharts/Runtime/Serie/Line/LineHandler.GridCoord.cs b/Assets/XCharts/Runtime/Serie/Line/LineHandler.GridCoord.cs index d0bb4b9e..9cb147bc 100644 --- a/Assets/XCharts/Runtime/Serie/Line/LineHandler.GridCoord.cs +++ b/Assets/XCharts/Runtime/Serie/Line/LineHandler.GridCoord.cs @@ -20,6 +20,7 @@ namespace XCharts internal sealed partial class LineHandler : SerieHandler { List> m_StackSerieData = new List>(); + private GridCoord m_SerieGrid; public override void Update() { @@ -66,34 +67,135 @@ namespace XCharts } } + public override bool OnLegendButtonEnter(int index, string legendName) + { + if (chart.GetLegendRealShowNameIndex(serie.serieName) == index) + { + serie.context.isLegendEnter = true; + return true; + } + return false; + } + + public override bool OnLegendButtonExit(int index, string legendName) + { + if (chart.GetLegendRealShowNameIndex(serie.serieName) == index) + { + serie.context.isLegendEnter = false; + return true; + } + return false; + } + private void UpdateSerieContext() { - if (!chart.isPointerInChart) + if (m_SerieGrid == null) return; - var themeSymbolSize = chart.theme.serie.lineSymbolSize; - - serie.context.pointerItemDataIndex = -1; - serie.context.pointerEnter = false; - - foreach (var serieData in serie.data) + var needCheck = (chart.isPointerInChart && m_SerieGrid.IsPointerEnter()) || serie.context.isLegendEnter; + var lineWidth = 0f; + if (!needCheck) { - var dist = Vector3.Distance(chart.pointerPos, serieData.context.position); - var symbol = SerieHelper.GetSerieSymbol(serie, serieData); - var symbolSize = symbol.GetSize(serieData.data, themeSymbolSize); + if (m_LastCheckContextFlag != needCheck) + { + var needAnimation1 = false; + lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth); + m_LastCheckContextFlag = needCheck; + serie.context.pointerItemDataIndex = -1; + serie.context.pointerEnter = false; + serie.interact.SetValue(ref needAnimation1, lineWidth, false); + foreach (var serieData in serie.data) + { + var symbol = SerieHelper.GetSerieSymbol(serie, serieData); + var symbolSize = symbol.GetSize(serieData.data, chart.theme.serie.lineSymbolSize); + serieData.context.highlight = false; + serieData.interact.SetValue(ref needAnimation1, symbolSize); + } + if (needAnimation1) + { + if (SeriesHelper.IsStack(chart.series)) + chart.RefreshTopPainter(); + else + chart.RefreshPainter(serie); + } + } + return; + } + m_LastCheckContextFlag = needCheck; + var themeSymbolSize = chart.theme.serie.lineSymbolSize; + var themeSymbolSelectedSize = chart.theme.serie.lineSymbolSelectedSize; + lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth); - if (dist <= symbolSize) + var needInteract = false; + if (serie.context.isLegendEnter) + { + serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate); + for (int i = 0; i < serie.dataCount; i++) { - serie.context.pointerItemDataIndex = serieData.index; - serie.context.pointerEnter = true; + var serieData = serie.data[i]; + var symbol = SerieHelper.GetSerieSymbol(serie, serieData); + var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize); + serieData.context.highlight = true; - chart.RefreshTopPainter(); + serieData.interact.SetValue(ref needInteract, symbolSelectedSize); } - else + } + else if (serie.context.isTriggerByAxis) + { + serie.context.pointerEnter = true; + serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate); + for (int i = 0; i < serie.dataCount; i++) { - serieData.context.highlight = false; + var serieData = serie.data[i]; + var symbol = SerieHelper.GetSerieSymbol(serie, serieData); + var symbolSize = symbol.GetSize(serieData.data, themeSymbolSize); + var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize); + + if (i == serie.context.pointerItemDataIndex) + { + serieData.context.highlight = true; + serieData.interact.SetValue(ref needInteract, symbolSelectedSize); + } + else + { + serieData.context.highlight = false; + serieData.interact.SetValue(ref needInteract, symbolSize); + } } } + else + { + serie.context.pointerItemDataIndex = -1; + serie.context.pointerEnter = false; + foreach (var serieData in serie.data) + { + var dist = Vector3.Distance(chart.pointerPos, serieData.context.position); + var symbol = SerieHelper.GetSerieSymbol(serie, serieData); + var symbolSize = symbol.GetSize(serieData.data, themeSymbolSize); + var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize); + + if (dist <= symbolSelectedSize) + { + serie.context.pointerItemDataIndex = serieData.index; + serie.context.pointerEnter = true; + serie.interact.SetValue(ref needInteract, lineWidth, true); + serieData.context.highlight = true; + serieData.interact.SetValue(ref needInteract, symbolSelectedSize); + } + else + { + serieData.context.highlight = false; + serieData.interact.SetValue(ref needInteract, symbolSize); + } + } + } + if (needInteract) + { + if (SeriesHelper.IsStack(chart.series)) + chart.RefreshTopPainter(); + else + chart.RefreshPainter(serie); + } } private void DrawLinePoint(VertexHelper vh, Serie serie) @@ -101,20 +203,15 @@ namespace XCharts if (!serie.show || serie.IsPerformanceMode()) return; + if (m_SerieGrid == null) + return; + var count = serie.context.dataPoints.Count; var clip = SeriesHelper.IsAnyClipSerie(chart.series); - XAxis xAxis; - YAxis yAxis; - GridCoord grid; - - if (!chart.TryGetChartComponent(out xAxis, serie.xAxisIndex)) - return; - if (!chart.TryGetChartComponent(out yAxis, serie.yAxisIndex)) - return; - if (!chart.TryGetChartComponent(out grid, xAxis.gridIndex)) - return; - var theme = chart.theme; + var interacting = false; + //var isY = ComponentHelper.IsAnyCategoryOfYAxis(chart.components); + for (int i = 0; i < count; i++) { var serieData = serie.GetSerieData(i); @@ -126,6 +223,11 @@ namespace XCharts if (!symbol.show || !symbol.ShowSymbol(i, count)) continue; + var pos = serie.context.dataPoints[i]; + // if (serie.animation.CheckDetailBreak(pos, isY)) + // { + // continue; + // } if (serie.lineArrow.show) { if (serie.lineArrow.position == LineArrow.Position.Start && i == 0) @@ -134,23 +236,37 @@ namespace XCharts continue; } - if (ChartHelper.IsIngore(serie.context.dataPoints[i])) + if (ChartHelper.IsIngore(pos)) continue; var highlight = serie.data[i].context.highlight || serie.highlight; var symbolSize = highlight - ? symbol.GetSelectedSize(serie.data[i].data, theme.serie.lineSymbolSelectedSize) - : symbol.GetSize(serie.data[i].data, theme.serie.lineSymbolSize); + ? theme.serie.lineSymbolSelectedSize + : theme.serie.lineSymbolSize; + if (!serieData.interact.TryGetValue(ref symbolSize, ref interacting)) + { + symbolSize = highlight + ? symbol.GetSelectedSize(serieData.data, symbolSize) + : symbol.GetSize(serieData.data, symbolSize); + serieData.interact.SetValue(ref interacting, symbolSize); + symbolSize = serie.animation.GetSysmbolSize(symbolSize); + } var symbolColor = SerieHelper.GetItemColor(serie, serieData, theme, serie.index, highlight); var symbolToColor = SerieHelper.GetItemToColor(serie, serieData, theme, serie.index, highlight); 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); - symbolSize = serie.animation.GetSysmbolSize(symbolSize); - chart.DrawClipSymbol(vh, symbol.type, symbolSize, symbolBorder, serie.context.dataPoints[i], - symbolColor, symbolToColor, symbolEmptyColor, symbol.gap, clip, cornerRadius, grid, - i > 0 ? serie.context.dataPoints[i - 1] : grid.context.position); + 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); + } + if (interacting) + { + if (SeriesHelper.IsStack(chart.series)) + chart.RefreshTopPainter(); + else + chart.RefreshPainter(serie); } } @@ -206,7 +322,6 @@ namespace XCharts Axis axis; Axis relativedAxis; - GridCoord grid; if (isY) { @@ -218,13 +333,13 @@ namespace XCharts axis = chart.GetChartComponent(serie.xAxisIndex); relativedAxis = chart.GetChartComponent(serie.yAxisIndex); } - grid = chart.GetChartComponent(axis.gridIndex); + m_SerieGrid = chart.GetChartComponent(axis.gridIndex); if (axis == null) return; if (relativedAxis == null) return; - if (grid == null) + if (m_SerieGrid == null) return; var visualMap = chart.GetVisualMapOfSerie(serie); @@ -234,22 +349,25 @@ namespace XCharts if (showData.Count <= 0) return; - var axisLength = isY ? grid.context.height : grid.context.width; + var axisLength = isY ? m_SerieGrid.context.height : m_SerieGrid.context.width; var scaleWid = AxisHelper.GetDataWidth(axis, axisLength, showData.Count, dataZoom); int maxCount = serie.maxShow > 0 ? (serie.maxShow > showData.Count ? showData.Count : serie.maxShow) : showData.Count; - int rate = LineHelper.GetDataAverageRate(serie, grid, maxCount, false); + int rate = LineHelper.GetDataAverageRate(serie, m_SerieGrid, maxCount, false); var totalAverage = serie.sampleAverage > 0 ? serie.sampleAverage : DataHelper.DataAverage(ref showData, serie.sampleType, serie.minShow, maxCount, rate); var dataChanging = false; var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); + var interacting = false; + var lineWidth = LineHelper.GetLineWidth(ref interacting, serie, chart.theme.serie.lineWidth); + axis.context.scaleWidth = scaleWid; - serie.containerIndex = grid.index; - serie.containterInstanceId = grid.instanceId; + serie.containerIndex = m_SerieGrid.index; + serie.containterInstanceId = m_SerieGrid.instanceId; Serie lastSerie = null; var isStack = SeriesHelper.IsStack(chart.series, serie.stack); @@ -267,9 +385,9 @@ namespace XCharts { serieData.context.stackHeight = 0; serieData.context.position = Vector3.zero; - if (serie.ignoreLineBreak && serie.context.dataIgnore.Count > 0) + if (serie.ignoreLineBreak && serie.context.dataIgnores.Count > 0) { - serie.context.dataIgnore[serie.context.dataIgnore.Count - 1] = true; + serie.context.dataIgnores[serie.context.dataIgnores.Count - 1] = true; } } else @@ -279,17 +397,17 @@ namespace XCharts var relativedValue = DataHelper.SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i, dataChangeDuration, ref dataChanging, relativedAxis); - serieData.context.stackHeight = GetDataPoint(isY, axis, relativedAxis, grid, xValue, relativedValue, + serieData.context.stackHeight = GetDataPoint(isY, axis, relativedAxis, m_SerieGrid, xValue, relativedValue, i, scaleWid, isStack, ref np); serieData.context.position = np; serie.context.dataPoints.Add(np); - serie.context.dataIgnore.Add(false); + serie.context.dataIgnores.Add(false); } } - if (dataChanging) + if (dataChanging || interacting) chart.RefreshPainter(serie); if (serie.context.dataPoints.Count <= 0) @@ -298,9 +416,9 @@ namespace XCharts serie.animation.InitProgress(serie.context.dataPoints, isY); VisualMapHelper.AutoSetLineMinMax(visualMap, serie, isY, axis, relativedAxis); - LineHelper.UpdateSerieDrawPoints(serie, chart.settings, chart.theme, isY); - LineHelper.DrawSerieLineArea(vh, serie, lastSerie, chart.theme, isY, axis, relativedAxis, grid); - LineHelper.DrawSerieLine(vh, chart.theme, serie, visualMap, grid, axis, relativedAxis); + LineHelper.UpdateSerieDrawPoints(serie, chart.settings, chart.theme, lineWidth, isY); + LineHelper.DrawSerieLineArea(vh, serie, lastSerie, chart.theme, isY, axis, relativedAxis, m_SerieGrid); + LineHelper.DrawSerieLine(vh, chart.theme, serie, visualMap, m_SerieGrid, axis, relativedAxis, lineWidth); serie.context.vertCount = vh.currentVertCount; diff --git a/Assets/XCharts/Runtime/Serie/Line/LineHelper.cs b/Assets/XCharts/Runtime/Serie/Line/LineHelper.cs index e504b364..3fbdd846 100644 --- a/Assets/XCharts/Runtime/Serie/Line/LineHelper.cs +++ b/Assets/XCharts/Runtime/Serie/Line/LineHelper.cs @@ -230,7 +230,7 @@ namespace XCharts } internal static void DrawSerieLine(VertexHelper vh, ThemeStyle theme, Serie serie, VisualMap visualMap, - GridCoord grid, Axis axis, Axis relativedAxis) + GridCoord grid, Axis axis, Axis relativedAxis, float lineWidth) { var datas = serie.context.drawPoints; @@ -252,9 +252,8 @@ namespace XCharts var isVisualMapGradient = VisualMapHelper.IsNeedGradient(visualMap); var isLineStyleGradient = serie.lineStyle.IsNeedGradient(); - var highlight = serie.highlight || serie.context.pointerEnter; - var lineWidth = serie.lineStyle.GetWidth(theme.serie.lineWidth); - var lineColor = SerieHelper.GetLineColor(serie, theme, serie.context.colorIndex, highlight); + //var highlight = serie.highlight || serie.context.pointerEnter; + var lineColor = SerieHelper.GetLineColor(serie, theme, serie.context.colorIndex, false); var lastDataIsIgnore = datas[0].isIgnoreBreak; for (int i = 1; i < dataCount; i++) @@ -316,6 +315,17 @@ namespace XCharts } } + public static float GetLineWidth(ref bool interacting, Serie serie, float defaultWidth) + { + var lineWidth = 0f; + if (!serie.interact.TryGetValue(ref lineWidth, ref interacting)) + { + lineWidth = serie.lineStyle.GetWidth(defaultWidth); + serie.interact.SetValue(ref interacting, lineWidth); + } + return lineWidth; + } + private static void AddLineVertToVertexHelper(VertexHelper vh, Vector3 tp, Vector3 bp, Color32 lineColor, bool visualMapGradient, bool lineStyleGradient, VisualMap visualMap, LineStyle lineStyle, GridCoord grid, Axis axis, Axis relativedAxis, bool needTriangle, @@ -346,7 +356,7 @@ namespace XCharts UGL.AddVertToVertexHelper(vh, tp, bp, ColorUtil.clearColor32, false); } - internal static void UpdateSerieDrawPoints(Serie serie, Settings setting, ThemeStyle theme, bool isY = false) + internal static void UpdateSerieDrawPoints(Serie serie, Settings setting, ThemeStyle theme, float lineWidth, bool isY = false) { serie.context.drawPoints.Clear(); @@ -359,12 +369,12 @@ namespace XCharts case LineType.StepStart: case LineType.StepMiddle: case LineType.StepEnd: - UpdateStepLineDrawPoints(serie, setting, theme, isY); + UpdateStepLineDrawPoints(serie, setting, theme, isY, lineWidth); break; default: for (int i = 0; i < serie.context.dataPoints.Count; i++) { - serie.context.drawPoints.Add(new PointInfo(serie.context.dataPoints[i], serie.context.dataIgnore[i])); + serie.context.drawPoints.Add(new PointInfo(serie.context.dataPoints[i], serie.context.dataIgnores[i])); } break; } @@ -380,7 +390,7 @@ namespace XCharts var ep = points[i + 1]; var lsp = i > 0 ? points[i - 1] : sp; var nep = i < points.Count - 2 ? points[i + 2] : ep; - var ignore = serie.context.dataIgnore[i]; + var ignore = serie.context.dataIgnores[i]; if (isY) UGLHelper.GetBezierListVertical(ref s_CurvesPosList, sp, ep, smoothness); else @@ -393,17 +403,16 @@ namespace XCharts } } - private static void UpdateStepLineDrawPoints(Serie serie, Settings setting, ThemeStyle theme, bool isY) + private static void UpdateStepLineDrawPoints(Serie serie, Settings setting, ThemeStyle theme, bool isY, float lineWidth) { var points = serie.context.dataPoints; var lp = points[0]; - var lineWidth = serie.lineStyle.GetWidth(theme.serie.lineWidth); serie.context.drawPoints.Clear(); - serie.context.drawPoints.Add(new PointInfo(lp, serie.context.dataIgnore[0])); + serie.context.drawPoints.Add(new PointInfo(lp, serie.context.dataIgnores[0])); for (int i = 1; i < points.Count; i++) { var cp = points[i]; - var ignore = serie.context.dataIgnore[i]; + var ignore = serie.context.dataIgnores[i]; if ((isY && Mathf.Abs(lp.x - cp.x) <= lineWidth) || (!isY && Mathf.Abs(lp.y - cp.y) <= lineWidth)) { diff --git a/Assets/XCharts/Runtime/Serie/Pie/PieHandler.cs b/Assets/XCharts/Runtime/Serie/Pie/PieHandler.cs index 24dc4a95..cd824328 100644 --- a/Assets/XCharts/Runtime/Serie/Pie/PieHandler.cs +++ b/Assets/XCharts/Runtime/Serie/Pie/PieHandler.cs @@ -33,7 +33,7 @@ namespace XCharts string marker, string itemFormatter, string numericFormatter, ref List paramList, ref string title) { - UpdateItemSerieParams(ref paramList, ref title, dataIndex, category, + UpdateItemSerieParams(ref paramList, ref title, dataIndex, category, marker, itemFormatter, numericFormatter); } @@ -113,37 +113,59 @@ namespace XCharts private void UpdateSerieContext() { - if (!chart.isPointerInChart) return; - var lastPointerEnter = serie.context.pointerEnter; - serie.context.pointerEnter = PointerIsInPieSerie(serie, chart.pointerPos); - if (serie.context.pointerEnter) + var needCheck = serie.context.isLegendEnter + || (chart.isPointerInChart && PointerIsInPieSerie(serie, chart.pointerPos)); + var needInteract = false; + if (!needCheck) { - var lastDataIndex = serie.context.pointerItemDataIndex; - var dataIndex = GetPiePosIndex(serie, chart.pointerPos); - if (dataIndex >= 0) + if (m_LastCheckContextFlag != needCheck) { - if (lastDataIndex >= 0) - serie.GetSerieData(lastDataIndex).context.highlight = false; - if (lastDataIndex != dataIndex) + m_LastCheckContextFlag = needCheck; + serie.context.pointerItemDataIndex = -1; + serie.context.pointerEnter = false; + foreach (var serieData in serie.data) + { + var colorIndex = chart.GetLegendRealShowNameIndex(serieData.legendName); + var color = SerieHelper.GetItemColor(serie, serieData, chart.theme, colorIndex, false); + var toColor = SerieHelper.GetItemToColor(serie, serieData, chart.theme, colorIndex, false); + serieData.interact.SetValueAndColor(ref needInteract, serieData.context.outsideRadius, color, toColor); + } + if (needInteract) + { chart.RefreshPainter(serie); - serie.GetSerieData(dataIndex).context.highlight = true; - serie.context.pointerItemDataIndex = dataIndex; + } + } + return; + } + m_LastCheckContextFlag = needCheck; + serie.context.pointerItemDataIndex = -1; + var dataIndex = GetPiePosIndex(serie, chart.pointerPos); + for (int i = 0; i < serie.dataCount; i++) + { + var serieData = serie.data[i]; + if (dataIndex == i || (serie.context.isLegendEnter && serie.context.legendEnterIndex == i)) + { + serie.context.pointerItemDataIndex = i; + serieData.context.highlight = true; + + var colorIndex = chart.GetLegendRealShowNameIndex(serieData.legendName); + var color = SerieHelper.GetItemColor(serie, serieData, chart.theme, colorIndex, true); + var toColor = SerieHelper.GetItemToColor(serie, serieData, chart.theme, colorIndex, true); + var value = serieData.context.outsideRadius + chart.theme.serie.pieTooltipExtraRadius; + serieData.interact.SetValueAndColor(ref needInteract, value, color, toColor); } else { - if (lastDataIndex >= 0) - serie.GetSerieData(lastDataIndex).context.highlight = false; - serie.context.pointerItemDataIndex = -1; + serieData.context.highlight = false; + var colorIndex = chart.GetLegendRealShowNameIndex(serieData.legendName); + var color = SerieHelper.GetItemColor(serie, serieData, chart.theme, colorIndex, false); + var toColor = SerieHelper.GetItemToColor(serie, serieData, chart.theme, colorIndex, false); + serieData.interact.SetValueAndColor(ref needInteract, serieData.context.outsideRadius, color, toColor); } } - else + if (needInteract) { - if (lastPointerEnter) - { - foreach (var serieData in serie.data) - serieData.context.highlight = false; - } - serie.context.pointerItemDataIndex = -1; + chart.RefreshPainter(serie); } } @@ -291,6 +313,9 @@ namespace XCharts return; } var dataChanging = false; + var interacting = false; + var color = ColorUtil.clearColor32; + var toColor = ColorUtil.clearColor32; var data = serie.data; serie.animation.InitProgress(0, 360); for (int n = 0; n < data.Count; n++) @@ -304,20 +329,22 @@ namespace XCharts dataChanging = true; var itemStyle = SerieHelper.GetItemStyle(serie, serieData, serieData.context.highlight); - var serieNameCount = chart.m_LegendRealShowName.IndexOf(serieData.legendName); - - var color = SerieHelper.GetItemColor(serie, serieData, chart.theme, serieNameCount, - serieData.context.highlight); - - var toColor = SerieHelper.GetItemToColor(serie, serieData, chart.theme, serieNameCount, - serieData.context.highlight); + var colorIndex = chart.GetLegendRealShowNameIndex(serieData.legendName); + var outsideRadius = 0f; var borderWidth = itemStyle.borderWidth; var borderColor = itemStyle.borderColor; var progress = AnimationStyleHelper.CheckDataAnimation(chart, serie, n, 1); var insideRadius = serieData.context.insideRadius * progress; - var outsideRadius = serieData.context.outsideRadius * progress; + + //if (!serieData.interact.TryGetValueAndColor(ref outsideRadius, ref color, ref toColor, ref interacting)) + { + color = SerieHelper.GetItemColor(serie, serieData, chart.theme, colorIndex, serieData.context.highlight); + toColor = SerieHelper.GetItemToColor(serie, serieData, chart.theme, colorIndex, serieData.context.highlight); + outsideRadius = serieData.context.outsideRadius * progress; + serieData.interact.SetValueAndColor(ref interacting, outsideRadius, color, toColor); + } if (serie.pieClickOffset && serieData.selected) { diff --git a/Assets/XCharts/Runtime/Serie/Radar/Radar.cs b/Assets/XCharts/Runtime/Serie/Radar/Radar.cs index 849618c5..1b155ca6 100644 --- a/Assets/XCharts/Runtime/Serie/Radar/Radar.cs +++ b/Assets/XCharts/Runtime/Serie/Radar/Radar.cs @@ -24,9 +24,7 @@ namespace XCharts chart.AddChartComponentWhenNoExist(); var serie = chart.AddSerie(serieName); serie.symbol.show = true; - serie.symbol.type = SymbolType.EmptyCircle; - serie.symbol.size = 4; - serie.symbol.selectedSize = 6; + serie.symbol.type = SymbolType.Circle; serie.showDataName = true; List data = new List(); for (int i = 0; i < 5; i++) diff --git a/Assets/XCharts/Runtime/Serie/Radar/RadarHandler.cs b/Assets/XCharts/Runtime/Serie/Radar/RadarHandler.cs index 24a3e54f..39188eb1 100644 --- a/Assets/XCharts/Runtime/Serie/Radar/RadarHandler.cs +++ b/Assets/XCharts/Runtime/Serie/Radar/RadarHandler.cs @@ -15,6 +15,7 @@ namespace XCharts [UnityEngine.Scripting.Preserve] internal sealed class RadarHandler : SerieHandler { + private RadarCoord m_RadarCoord; public override void Update() { base.Update(); @@ -160,12 +161,20 @@ namespace XCharts return true; } - - private void UpdateSerieContext() { - if (!chart.isPointerInChart) return; + var needCheck = serie.context.isLegendEnter || (chart.isPointerInChart && m_RadarCoord.IsPointerEnter()); + var needInteract = false; + var needHideAll = false; + if (!needCheck) + { + if (m_LastCheckContextFlag == needCheck) + return; + needHideAll = true; + } + m_LastCheckContextFlag = needCheck; serie.context.pointerEnter = false; + serie.context.pointerItemDataIndex = -1; switch (serie.radarType) { case RadarType.Multiple: @@ -173,14 +182,27 @@ namespace XCharts { var serieData = serie.data[i]; serieData.index = i; - foreach (var pos in serieData.context.dataPoints) + var symbol = SerieHelper.GetSerieSymbol(serie, serieData); + var symbolSize = symbol.GetSize(serieData.data, chart.theme.serie.lineSymbolSize); + if (needHideAll || serie.context.isLegendEnter) { - if (Vector3.Distance(chart.pointerPos, pos) < serie.symbol.size * 2) + serieData.context.highlight = needHideAll ? false : true; + serieData.interact.SetValue(ref needInteract, symbolSize, serieData.context.highlight); + } + else + { + serieData.context.highlight = false; + foreach (var pos in serieData.context.dataPoints) { - serie.context.pointerEnter = true; - serie.context.pointerItemDataIndex = i; - return; + if (Vector3.Distance(chart.pointerPos, pos) < symbolSize * 2) + { + serie.context.pointerEnter = true; + serie.context.pointerItemDataIndex = i; + serieData.context.highlight = true; + break; + } } + serieData.interact.SetValue(ref needInteract, symbolSize, serieData.context.highlight); } } break; @@ -198,23 +220,27 @@ namespace XCharts } break; } + if (needInteract) + { + chart.RefreshPainter(serie); + } } private void DrawMutipleRadar(VertexHelper vh) { if (!serie.show) return; - var radar = chart.GetChartComponent(serie.radarIndex); - if (radar == null) return; + m_RadarCoord = chart.GetChartComponent(serie.radarIndex); + if (m_RadarCoord == null) return; - serie.containerIndex = radar.index; - serie.containterInstanceId = radar.instanceId; + serie.containerIndex = m_RadarCoord.index; + serie.containterInstanceId = m_RadarCoord.instanceId; var startPoint = Vector3.zero; var toPoint = Vector3.zero; var firstPoint = Vector3.zero; - var indicatorNum = radar.indicatorList.Count; + var indicatorNum = m_RadarCoord.indicatorList.Count; var angle = 2 * Mathf.PI / indicatorNum; - var centerPos = radar.context.center; + var centerPos = m_RadarCoord.context.center; serie.animation.InitProgress(0, 1); if (!serie.show || serie.animation.HasFadeOut()) { @@ -222,8 +248,9 @@ namespace XCharts } var rate = serie.animation.GetCurrRate(); var dataChanging = false; + var interacting = false; var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); - SerieHelper.GetAllMinMaxData(serie, radar.ceilRate); + SerieHelper.GetAllMinMaxData(serie, m_RadarCoord.ceilRate); for (int j = 0; j < serie.data.Count; j++) { var serieData = serie.data[j]; @@ -232,26 +259,26 @@ namespace XCharts { continue; } - var isHighlight = serie.context.pointerEnter; + var isHighlight = serieData.context.highlight; var areaColor = SerieHelper.GetAreaColor(serie, chart.theme, j, isHighlight); var areaToColor = SerieHelper.GetAreaToColor(serie, chart.theme, j, isHighlight); var lineColor = SerieHelper.GetLineColor(serie, chart.theme, j, isHighlight); var lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth); - int dataCount = radar.indicatorList.Count; + int dataCount = m_RadarCoord.indicatorList.Count; serieData.context.dataPoints.Clear(); for (int n = 0; n < dataCount; n++) { if (n >= serieData.data.Count) break; - var max = radar.GetIndicatorMax(n); + var max = m_RadarCoord.GetIndicatorMax(n); var value = serieData.GetCurrData(n, dataChangeDuration); if (serieData.IsDataChanged()) dataChanging = true; if (max == 0) { max = serie.context.dataMax; } - var radius = (float)(max < 0 ? radar.context.dataRadius - radar.context.dataRadius * value / max - : radar.context.dataRadius * value / max); - var currAngle = (n + (radar.positionType == RadarCoord.PositionType.Between ? 0.5f : 0)) * angle; + var radius = (float)(max < 0 ? m_RadarCoord.context.dataRadius - m_RadarCoord.context.dataRadius * value / max + : m_RadarCoord.context.dataRadius * value / max); + var currAngle = (n + (m_RadarCoord.positionType == RadarCoord.PositionType.Between ? 0.5f : 0)) * angle; radius *= rate; if (n == 0) { @@ -288,10 +315,17 @@ namespace XCharts for (int m = 0; m < serieData.context.dataPoints.Count; m++) { var point = serieData.context.dataPoints[m]; - isHighlight = serie.context.pointerEnter; var symbolSize = isHighlight ? serie.symbol.GetSelectedSize(null, chart.theme.serie.lineSymbolSelectedSize) : serie.symbol.GetSize(null, chart.theme.serie.lineSymbolSize); + if (!serieData.interact.TryGetValue(ref symbolSize, ref interacting)) + { + symbolSize = isHighlight + ? serie.symbol.GetSelectedSize(serieData.data, symbolSize) + : serie.symbol.GetSize(serieData.data, symbolSize); + serieData.interact.SetValue(ref interacting, symbolSize); + symbolSize = serie.animation.GetSysmbolSize(symbolSize); + } var symbolColor = SerieHelper.GetItemColor(serie, serieData, chart.theme, j, isHighlight); var symbolToColor = SerieHelper.GetItemToColor(serie, serieData, chart.theme, j, isHighlight); var symbolEmptyColor = SerieHelper.GetItemBackgroundColor(serie, serieData, chart.theme, j, isHighlight, false); @@ -307,7 +341,7 @@ namespace XCharts serie.animation.CheckProgress(1); chart.RefreshPainter(serie); } - if (dataChanging) + if (dataChanging || interacting) { chart.RefreshPainter(serie); } diff --git a/Assets/XCharts/Runtime/Serie/Scatter/BaseScatterHandler.cs b/Assets/XCharts/Runtime/Serie/Scatter/BaseScatterHandler.cs index 92cd1273..890a3b06 100644 --- a/Assets/XCharts/Runtime/Serie/Scatter/BaseScatterHandler.cs +++ b/Assets/XCharts/Runtime/Serie/Scatter/BaseScatterHandler.cs @@ -15,6 +15,8 @@ namespace XCharts [UnityEngine.Scripting.Preserve] internal class BaseScatterHandler : SerieHandler where T : BaseScatter { + private GridCoord m_Grid; + public override void Update() { UpdateSerieContext(); @@ -54,6 +56,26 @@ namespace XCharts paramList.Add(param); } + public override bool OnLegendButtonEnter(int index, string legendName) + { + if (chart.GetLegendRealShowNameIndex(serie.serieName) == index) + { + serie.context.isLegendEnter = true; + return true; + } + return false; + } + + public override bool OnLegendButtonExit(int index, string legendName) + { + if (chart.GetLegendRealShowNameIndex(serie.serieName) == index) + { + serie.context.isLegendEnter = false; + return true; + } + return false; + } + public override void DrawSerie(VertexHelper vh) { var colorIndex = chart.GetLegendRealShowNameIndex(serie.legendName); @@ -70,58 +92,44 @@ namespace XCharts private void UpdateSerieContext() { - if (serie.IsUseCoord()) + var needCheck = serie.context.isLegendEnter || (chart.isPointerInChart && (m_Grid == null || m_Grid.IsPointerEnter())); + + var needHideAll = false; + if (!needCheck) { - var grid = chart.GetChartComponent(serie.containerIndex); - if (grid == null) - return; - - if (!grid.IsPointerEnter()) + if (m_LastCheckContextFlag == needCheck) return; + needHideAll = true; } - - var lastDataIndex = serie.context.pointerItemDataIndex; - var maxCount = serie.maxShow > 0 ? - (serie.maxShow > serie.dataCount ? serie.dataCount : serie.maxShow) - : serie.dataCount; - var themeSymbolSize = chart.theme.serie.scatterSymbolSize; - - if (lastDataIndex >= 0) - { - var serieData = serie.GetSerieData(lastDataIndex); - var symbol = SerieHelper.GetSerieSymbol(serie, serieData); - var symbolSize = symbol.GetSize(serieData.data, themeSymbolSize); - if (Vector3.Distance(serieData.context.position, chart.pointerPos) <= symbolSize) - { - serieData.context.highlight = true; - serie.context.pointerItemDataIndex = lastDataIndex; - return; - } - } - serie.context.pointerEnter = false; + m_LastCheckContextFlag = needCheck; serie.context.pointerItemDataIndex = -1; - if (lastDataIndex >= 0) - { - serie.GetSerieData(lastDataIndex).context.highlight = false; - chart.RefreshPainter(serie); - } + serie.context.pointerEnter = false; + var themeSymbolSize = chart.theme.serie.scatterSymbolSize; + var themeSymbolSelectedSize = chart.theme.serie.scatterSymbolSelectedSize; + var needInteract = false; for (int i = serie.dataCount - 1; i >= 0; i--) { var serieData = serie.data[i]; - var symbol = SerieHelper.GetSerieSymbol(serie, serieData); - if (!symbol.ShowSymbol(serieData.index, maxCount)) - continue; - var symbolSize = symbol.GetSize(serieData.data, themeSymbolSize); - if (Vector3.Distance(serieData.context.position, chart.pointerPos) <= symbolSize) + var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize); + if (serie.context.isLegendEnter || + (!needHideAll && Vector3.Distance(serieData.context.position, chart.pointerPos) <= symbolSize)) { - serieData.context.highlight = true; serie.context.pointerItemDataIndex = i; serie.context.pointerEnter = true; - chart.RefreshPainter(serie); - break; + serieData.context.highlight = true; + serieData.interact.SetValue(ref needInteract, symbolSelectedSize); } + else + { + serieData.context.highlight = false; + serieData.interact.SetValue(ref needInteract, symbolSize); + } + } + if (needInteract) + { + chart.RefreshPainter(serie); } } @@ -141,8 +149,7 @@ namespace XCharts if (!chart.TryGetChartComponent(out yAxis, serie.yAxisIndex)) return; - GridCoord grid; - if (!chart.TryGetChartComponent(out grid, xAxis.gridIndex)) + if (!chart.TryGetChartComponent(out m_Grid, xAxis.gridIndex)) return; DataZoom xDataZoom; @@ -157,11 +164,12 @@ namespace XCharts var rate = serie.animation.GetCurrRate(); var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); var dataChanging = false; + var interacting = false; var dataList = serie.GetDataList(xDataZoom); var isEffectScatter = serie is EffectScatter; - serie.containerIndex = grid.index; - serie.containterInstanceId = grid.instanceId; + serie.containerIndex = m_Grid.index; + serie.containterInstanceId = m_Grid.instanceId; foreach (var serieData in dataList) { @@ -181,28 +189,29 @@ namespace XCharts if (serieData.IsDataChanged()) dataChanging = true; - float pX = grid.context.x + xAxis.axisLine.GetWidth(theme.axis.lineWidth); - float pY = grid.context.y + yAxis.axisLine.GetWidth(theme.axis.lineWidth); - float xDataHig = GetDataHig(xAxis, xValue, grid.context.width); - float yDataHig = GetDataHig(yAxis, yValue, grid.context.height); + float pX = m_Grid.context.x + xAxis.axisLine.GetWidth(theme.axis.lineWidth); + float pY = m_Grid.context.y + yAxis.axisLine.GetWidth(theme.axis.lineWidth); + float xDataHig = GetDataHig(xAxis, xValue, m_Grid.context.width); + float yDataHig = GetDataHig(yAxis, yValue, m_Grid.context.height); var pos = new Vector3(pX + xDataHig, pY + yDataHig); - if (!grid.Contains(pos)) + if (!m_Grid.Contains(pos)) continue; serie.context.dataPoints.Add(pos); serieData.context.position = pos; var datas = serieData.data; - float symbolSize = 0; + var symbolSize = serie.highlight || serieData.context.highlight + ? theme.serie.scatterSymbolSelectedSize + : theme.serie.scatterSymbolSize; + if (!serieData.interact.TryGetValue(ref symbolSize, ref interacting)) + { + symbolSize = highlight + ? symbol.GetSelectedSize(serieData.data, symbolSize) + : symbol.GetSize(serieData.data, symbolSize); + serieData.interact.SetValue(ref interacting, symbolSize); + } - if (serie.highlight || serieData.context.highlight) - { - symbolSize = symbol.GetSelectedSize(datas, theme.serie.scatterSymbolSelectedSize); - } - else - { - symbolSize = symbol.GetSize(datas, theme.serie.scatterSymbolSize); - } symbolSize *= rate; if (isEffectScatter) @@ -227,7 +236,7 @@ namespace XCharts serie.animation.CheckProgress(1); chart.RefreshPainter(serie); } - if (dataChanging) + if (dataChanging || interacting) { chart.RefreshPainter(serie); } diff --git a/Assets/XCharts/Runtime/Serie/SerieContext.cs b/Assets/XCharts/Runtime/Serie/SerieContext.cs index f59763bf..10f32500 100644 --- a/Assets/XCharts/Runtime/Serie/SerieContext.cs +++ b/Assets/XCharts/Runtime/Serie/SerieContext.cs @@ -36,6 +36,9 @@ namespace XCharts /// 鼠标所在轴线上的数据项索引(可能有多个) /// public List pointerAxisDataIndexs = new List(); + public bool isTriggerByAxis = false; + public bool isLegendEnter = false; + public int legendEnterIndex; /// /// 中心点 /// @@ -88,7 +91,7 @@ namespace XCharts /// /// 数据对应的位置坐标是否忽略(忽略时连线是透明的),dataIgnore 和 dataPoints 一一对应。 /// - public List dataIgnore = new List(); + public List dataIgnores = new List(); /// /// 排序后的数据 /// diff --git a/Assets/XCharts/Runtime/Serie/SerieData.cs b/Assets/XCharts/Runtime/Serie/SerieData.cs index 512f13e9..f03a3f11 100644 --- a/Assets/XCharts/Runtime/Serie/SerieData.cs +++ b/Assets/XCharts/Runtime/Serie/SerieData.cs @@ -5,6 +5,7 @@ /* */ /************************************************/ +using System; using System.Collections.Generic; using UnityEngine; @@ -31,7 +32,8 @@ namespace XCharts [SerializeField] private List m_Data = new List(); [SerializeField] private List m_Children = new List(); - public SerieDataContext context = new SerieDataContext(); + [NonSerialized] public SerieDataContext context = new SerieDataContext(); + [NonSerialized] public InteractData interact = new InteractData(); public ChartLabel labelObject { get; set; } private bool m_Show = true; @@ -117,6 +119,7 @@ namespace XCharts context.canShowLabel = true; context.highlight = false; m_Radius = 0; + interact.Reset(); m_Data.Clear(); m_PreviousData.Clear(); m_DataUpdateTime.Clear(); diff --git a/Assets/XCharts/Runtime/Serie/SerieHandler.cs b/Assets/XCharts/Runtime/Serie/SerieHandler.cs index ecb0f8c8..3393ac5a 100644 --- a/Assets/XCharts/Runtime/Serie/SerieHandler.cs +++ b/Assets/XCharts/Runtime/Serie/SerieHandler.cs @@ -50,6 +50,7 @@ namespace XCharts protected GameObject m_SerieRoot; protected bool m_InitedLabel; protected bool m_RefreshLabel; + protected bool m_LastCheckContextFlag = false; public T serie { get; internal set; } @@ -152,8 +153,9 @@ namespace XCharts if (serie.IsPerformanceMode()) return false; if (count == -1) count = serie.dataCount; var serieLabel = SerieHelper.GetSerieLabel(serie, serieData); + var serieEmphasisLabel = SerieHelper.GetSerieEmphasisLabel(serie, serieData); var iconStyle = SerieHelper.GetIconStyle(serie, serieData); - if (!serieLabel.show && !iconStyle.show) return false; + if (!serieLabel.show && (serieEmphasisLabel == null || !serieEmphasisLabel.show) && !iconStyle.show) return false; var textName = ChartCached.GetSerieLabelName(s_SerieLabelObjectName, serie.index, serieData.index); var color = Color.grey; if (serie.useDataNameForColor) diff --git a/Assets/XCharts/Runtime/Theme/SerieTheme.cs b/Assets/XCharts/Runtime/Theme/SerieTheme.cs index ccbb6e65..df062d54 100644 --- a/Assets/XCharts/Runtime/Theme/SerieTheme.cs +++ b/Assets/XCharts/Runtime/Theme/SerieTheme.cs @@ -15,10 +15,9 @@ namespace XCharts { [SerializeField] protected float m_LineWidth; [SerializeField] protected float m_LineSymbolSize; - [SerializeField] protected float m_LineSymbolSelectedSize; [SerializeField] protected float m_ScatterSymbolSize; - [SerializeField] protected float m_ScatterSymbolSelectedSize; [SerializeField] protected float m_PieTooltipExtraRadius; + [SerializeField] protected float m_SelectedRate = 1.3f; [SerializeField] protected float m_PieSelectedOffset; [SerializeField] protected Color32 m_CandlestickColor = new Color32(194, 53, 49, 255); [SerializeField] protected Color32 m_CandlestickColor0 = new Color32(49, 70, 86, 255); @@ -40,20 +39,17 @@ namespace XCharts get { return m_LineSymbolSize; } set { if (PropertyUtil.SetStruct(ref m_LineSymbolSize, value)) SetVerticesDirty(); } } - public float lineSymbolSelectedSize - { - get { return m_LineSymbolSelectedSize; } - set { if (PropertyUtil.SetStruct(ref m_LineSymbolSelectedSize, value)) SetVerticesDirty(); } - } + public float lineSymbolSelectedSize { get { return lineSymbolSize * selectedRate; } } public float scatterSymbolSize { get { return m_ScatterSymbolSize; } set { if (PropertyUtil.SetStruct(ref m_ScatterSymbolSize, value)) SetVerticesDirty(); } } - public float scatterSymbolSelectedSize + public float scatterSymbolSelectedSize { get { return scatterSymbolSize * selectedRate; } } + public float selectedRate { - get { return m_ScatterSymbolSelectedSize; } - set { if (PropertyUtil.SetStruct(ref m_ScatterSymbolSelectedSize, value)) SetVerticesDirty(); } + get { return m_SelectedRate; } + set { if (PropertyUtil.SetStruct(ref m_SelectedRate, value)) SetVerticesDirty(); } } /// @@ -118,9 +114,8 @@ namespace XCharts { m_LineWidth = theme.lineWidth; m_LineSymbolSize = theme.lineSymbolSize; - m_LineSymbolSelectedSize = theme.lineSymbolSelectedSize; m_ScatterSymbolSize = theme.scatterSymbolSize; - m_ScatterSymbolSelectedSize = theme.scatterSymbolSelectedSize; + selectedRate = theme.selectedRate; m_PieTooltipExtraRadius = theme.pieTooltipExtraRadius; m_PieSelectedOffset = theme.pieSelectedOffset; m_CandlestickColor = theme.candlestickColor; @@ -134,9 +129,7 @@ namespace XCharts { m_LineWidth = XCSettings.serieLineWidth; m_LineSymbolSize = XCSettings.serieLineSymbolSize; - m_LineSymbolSelectedSize = XCSettings.serieLineSymbolSelectedSize; m_ScatterSymbolSize = XCSettings.serieScatterSymbolSize; - m_ScatterSymbolSelectedSize = XCSettings.serieScatterSymbolSelectedSize; m_PieTooltipExtraRadius = XCSettings.pieTooltipExtraRadius; m_PieSelectedOffset = XCSettings.pieSelectedOffset; m_CandlestickBorderWidth = XCSettings.serieCandlestickBorderWidth;