diff --git a/CHANGELOG.md b/CHANGELOG.md index d2153382..3c9e1094 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,9 +57,11 @@ ## master +* (2022.07.24) 增加`StateStyle`的`Symbol`用于配置状态下的标记样式 +* (2022.07.24) 去掉`SerieSymbol`的`selectedSize`配置 * (2022.07.24) 增加`Serie`和`SerieData`的`state`设置默认状态 * (2022.07.22) 增加`Serie`的三种状态`EmphasisStyle`,`BlurStyle`,`SelectStyle` -* (2022.07.22) 去掉`AreaStyle`的`m_HighlightColor`和`m_HighlightToColor`配置 +* (2022.07.22) 去掉`AreaStyle`的`highlightColor`和`highlightToColor`配置 * (2022.07.22) 去掉`Emphasis`,`EmphasisItemStyle`,`EmphasisLabelStyle`,`EmphasisLabelLine`组件 * (2022.07.20) 文档支持用`Since`标识类从哪个版本开始支持 * (2022.07.20) 修复`Axis`在`Value`轴时,`AxisLabel`的`showStartLabel`和`showEndLabel`参数设置不生效的问题 diff --git a/Editor/ChildComponents/SerieSymbolDrawer.cs b/Editor/ChildComponents/SerieSymbolDrawer.cs index 0f3e214a..23639c5b 100644 --- a/Editor/ChildComponents/SerieSymbolDrawer.cs +++ b/Editor/ChildComponents/SerieSymbolDrawer.cs @@ -31,12 +31,10 @@ namespace XCharts.Editor { case SymbolSizeType.Custom: PropertyField(prop, "m_Size"); - PropertyField(prop, "m_SelectedSize"); break; case SymbolSizeType.FromData: PropertyField(prop, "m_DataIndex"); PropertyField(prop, "m_DataScale"); - PropertyField(prop, "m_SelectedDataScale"); break; case SymbolSizeType.Function: break; diff --git a/Editor/ChildComponents/StateStyleDrawer.cs b/Editor/ChildComponents/StateStyleDrawer.cs index ca0f746e..31eee8fc 100644 --- a/Editor/ChildComponents/StateStyleDrawer.cs +++ b/Editor/ChildComponents/StateStyleDrawer.cs @@ -16,6 +16,7 @@ namespace XCharts.Editor { ++EditorGUI.indentLevel; OnCustomGUI(prop); + PropertyField(prop, "m_Symbol"); PropertyField(prop, "m_ItemStyle"); PropertyField(prop, "m_Label"); PropertyField(prop, "m_LabelLine"); diff --git a/Examples/Example50_Scatter.cs b/Examples/Example50_Scatter.cs index 74b8d6c3..80f8f967 100644 --- a/Examples/Example50_Scatter.cs +++ b/Examples/Example50_Scatter.cs @@ -18,7 +18,6 @@ namespace XCharts.Example foreach (var serie in chart.series) { serie.symbol.sizeFunction = SymbolSize; - serie.symbol.selectedSizeFunction = SymbolSelectedSize; } } @@ -26,10 +25,5 @@ namespace XCharts.Example { return (float) (Math.Sqrt(data[2]) / 6e2); } - - float SymbolSelectedSize(List data) - { - return (float) (Math.Sqrt(data[2]) / 5e2); - } } } \ No newline at end of file diff --git a/Runtime/Component/Child/SerieSymbl.cs b/Runtime/Component/Child/SerieSymbl.cs index 34865a8d..7cdc1013 100644 --- a/Runtime/Component/Child/SerieSymbl.cs +++ b/Runtime/Component/Child/SerieSymbl.cs @@ -34,12 +34,9 @@ namespace XCharts.Runtime public class SerieSymbol : SymbolStyle, ISerieDataComponent { [SerializeField] private SymbolSizeType m_SizeType = SymbolSizeType.Custom; - [SerializeField] private float m_SelectedSize = 0f; [SerializeField] private int m_DataIndex = 1; [SerializeField] private float m_DataScale = 1; - [SerializeField] private float m_SelectedDataScale = 1.5f; [SerializeField] private SymbolSizeFunction m_SizeFunction; - [SerializeField] private SymbolSizeFunction m_SelectedSizeFunction; [SerializeField] private int m_StartIndex; [SerializeField] private int m_Interval; [SerializeField] private bool m_ForceShowLast = false; @@ -49,12 +46,9 @@ namespace XCharts.Runtime { base.Reset(); m_SizeType = SymbolSizeType.Custom; - m_SelectedSize = 0f; m_DataIndex = 1; m_DataScale = 1; - m_SelectedDataScale = 1.5f; m_SizeFunction = null; - m_SelectedSizeFunction = null; m_StartIndex = 0; m_Interval = 0; m_ForceShowLast = false; @@ -71,15 +65,6 @@ namespace XCharts.Runtime set { if (PropertyUtil.SetStruct(ref m_SizeType, value)) SetVerticesDirty(); } } /// - /// the size of selected symbol. - /// |被选中的标记的大小。 - /// - public float selectedSize - { - get { return m_SelectedSize; } - set { if (PropertyUtil.SetStruct(ref m_SelectedSize, value)) SetVerticesDirty(); } - } - /// /// whitch data index is when the sizeType assined as FromData. /// |当sizeType指定为FromData时,指定的数据源索引。 /// @@ -98,15 +83,6 @@ namespace XCharts.Runtime set { if (PropertyUtil.SetStruct(ref m_DataScale, value)) SetVerticesDirty(); } } /// - /// the scale of selected data when sizeType assined as FromData. - /// |当sizeType指定为FromData时,指定的高亮倍数系数。 - /// - public float selectedDataScale - { - get { return m_SelectedDataScale; } - set { if (PropertyUtil.SetStruct(ref m_SelectedDataScale, value)) SetVerticesDirty(); } - } - /// /// the function of size when sizeType assined as Function. /// |当sizeType指定为Function时,指定的委托函数。 /// @@ -116,15 +92,6 @@ namespace XCharts.Runtime set { if (PropertyUtil.SetClass(ref m_SizeFunction, value)) SetVerticesDirty(); } } /// - /// the function of size when sizeType assined as Function. - /// |当sizeType指定为Function时,指定的高亮委托函数。 - /// - public SymbolSizeFunction selectedSizeFunction - { - get { return m_SelectedSizeFunction; } - set { if (PropertyUtil.SetClass(ref m_SelectedSizeFunction, value)) SetVerticesDirty(); } - } - /// /// the index start to show symbol. /// |开始显示图形标记的索引。 /// @@ -187,42 +154,6 @@ namespace XCharts.Runtime } } - /// - /// 根据sizeType获得高亮时的标记大小 - /// - /// - /// - public float GetSelectedSize(List data, float themeSelectedSize) - { - switch (m_SizeType) - { - case SymbolSizeType.Custom: - - return selectedSize == 0 ? themeSelectedSize : selectedSize; - - case SymbolSizeType.FromData: - - if (data != null && dataIndex >= 0 && dataIndex < data.Count) - { - return (float) data[dataIndex] * m_SelectedDataScale; - } - else - { - return selectedSize == 0 ? themeSelectedSize : selectedSize; - } - - case SymbolSizeType.Function: - - if (data != null && selectedSizeFunction != null) - return selectedSizeFunction(data); - else - return selectedSize == 0 ? themeSelectedSize : selectedSize; - - default: - return selectedSize == 0 ? themeSelectedSize : selectedSize; - } - } - public bool ShowSymbol(int dataIndex, int dataCount) { if (!show) diff --git a/Runtime/Component/Mark/MarkLineHandler.cs b/Runtime/Component/Mark/MarkLineHandler.cs index 813b294e..55d211df 100644 --- a/Runtime/Component/Mark/MarkLineHandler.cs +++ b/Runtime/Component/Mark/MarkLineHandler.cs @@ -242,9 +242,10 @@ namespace XCharts.Runtime private void DrawMarkLineSymbol(VertexHelper vh, SymbolStyle symbol, Serie serie, GridCoord grid, ThemeStyle theme, Vector3 pos, Vector3 startPos, Color32 lineColor) { - var tickness = SerieHelper.GetSymbolBorder(serie, null, theme); - var borderColor = SerieHelper.GetSymbolBorderColor(serie, null, theme); - var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, null); + float tickness = 0f; + float[] cornerRadius = null; + Color32 borderColor; + SerieHelper.GetSymbolInfo(out borderColor, out tickness, out cornerRadius, serie, null, chart.theme); chart.DrawClipSymbol(vh, symbol.type, symbol.size, tickness, pos, lineColor, lineColor, ColorUtil.clearColor32, borderColor, symbol.gap, true, cornerRadius, grid, startPos); } diff --git a/Runtime/Component/State/StateStyle.cs b/Runtime/Component/State/StateStyle.cs index 9c1304ce..847108ce 100644 --- a/Runtime/Component/State/StateStyle.cs +++ b/Runtime/Component/State/StateStyle.cs @@ -16,6 +16,7 @@ namespace XCharts.Runtime [SerializeField] private ItemStyle m_ItemStyle = new ItemStyle(); [SerializeField] private LineStyle m_LineStyle = new LineStyle(); [SerializeField] private AreaStyle m_AreaStyle = new AreaStyle(); + [SerializeField] private SerieSymbol m_Symbol = new SerieSymbol(); public void Reset() { @@ -23,6 +24,7 @@ namespace XCharts.Runtime m_Label.Reset(); m_LabelLine.Reset(); m_ItemStyle.Reset(); + m_Symbol.Reset(); } /// @@ -73,6 +75,14 @@ namespace XCharts.Runtime get { return m_AreaStyle; } set { if (PropertyUtil.SetClass(ref m_AreaStyle, value, true)) SetVerticesDirty(); } } + /// + /// 标记样式。 + /// + public SerieSymbol symbol + { + get { return m_Symbol; } + set { if (PropertyUtil.SetClass(ref m_Symbol, value, true)) SetVerticesDirty(); } + } public override bool vertsDirty { @@ -82,7 +92,8 @@ namespace XCharts.Runtime m_Label.vertsDirty || m_ItemStyle.vertsDirty || m_LineStyle.vertsDirty || - m_AreaStyle.vertsDirty; + m_AreaStyle.vertsDirty || + m_Symbol.vertsDirty; } } @@ -102,12 +113,14 @@ namespace XCharts.Runtime m_ItemStyle.ClearVerticesDirty(); m_LineStyle.ClearVerticesDirty(); m_AreaStyle.ClearVerticesDirty(); + m_Symbol.ClearVerticesDirty(); } public override void ClearComponentDirty() { base.ClearComponentDirty(); m_Label.ClearComponentDirty(); + m_Symbol.ClearComponentDirty(); } } } \ No newline at end of file diff --git a/Runtime/Internal/Utilities/ChartHelper.cs b/Runtime/Internal/Utilities/ChartHelper.cs index 1c3f8968..1ecebe83 100644 --- a/Runtime/Internal/Utilities/ChartHelper.cs +++ b/Runtime/Internal/Utilities/ChartHelper.cs @@ -836,7 +836,7 @@ namespace XCharts.Runtime } } - public static Color32 GetHighlightColor(Color32 color, float rate = 0.8f) + public static Color32 GetHighlightColor(Color32 color, float rate = 1.2f) { var newColor = color; newColor.r = (byte) (color.r * rate); @@ -852,7 +852,7 @@ namespace XCharts.Runtime return newColor; } - public static Color32 GetSelectColor(Color32 color, float rate = 0.7f) + public static Color32 GetSelectColor(Color32 color, float rate = 0.8f) { var newColor = color; newColor.r = (byte) (color.r * rate); diff --git a/Runtime/Serie/Line/LineHandler.GridCoord.cs b/Runtime/Serie/Line/LineHandler.GridCoord.cs index f1b6c6f8..55938982 100644 --- a/Runtime/Serie/Line/LineHandler.GridCoord.cs +++ b/Runtime/Serie/Line/LineHandler.GridCoord.cs @@ -56,70 +56,62 @@ namespace XCharts.Runtime } m_LastCheckContextFlag = needCheck; var themeSymbolSize = chart.theme.serie.lineSymbolSize; - var themeSymbolSelectedSize = chart.theme.serie.lineSymbolSelectedSize; var needInteract = false; if (m_LegendEnter) - { - serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate); - for (int i = 0; i < serie.dataCount; i++) - { - var serieData = serie.data[i]; - var symbol = SerieHelper.GetSerieSymbol(serie, serieData); - var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize); - - serieData.context.highlight = true; - serieData.interact.SetValue(ref needInteract, symbolSelectedSize); - } - } - 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++) { 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) + var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, SerieState.Emphasis); + serieData.context.highlight = true; + serieData.interact.SetValue(ref needInteract, size); + } + } + else if (serie.context.isTriggerByAxis) + { + serie.context.pointerEnter = false; + serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate); + for (int i = 0; i < serie.dataCount; i++) + { + var serieData = serie.data[i]; + var highlight = i == serie.context.pointerItemDataIndex; + serieData.context.highlight = highlight; + var state = SerieHelper.GetSerieState(serie, serieData, true); + var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, state); + serieData.interact.SetValue(ref needInteract, size); + if (highlight) { - serieData.context.highlight = true; - serieData.interact.SetValue(ref needInteract, symbolSelectedSize); - } - else - { - serieData.context.highlight = false; - serieData.interact.SetValue(ref needInteract, symbolSize); + serie.context.pointerEnter = true; + serie.context.pointerItemDataIndex = i; } } } else { + var lastIndex = serie.context.pointerItemDataIndex; serie.context.pointerItemDataIndex = -1; serie.context.pointerEnter = false; for (int i = 0; i < serie.dataCount; i++) { var serieData = serie.data[i]; - serieData.index = i; 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) + var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize); + var highlight = dist <= size; + serieData.context.highlight = highlight; + var state = SerieHelper.GetSerieState(serie, serieData, true); + size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, state); + serieData.interact.SetValue(ref needInteract, size); + if (highlight) { - serie.context.pointerItemDataIndex = serieData.index; serie.context.pointerEnter = true; + serie.context.pointerItemDataIndex = serieData.index; 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 (lastIndex != serie.context.pointerItemDataIndex) + needInteract = true; } if (needInteract) { @@ -157,8 +149,8 @@ namespace XCharts.Runtime continue; if (serieData.context.isClip) continue; - - var symbol = SerieHelper.GetSerieSymbol(serie, serieData); + var state = SerieHelper.GetSerieState(serie, serieData, true); + var symbol = SerieHelper.GetSerieSymbol(serie, serieData, state); if (!symbol.show || !symbol.ShowSymbol(i, count)) continue; @@ -175,30 +167,24 @@ namespace XCharts.Runtime if (ChartHelper.IsIngore(pos)) continue; - var highlight = serie.data[i].context.highlight || serie.highlight; - var symbolSize = highlight ? - theme.serie.lineSymbolSelectedSize : - theme.serie.lineSymbolSize; + var symbolSize = 0f; if (!serieData.interact.TryGetValue(ref symbolSize, ref interacting)) { - symbolSize = highlight ? - symbol.GetSelectedSize(serieData.data, symbolSize) : - symbol.GetSize(serieData.data, symbolSize); + symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, chart.theme.serie.lineSymbolSize, state); serieData.interact.SetValue(ref interacting, symbolSize); symbolSize = serie.animation.GetSysmbolSize(symbolSize); } - var state = SerieHelper.GetSerieState(serie, serieData); - Color32 symbolColor, symbolToColor,symbolEmptyColor; - SerieHelper.GetItemColor(out symbolColor, out symbolToColor,out symbolEmptyColor, serie, serieData, theme, serie.index, state); + float symbolBorder = 0f; + float[] cornerRadius = null; + Color32 symbolColor, symbolToColor, symbolEmptyColor, borderColor; + SerieHelper.GetItemColor(out symbolColor, out symbolToColor, out symbolEmptyColor, serie, serieData, theme, serie.index); + SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, null, chart.theme, state); if (isVisualMapGradient) { symbolColor = VisualMapHelper.GetLineGradientColor(visualMap, pos, m_SerieGrid, axis, relativedAxis, symbolColor); symbolToColor = symbolColor; } - var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, theme, state); - var borderColor = SerieHelper.GetSymbolBorderColor(serie, serieData, theme, state); - var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, state); chart.DrawClipSymbol(vh, symbol.type, symbolSize, symbolBorder, pos, symbolColor, symbolToColor, symbolEmptyColor, borderColor, symbol.gap, clip, cornerRadius, m_SerieGrid, i > 0 ? serie.context.dataPoints[i - 1] : m_SerieGrid.context.position); diff --git a/Runtime/Serie/Line/LineHandler.PolarCoord.cs b/Runtime/Serie/Line/LineHandler.PolarCoord.cs index 24410e0c..9b1c5ae9 100644 --- a/Runtime/Serie/Line/LineHandler.PolarCoord.cs +++ b/Runtime/Serie/Line/LineHandler.PolarCoord.cs @@ -47,21 +47,19 @@ namespace XCharts.Runtime } m_LastCheckContextFlag = needCheck; var themeSymbolSize = chart.theme.serie.lineSymbolSize; - var themeSymbolSelectedSize = chart.theme.serie.lineSymbolSelectedSize; lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth); var needInteract = false; if (m_LegendEnter) { + serie.context.pointerEnter = true; serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate); for (int i = 0; i < serie.dataCount; i++) { var serieData = serie.data[i]; - var symbol = SerieHelper.GetSerieSymbol(serie, serieData); - var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize); - + var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, SerieState.Emphasis); serieData.context.highlight = true; - serieData.interact.SetValue(ref needInteract, symbolSelectedSize); + serieData.interact.SetValue(ref needInteract, size); } } else @@ -205,27 +203,23 @@ namespace XCharts.Runtime continue; var count = serie.dataCount; - Color32 symbolColor, symbolToColor,symbolEmptyColor; + float symbolBorder = 0f; + float[] cornerRadius = null; + Color32 symbolColor, symbolToColor, symbolEmptyColor, borderColor; for (int i = 0; i < count; i++) { var serieData = serie.GetSerieData(i); - var symbol = SerieHelper.GetSerieSymbol(serie, serieData); + var state = SerieHelper.GetSerieState(serie, serieData, true); + var symbol = SerieHelper.GetSerieSymbol(serie, serieData, state); if (ChartHelper.IsIngore(serieData.context.position)) continue; - bool highlight = serieData.context.highlight || serie.highlight; - if ((!symbol.show || !symbol.ShowSymbol(i, count) || serie.IsPerformanceMode()) && - !serieData.context.highlight) + if (!symbol.show || !symbol.ShowSymbol(i, count)) continue; - var symbolSize = highlight ? - symbol.GetSelectedSize(serieData.data, chart.theme.serie.lineSymbolSize) : - symbol.GetSize(serieData.data, chart.theme.serie.lineSymbolSize); - var state = SerieHelper.GetSerieState(serie, serieData); - SerieHelper.GetItemColor(out symbolColor, out symbolToColor,out symbolEmptyColor, serie, serieData, chart.theme, n); - var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, chart.theme, state); - var borderColor = SerieHelper.GetSymbolBorderColor(serie, serieData, chart.theme, state); - var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, state); + var symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, chart.theme.serie.lineSymbolSize, state); + SerieHelper.GetItemColor(out symbolColor, out symbolToColor, out symbolEmptyColor, serie, serieData, chart.theme, n); + SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, null, chart.theme, state); symbolSize = serie.animation.GetSysmbolSize(symbolSize); chart.DrawSymbol(vh, symbol.type, symbolSize, symbolBorder, serieData.context.position, diff --git a/Runtime/Serie/Line/LineHelper.cs b/Runtime/Serie/Line/LineHelper.cs index d99132a1..20942d18 100644 --- a/Runtime/Serie/Line/LineHelper.cs +++ b/Runtime/Serie/Line/LineHelper.cs @@ -261,8 +261,6 @@ namespace XCharts.Runtime var isY = axis is YAxis; var isVisualMapGradient = VisualMapHelper.IsNeedLineGradient(visualMap); var isLineStyleGradient = serie.lineStyle.IsNeedGradient(); - - //var highlight = serie.highlight || serie.context.pointerEnter; var lineColor = SerieHelper.GetLineColor(serie, null, theme, serie.context.colorIndex); var lastDataIsIgnore = datas[0].isIgnoreBreak; diff --git a/Runtime/Serie/Line/SimplifiedLineHandler.cs b/Runtime/Serie/Line/SimplifiedLineHandler.cs index 49bb49f0..73c9c82b 100644 --- a/Runtime/Serie/Line/SimplifiedLineHandler.cs +++ b/Runtime/Serie/Line/SimplifiedLineHandler.cs @@ -73,15 +73,14 @@ namespace XCharts.Runtime var needInteract = false; if (m_LegendEnter) { + serie.context.pointerEnter = true; serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate); for (int i = 0; i < serie.dataCount; i++) { var serieData = serie.data[i]; - var symbol = SerieHelper.GetSerieSymbol(serie, serieData); - var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize); - + var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, SerieState.Emphasis); serieData.context.highlight = true; - serieData.interact.SetValue(ref needInteract, symbolSelectedSize); + serieData.interact.SetValue(ref needInteract, size); } } else if (serie.context.isTriggerByAxis) @@ -91,47 +90,42 @@ namespace XCharts.Runtime for (int i = 0; i < serie.dataCount; i++) { 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) + var highlight = i == serie.context.pointerItemDataIndex; + serieData.context.highlight = highlight; + var state = SerieHelper.GetSerieState(serie, serieData, true); + var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, state); + serieData.interact.SetValue(ref needInteract, size); + if (highlight) { - serieData.context.highlight = true; - serieData.interact.SetValue(ref needInteract, symbolSelectedSize); - } - else - { - serieData.context.highlight = false; - serieData.interact.SetValue(ref needInteract, symbolSize); + serie.context.pointerEnter = true; + serie.context.pointerItemDataIndex = i; } } } else { + var lastIndex = serie.context.pointerItemDataIndex; serie.context.pointerItemDataIndex = -1; serie.context.pointerEnter = false; - foreach (var serieData in serie.data) + for (int i = 0; i < serie.dataCount; i++) { + var serieData = serie.data[i]; 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) + var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize); + var highlight = dist <= size; + serieData.context.highlight = highlight; + var state = SerieHelper.GetSerieState(serie, serieData, true); + size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, state); + serieData.interact.SetValue(ref needInteract, size); + if (highlight) { - serie.context.pointerItemDataIndex = serieData.index; serie.context.pointerEnter = true; + serie.context.pointerItemDataIndex = serieData.index; 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 (lastIndex != serie.context.pointerItemDataIndex) + needInteract = true; } if (needInteract) { diff --git a/Runtime/Serie/Radar/RadarHandler.cs b/Runtime/Serie/Radar/RadarHandler.cs index 17c587dc..3d91c852 100644 --- a/Runtime/Serie/Radar/RadarHandler.cs +++ b/Runtime/Serie/Radar/RadarHandler.cs @@ -224,10 +224,10 @@ namespace XCharts.Runtime { continue; } + var serieState = SerieHelper.GetSerieState(serie, serieData, true); var lineStyle = SerieHelper.GetLineStyle(serie, serieData); - var symbol = SerieHelper.GetSerieSymbol(serie, serieData); - var isHighlight = serieData.context.highlight; - var serieState = SerieHelper.GetSerieState(serie, serieData); + var symbol = SerieHelper.GetSerieSymbol(serie, serieData, serieState); + var colorIndex = chart.GetLegendRealShowNameIndex(serieData.legendName); var showArea = SerieHelper.GetAreaColor(out areaColor, out areaToColor, serie, serieData, chart.theme, colorIndex); var lineColor = SerieHelper.GetLineColor(serie, serieData, chart.theme, colorIndex); @@ -300,25 +300,21 @@ namespace XCharts.Runtime if (symbol.show && symbol.type != SymbolType.None) { + float symbolBorder = 0f; + float[] cornerRadius = null; + Color32 symbolColor, symbolToColor, symbolEmptyColor, borderColor; for (int m = 0; m < serieData.context.dataPoints.Count; m++) { var point = serieData.context.dataPoints[m]; - var symbolSize = isHighlight ? - symbol.GetSelectedSize(null, chart.theme.serie.lineSymbolSelectedSize) : - symbol.GetSize(null, chart.theme.serie.lineSymbolSize); + var symbolSize = 0f; if (!serieData.interact.TryGetValue(ref symbolSize, ref interacting)) { - symbolSize = isHighlight ? - symbol.GetSelectedSize(serieData.data, symbolSize) : - symbol.GetSize(serieData.data, symbolSize); + symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, chart.theme.serie.lineSymbolSize, serieState); serieData.interact.SetValue(ref interacting, symbolSize); symbolSize = serie.animation.GetSysmbolSize(symbolSize); } - Color32 symbolColor, symbolToColor, symbolEmptyColor; SerieHelper.GetItemColor(out symbolColor, out symbolToColor, out symbolEmptyColor, serie, serieData, chart.theme, j, serieState); - var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, chart.theme, serieState); - var borderColor = SerieHelper.GetSymbolBorderColor(serie, serieData, chart.theme, serieState); - var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, serieState); + SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, serieData, chart.theme, serieState); chart.DrawSymbol(vh, symbol.type, symbolSize, symbolBorder, point, symbolColor, symbolToColor, symbolEmptyColor, borderColor, symbol.gap, cornerRadius); } @@ -451,20 +447,18 @@ namespace XCharts.Runtime } if (serie.symbol.show && serie.symbol.type != SymbolType.None) { + float symbolBorder = 0f; + float[] cornerRadius = null; + Color32 symbolColor, symbolToColor, symbolEmptyColor, borderColor; for (int j = 0; j < serie.data.Count; j++) { var serieData = serie.data[j]; if (!serieData.show) continue; var state = SerieHelper.GetSerieState(serie, serieData); var serieIndex = serieData.index; - var symbolSize = state == SerieState.Emphasis ? - serie.symbol.GetSelectedSize(serieData.data, chart.theme.serie.lineSymbolSelectedSize) : - serie.symbol.GetSize(serieData.data, chart.theme.serie.lineSymbolSize); - Color32 symbolColor, symbolToColor,symbolEmptyColor; - SerieHelper.GetItemColor(out symbolColor, out symbolToColor,out symbolEmptyColor, serie, serieData, chart.theme, serieIndex, state); - var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, chart.theme, state); - var borderColor = SerieHelper.GetSymbolBorderColor(serie, serieData, chart.theme, state); - var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, state); + var symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, chart.theme.serie.lineSymbolSize, state); + SerieHelper.GetItemColor(out symbolColor, out symbolToColor, out symbolEmptyColor, serie, serieData, chart.theme, serieIndex, state); + SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, serieData, chart.theme, state); if (!radar.IsInIndicatorRange(j, serieData.GetData(1))) { symbolColor = radar.outRangeColor; diff --git a/Runtime/Serie/Scatter/BaseScatterHandler.cs b/Runtime/Serie/Scatter/BaseScatterHandler.cs index 1958afc0..f1a0cab4 100644 --- a/Runtime/Serie/Scatter/BaseScatterHandler.cs +++ b/Runtime/Serie/Scatter/BaseScatterHandler.cs @@ -82,22 +82,21 @@ namespace XCharts.Runtime for (int i = serie.dataCount - 1; i >= 0; i--) { 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); + var symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize); if (m_LegendEnter || (!needHideAll && Vector3.Distance(serieData.context.position, chart.pointerPos) <= symbolSize)) { serie.context.pointerItemDataIndex = i; serie.context.pointerEnter = true; serieData.context.highlight = true; - serieData.interact.SetValue(ref needInteract, symbolSelectedSize); } else { serieData.context.highlight = false; - serieData.interact.SetValue(ref needInteract, symbolSize); } + var state = SerieHelper.GetSerieState(serie, serieData, true); + symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, state); + serieData.interact.SetValue(ref needInteract, symbolSize); } if (needInteract) { @@ -144,19 +143,19 @@ namespace XCharts.Runtime serie.containerIndex = m_Grid.index; serie.containterInstanceId = m_Grid.instanceId; + float symbolBorder = 0f; + float[] cornerRadius = null; + Color32 color, toColor, emptyColor, borderColor; foreach (var serieData in dataList) { var symbol = SerieHelper.GetSerieSymbol(serie, serieData); if (!symbol.ShowSymbol(serieData.index, maxCount)) continue; - var highlight = serie.highlight || serieData.context.highlight; - var state = SerieHelper.GetSerieState(serie, serieData); - Color32 color, toColor, emptyColor; + var state = SerieHelper.GetSerieState(serie, serieData, true); + SerieHelper.GetItemColor(out color, out toColor, out emptyColor, serie, serieData, chart.theme, colorIndex, state); - var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, theme, state); - var borderColor = SerieHelper.GetSymbolBorderColor(serie, serieData, theme, state); - var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, state); + SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, serieData, chart.theme, state); double xValue = serieData.GetCurrData(0, dataChangeDuration, xAxis.inverse); double yValue = serieData.GetCurrData(1, dataChangeDuration, yAxis.inverse); @@ -175,14 +174,10 @@ namespace XCharts.Runtime serie.context.dataPoints.Add(pos); serieData.context.position = pos; var datas = serieData.data; - var symbolSize = serie.highlight || serieData.context.highlight ? - theme.serie.scatterSymbolSelectedSize : - theme.serie.scatterSymbolSize; + var symbolSize = 0f; if (!serieData.interact.TryGetValue(ref symbolSize, ref interacting)) { - symbolSize = highlight ? - symbol.GetSelectedSize(serieData.data, symbolSize) : - symbol.GetSize(serieData.data, symbolSize); + symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, chart.theme.serie.scatterSymbolSize, state); serieData.interact.SetValue(ref interacting, symbolSize); } @@ -249,24 +244,25 @@ namespace XCharts.Runtime serie.containerIndex = axis.index; serie.containterInstanceId = axis.instanceId; + float symbolBorder = 0f; + float[] cornerRadius = null; + Color32 color, toColor, emptyColor, borderColor; foreach (var serieData in dataList) { var symbol = SerieHelper.GetSerieSymbol(serie, serieData); if (!symbol.ShowSymbol(serieData.index, maxCount)) continue; - var state = SerieHelper.GetSerieState(serie, serieData); - Color32 color, toColor, emptyColor; + var state = SerieHelper.GetSerieState(serie, serieData, true); SerieHelper.GetItemColor(out color, out toColor, out emptyColor, serie, serieData, chart.theme, colorIndex, state); - var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, theme, state); - var borderColor = SerieHelper.GetSymbolBorderColor(serie, serieData, theme, state); - var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, state); - var xValue = serieData.GetCurrData(0, dataChangeDuration, axis.inverse); + SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, serieData, chart.theme, state); if (serieData.IsDataChanged()) dataChanging = true; var pos = Vector3.zero; + var xValue = serieData.GetCurrData(0, dataChangeDuration, axis.inverse); + if (axis.orient == Orient.Horizonal) { var xDataHig = GetDataHig(axis, xValue, axis.context.width); @@ -283,11 +279,7 @@ namespace XCharts.Runtime serieData.context.position = pos; var datas = serieData.data; - var symbolSize = 0f; - if (serie.highlight || serieData.context.highlight) - symbolSize = symbol.GetSelectedSize(datas, theme.serie.scatterSymbolSelectedSize); - else - symbolSize = symbol.GetSize(datas, theme.serie.scatterSymbolSize); + var symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, chart.theme.serie.scatterSymbolSize, state); symbolSize *= rate; if (isEffectScatter) diff --git a/Runtime/Serie/SerieData.cs b/Runtime/Serie/SerieData.cs index b61a2653..950f7473 100644 --- a/Runtime/Serie/SerieData.cs +++ b/Runtime/Serie/SerieData.cs @@ -16,6 +16,7 @@ namespace XCharts.Runtime { "m_Id", "m_ParentId", + "m_State", "m_Ignore", "m_Selected", "m_Radius", diff --git a/Runtime/Serie/SerieHelper.cs b/Runtime/Serie/SerieHelper.cs index 4afbba1a..a33d4bee 100644 --- a/Runtime/Serie/SerieHelper.cs +++ b/Runtime/Serie/SerieHelper.cs @@ -248,13 +248,20 @@ namespace XCharts.Runtime return serie.state; } - public static SerieState GetSerieState(Serie serie, SerieData serieData) + public static SerieState GetSerieState(SerieData serieData) { - if (serieData == null || serieData.state == SerieState.Auto) return GetSerieState(serie); if (serieData.context.highlight) return SerieState.Emphasis; return serieData.state; } + public static SerieState GetSerieState(Serie serie, SerieData serieData, bool defaultSerieState = false) + { + if (serieData == null) return GetSerieState(serie); + if (serieData.context.highlight) return SerieState.Emphasis; + if (serieData.state == SerieState.Auto) return defaultSerieState?serie.state : GetSerieState(serie); + return serieData.state; + } + public static Color32 GetItemBackgroundColor(Serie serie, SerieData serieData, ThemeStyle theme, int index, SerieState state = SerieState.Auto, bool useDefault = false) { @@ -443,10 +450,18 @@ namespace XCharts.Runtime return stateStyle == null?serie.labelLine : stateStyle.labelLine; } - public static SerieSymbol GetSerieSymbol(Serie serie, SerieData serieData) + public static SerieSymbol GetSerieSymbol(Serie serie, SerieData serieData, SerieState state = SerieState.Auto) { - if (!serie.IsPerformanceMode() && serieData.symbol != null) return serieData.symbol; - else return serie.symbol; + if (state == SerieState.Auto) state = GetSerieState(serie, serieData); + if (state == SerieState.Normal) + { + return serieData != null && serieData.symbol != null? serieData.symbol : serie.symbol; + } + else + { + var stateStyle = GetStateStyle(serie, serieData, state); + return stateStyle == null?serie.symbol : stateStyle.symbol; + } } public static LineStyle GetLineStyle(Serie serie, SerieData serieData) @@ -579,29 +594,73 @@ namespace XCharts.Runtime { if (!ChartHelper.IsClearColor(checkColor)) color = checkColor; else if (!ChartHelper.IsClearColor(itemColor)) color = itemColor; - if (ChartHelper.IsClearColor(color)) color = theme.GetColor(colorIndex); + if (ChartHelper.IsClearColor(color) && colorIndex >= 0) color = theme.GetColor(colorIndex); if (setOpacity) ChartHelper.SetColorOpacity(ref color, opacity); } - public static float GetSymbolBorder(Serie serie, SerieData serieData, ThemeStyle theme, SerieState state = SerieState.Auto) + public static void GetSymbolInfo(out Color32 borderColor, out float border, out float[] cornerRadius, + Serie serie, SerieData serieData, ThemeStyle theme, SerieState state = SerieState.Auto) { - var itemStyle = GetItemStyle(serie, serieData, state); - if (itemStyle != null && itemStyle.borderWidth != 0) return itemStyle.borderWidth; - else return serie.lineStyle.GetWidth(theme.serie.lineWidth) * 2; + borderColor = ChartConst.clearColor32; + if (state == SerieState.Auto) + state = GetSerieState(serie, serieData); + var stateStyle = GetStateStyle(serie, serieData, state); + if (stateStyle == null) + { + var itemStyle = GetItemStyle(serie, serieData, SerieState.Normal); + border = itemStyle.borderWidth != 0 ? itemStyle.borderWidth : serie.lineStyle.GetWidth(theme.serie.lineWidth); + cornerRadius = itemStyle.cornerRadius; + GetColor(ref borderColor, itemStyle.borderColor, itemStyle.borderColor, 1, theme, -1); + switch (state) + { + case SerieState.Emphasis: + borderColor = ChartHelper.GetHighlightColor(borderColor); + break; + case SerieState.Blur: + borderColor = ChartHelper.GetBlurColor(borderColor); + break; + case SerieState.Select: + borderColor = ChartHelper.GetSelectColor(borderColor); + break; + default: + break; + } + } + else + { + var itemStyle = stateStyle.itemStyle; + border = itemStyle.borderWidth != 0 ? itemStyle.borderWidth : stateStyle.lineStyle.GetWidth(theme.serie.lineWidth); + cornerRadius = itemStyle.cornerRadius; + GetColor(ref borderColor, stateStyle.itemStyle.borderColor, ColorUtil.clearColor32, 1, theme, -1); + } } - public static Color32 GetSymbolBorderColor(Serie serie, SerieData serieData, ThemeStyle theme, SerieState state = SerieState.Auto) + public static float GetSysmbolSize(Serie serie, SerieData serieData, ThemeStyle theme, float defaultSize, SerieState state = SerieState.Auto) { - var itemStyle = GetItemStyle(serie, serieData, state); - if (itemStyle != null && !ChartHelper.IsClearColor(itemStyle.borderColor)) return itemStyle.borderColor; - else return serie.itemStyle.borderColor; - } - - public static float[] GetSymbolCornerRadius(Serie serie, SerieData serieData, SerieState state = SerieState.Auto) - { - var itemStyle = GetItemStyle(serie, serieData, state); - if (itemStyle != null) return itemStyle.cornerRadius; - else return null; + if (state == SerieState.Auto) + state = GetSerieState(serie, serieData); + var stateStyle = GetStateStyle(serie, serieData, state); + var size = 0f; + if (stateStyle == null) + { + var symbol = GetSerieSymbol(serie, serieData, SerieState.Normal); + size = symbol.GetSize(serieData.data, defaultSize); + switch (state) + { + case SerieState.Emphasis: + case SerieState.Select: + size *= theme.serie.selectedRate; + break; + default: + break; + } + } + else + { + var symbol = stateStyle.symbol; + size = symbol.GetSize(serieData.data, defaultSize); + } + return size; } public static string GetNumericFormatter(Serie serie, SerieData serieData, string defaultFormatter = null)