From 31f653e3e032d99af05e7b125a108eae3f235877 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Sun, 18 Jul 2021 14:16:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0`Serie`=E7=9A=84`iconStyle`?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E9=85=8D=E7=BD=AE=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG-EN.md | 1 + CHANGELOG.md | 1 + Documentation/XCharts配置项手册.md | 1 + Documentation/xcharts-configuration-EN.md | 1 + Editor/PropertyDrawers/SerieDrawer.cs | 5 +- Runtime/Component/Main/Serie.cs | 66 +++-------------- Runtime/Component/Sub/SerieData.cs | 10 +++ Runtime/Helper/SerieHelper.cs | 6 ++ Runtime/Internal/BaseChart.cs | 7 +- Runtime/Internal/CoordinateChart.cs | 90 ++++++++++++----------- Runtime/Internal/DrawSeriePie.cs | 6 +- Runtime/Internal/DrawSerieRadar.cs | 3 +- 12 files changed, 91 insertions(+), 106 deletions(-) diff --git a/CHANGELOG-EN.md b/CHANGELOG-EN.md index 3d886ab1..2681c5e0 100644 --- a/CHANGELOG-EN.md +++ b/CHANGELOG-EN.md @@ -38,6 +38,7 @@ ## master +* (2021.07.18) Added `iconStyle` for serie * (2021.07.15) Added `MarkLine` (#142) * (2021.07.09) Optimize `BarChart` to set whether to show bars via `seriedata.show` * (2021.07.08) Optimize data storage type from `float` to `double` diff --git a/CHANGELOG.md b/CHANGELOG.md index 22f95dc6..7e4d06e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ ## master +* (2021.07.18) 增加`Serie`的`iconStyle`统一配置图标 * (2021.07.15) 增加`MarkLine`标线 (#142) * (2021.07.09) 优化`BarChart`可通过`serieData.show`设置是否显示柱条 * (2021.07.08) 优化数据存储类型由`float`全部转为`double` diff --git a/Documentation/XCharts配置项手册.md b/Documentation/XCharts配置项手册.md index c9038ecc..88a68084 100644 --- a/Documentation/XCharts配置项手册.md +++ b/Documentation/XCharts配置项手册.md @@ -978,6 +978,7 @@ K线图系列。 * `name`:数据项名称。 * `selected`:该数据项是否被选中。 * `radius`:自定义半径。可用在饼图中自定义某个数据项的半径。 +* `enableIconStyle`: 是否启用单个数据项的图标设置。 * `iconStyle`:数据项图标样式。 * `enableLabel`:是否启用单个数据项的标签设置。 * `label`:单个数据项的标签设置。 diff --git a/Documentation/xcharts-configuration-EN.md b/Documentation/xcharts-configuration-EN.md index 7f634ded..bc8dd542 100644 --- a/Documentation/xcharts-configuration-EN.md +++ b/Documentation/xcharts-configuration-EN.md @@ -872,6 +872,7 @@ K线图系列。 * `name`: 数据项名称。 * `selected`: 该数据项是否被选中。 * `radius`: 自定义半径。可用在饼图中自定义某个数据项的半径。 +* `enableIconStyle`: 是否启用单个数据项的图标设置。 * `iconStyle`: 数据项图标样式。 * `enableLabel`: 是否启用单个数据项的标签设置。 * `label`: 单个数据项的标签设置。 diff --git a/Editor/PropertyDrawers/SerieDrawer.cs b/Editor/PropertyDrawers/SerieDrawer.cs index 14d7aa85..de3a5dd4 100644 --- a/Editor/PropertyDrawers/SerieDrawer.cs +++ b/Editor/PropertyDrawers/SerieDrawer.cs @@ -103,7 +103,7 @@ namespace XCharts PropertyField(prop, "m_ShowAsPositiveNumber"); PropertyField(prop, "m_Large"); PropertyField(prop, "m_LargeThreshold"); - PropertyField(prop, "m_MarkLine"); + PropertyField(prop, "m_MarkLine"); break; case SerieType.Pie: PropertyField(prop, "m_RoseType"); @@ -200,6 +200,7 @@ namespace XCharts break; } PropertyField(prop, "m_ItemStyle"); + PropertyField(prop, "m_IconStyle"); PropertyField(prop, "m_Label"); PropertyField(prop, "m_Emphasis"); PropertyField(prop, "m_Animation"); @@ -400,6 +401,7 @@ namespace XCharts { EditorGUI.indentLevel += 2; var m_Ignore = serieData.FindPropertyRelative("m_Ignore"); + var m_EnableIcon = serieData.FindPropertyRelative("m_EnableIconStyle"); var m_Icon = serieData.FindPropertyRelative("m_IconStyle"); var m_EnableLabel = serieData.FindPropertyRelative("m_EnableLabel"); var m_Label = serieData.FindPropertyRelative("m_Label"); @@ -412,6 +414,7 @@ namespace XCharts EditorGUI.PropertyField(drawRect, m_Ignore); AddHeight(EditorGUI.GetPropertyHeight(m_Ignore)); EditorGUI.PropertyField(drawRect, m_Icon); + ChartEditorHelper.MakeBool(drawRect, m_EnableIcon, 1, "(enable)"); AddHeight(EditorGUI.GetPropertyHeight(m_Icon)); EditorGUI.PropertyField(drawRect, m_Symbol); ChartEditorHelper.MakeBool(drawRect, m_EnableSymbol, 1, "(enable)"); diff --git a/Runtime/Component/Main/Serie.cs b/Runtime/Component/Main/Serie.cs index 0835f782..a120eed4 100644 --- a/Runtime/Component/Main/Serie.cs +++ b/Runtime/Component/Main/Serie.cs @@ -319,6 +319,7 @@ namespace XCharts [SerializeField] private ItemStyle m_ItemStyle = new ItemStyle(); [SerializeField] private Emphasis m_Emphasis = new Emphasis(); [SerializeField] private TitleStyle m_TitleStyle = new TitleStyle(); + [SerializeField] private IconStyle m_IconStyle = new IconStyle(); [SerializeField] private MarkLine m_MarkLine = MarkLine.defaultMarkLine; [SerializeField] [Range(1, 10)] private int m_ShowDataDimension; [SerializeField] private bool m_ShowDataName; @@ -862,6 +863,15 @@ namespace XCharts set { if (PropertyUtil.SetClass(ref m_MarkLine, value, true)) SetAllDirty(); } } /// + /// the icon of data. + /// 数据项图标样式。 + /// + public IconStyle iconStyle + { + get { return m_IconStyle; } + set { if (PropertyUtil.SetClass(ref m_IconStyle, value, true)) SetAllDirty(); } + } + /// /// 数据项里的数据维数。 /// public int showDataDimension { get { return m_ShowDataDimension; } set { m_ShowDataDimension = value; } } @@ -1097,6 +1107,7 @@ namespace XCharts gaugePointer.ClearVerticesDirty(); titleStyle.ClearVerticesDirty(); markLine.ClearVerticesDirty(); + iconStyle.ClearVerticesDirty(); } public override void ClearComponentDirty() @@ -1113,6 +1124,7 @@ namespace XCharts gaugePointer.ClearComponentDirty(); titleStyle.ClearComponentDirty(); markLine.ClearComponentDirty(); + iconStyle.ClearComponentDirty(); } /// @@ -1789,60 +1801,6 @@ namespace XCharts else return m_BarWidth * categoryWidth; } - /// - /// 设置所有数据的图标是否显示 - /// - /// - public void SetDataIconActive(bool flag) - { - foreach (var data in m_Data) - { - data.iconStyle.show = flag; - } - } - - /// - /// 设置指定index的数据图标是否显示 - /// - /// - /// - public void SetDataIconActive(int dataIndex, bool flag) - { - if (dataIndex >= 0 && dataIndex < m_Data.Count) - { - var data = m_Data[dataIndex]; - data.iconStyle.show = flag; - } - } - - /// - /// 统一设置图标的尺寸 - /// - /// - /// - public void SetDataIconSize(float width, float height) - { - foreach (var data in m_Data) - { - data.iconStyle.width = width; - data.iconStyle.height = height; - } - } - - /// - /// 设置指定index的数据图标的图片 - /// - /// - /// - public void SetDataIcon(int dataIndex, Sprite image) - { - if (dataIndex >= 0 && dataIndex < m_Data.Count) - { - var data = m_Data[dataIndex]; - data.iconStyle.sprite = image; - } - } - public bool IsIgnoreIndex(int index, int dimension = 1) { var serieData = GetSerieData(index); diff --git a/Runtime/Component/Sub/SerieData.cs b/Runtime/Component/Sub/SerieData.cs index 594cc659..d206589c 100644 --- a/Runtime/Component/Sub/SerieData.cs +++ b/Runtime/Component/Sub/SerieData.cs @@ -21,6 +21,7 @@ namespace XCharts [SerializeField] private bool m_Selected; [SerializeField] private bool m_Ignore = false; [SerializeField] private float m_Radius; + [SerializeField] private bool m_EnableIconStyle = false; [SerializeField] private IconStyle m_IconStyle = new IconStyle(); [SerializeField] private bool m_EnableLabel = false; [SerializeField] private SerieLabel m_Label = new SerieLabel(); @@ -58,6 +59,10 @@ namespace XCharts /// public bool selected { get { return m_Selected; } set { m_Selected = value; } } /// + /// 是否启用单个数据项的图标设置。 + /// + public bool enableIconStyle { get { return m_EnableIconStyle; } set { m_EnableIconStyle = value; } } + /// /// the icon of data. /// 数据项图标样式。 /// @@ -185,6 +190,7 @@ namespace XCharts m_Show = true; m_Selected = false; m_CanShowLabel = true; + m_EnableIconStyle = false; m_EnableSymbol = false; m_EnableLabel = false; m_EnableEmphasis = false; @@ -381,6 +387,10 @@ namespace XCharts { if (labelObject != null) labelObject.SetLabelActive(flag); } + public void SetIconActive(bool flag) + { + if (labelObject != null) labelObject.SetIconActive(flag); + } public void SetPolygon(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4) { diff --git a/Runtime/Helper/SerieHelper.cs b/Runtime/Helper/SerieHelper.cs index 1856a03d..99d6b966 100644 --- a/Runtime/Helper/SerieHelper.cs +++ b/Runtime/Helper/SerieHelper.cs @@ -419,6 +419,12 @@ namespace XCharts } } + public static IconStyle GetIconStyle(Serie serie, SerieData serieData) + { + if(serieData.enableIconStyle) return serieData.iconStyle; + else return serie.iconStyle; + } + public static SerieSymbol GetSerieSymbol(Serie serie, SerieData serieData) { if (!serie.IsPerformanceMode() && serieData.enableSymbol) return serieData.symbol; diff --git a/Runtime/Internal/BaseChart.cs b/Runtime/Internal/BaseChart.cs index 746b1119..8e8f63c9 100644 --- a/Runtime/Internal/BaseChart.cs +++ b/Runtime/Internal/BaseChart.cs @@ -540,8 +540,9 @@ namespace XCharts if (m_SerieLabelRoot == null) return; if (count == -1) count = serie.dataCount; var serieLabel = SerieHelper.GetSerieLabel(serie, serieData); + var iconStyle = SerieHelper.GetIconStyle(serie, serieData); if (serie.IsPerformanceMode()) return; - if (!serieLabel.show) return; + if (!serieLabel.show && !iconStyle.show) return; var textName = ChartCached.GetSerieLabelName(s_SerieLabelObjectName, serie.index, serieData.index); var color = Color.grey; if (serie.type == SerieType.Pie) @@ -555,13 +556,13 @@ namespace XCharts (Color)m_Theme.GetColor(serie.index); } var labelObj = SerieLabelPool.Get(textName, m_SerieLabelRoot.transform, serieLabel, color, - serieData.iconStyle.width, serieData.iconStyle.height, theme); + iconStyle.width, iconStyle.height, theme); var iconImage = labelObj.transform.Find("Icon").GetComponent(); var isAutoSize = serieLabel.backgroundWidth == 0 || serieLabel.backgroundHeight == 0; var item = new ChartLabel(); item.SetLabel(labelObj, isAutoSize, serieLabel.paddingLeftRight, serieLabel.paddingTopBottom); item.SetIcon(iconImage); - item.SetIconActive(false); + item.SetIconActive(iconStyle.show); serieData.labelObject = item; } diff --git a/Runtime/Internal/CoordinateChart.cs b/Runtime/Internal/CoordinateChart.cs index 9f543288..94f589b0 100644 --- a/Runtime/Internal/CoordinateChart.cs +++ b/Runtime/Internal/CoordinateChart.cs @@ -1471,7 +1471,7 @@ namespace XCharts if (serieData.labelObject == null) continue; var serieLabel = SerieHelper.GetSerieLabel(serie, serieData, serieData.highlighted); serieData.index = j; - if ((serieLabel.show || serieData.iconStyle.show) && j < serie.dataPoints.Count) + if (serieLabel.show && j < serie.dataPoints.Count) { var pos = serie.dataPoints[j]; @@ -1482,48 +1482,8 @@ namespace XCharts } else { - var value = serieData.data[1]; - switch (serie.type) - { - case SerieType.Line: - break; - case SerieType.Bar: - var zeroPos = Vector3.zero; - var lastStackSerie = SeriesHelper.GetLastStackSerie(m_Series, n); - if (serie.type == SerieType.Bar) - { - if (serieLabel.position == SerieLabel.Position.Bottom || serieLabel.position == SerieLabel.Position.Center) - { - if (isYAxis) - { - var xAxis = m_XAxes[serie.xAxisIndex]; - var grid = GetAxisGridOrDefault(xAxis); - zeroPos = new Vector3(grid.runtimeX + xAxis.runtimeZeroXOffset, grid.runtimeY); - } - else - { - var yAxis = m_YAxes[serie.yAxisIndex]; - var grid = GetAxisGridOrDefault(yAxis); - zeroPos = new Vector3(grid.runtimeX, grid.runtimeY + yAxis.runtimeZeroYOffset); - } - } - } - var bottomPos = lastStackSerie == null ? zeroPos : lastStackSerie.dataPoints[j]; - switch (serieLabel.position) - { - case SerieLabel.Position.Center: - - pos = isYAxis ? new Vector3(bottomPos.x + (pos.x - bottomPos.x) / 2, pos.y) : - new Vector3(pos.x, bottomPos.y + (pos.y - bottomPos.y) / 2); - break; - case SerieLabel.Position.Bottom: - pos = isYAxis ? new Vector3(bottomPos.x, pos.y) : new Vector3(pos.x, bottomPos.y); - break; - } - break; - } + Internal_RefreshLabelPosition(serie, serieData, serieLabel, pos, serie.type == SerieType.Bar, isYAxis); m_RefreshLabel = true; - serieData.labelPosition = pos; if (serieLabel.show) DrawLabelBackground(vh, serie, serieData); } } @@ -1535,10 +1495,50 @@ namespace XCharts } } + public void Internal_RefreshLabelPosition(Serie serie, SerieData serieData, SerieLabel serieLabel, Vector3 pos, bool IsNeedCheckPosition, bool isYAxis) + { + if (IsNeedCheckPosition) + { + var value = serieData.data[1]; + var zeroPos = Vector3.zero; + var lastStackSerie = SeriesHelper.GetLastStackSerie(m_Series, serie.index); + if (serieLabel.position == SerieLabel.Position.Bottom || serieLabel.position == SerieLabel.Position.Center) + { + if (isYAxis) + { + var xAxis = m_XAxes[serie.xAxisIndex]; + var grid = GetAxisGridOrDefault(xAxis); + zeroPos = new Vector3(grid.runtimeX + xAxis.runtimeZeroXOffset, grid.runtimeY); + } + else + { + var yAxis = m_YAxes[serie.yAxisIndex]; + var grid = GetAxisGridOrDefault(yAxis); + zeroPos = new Vector3(grid.runtimeX, grid.runtimeY + yAxis.runtimeZeroYOffset); + } + } + var bottomPos = lastStackSerie == null ? zeroPos : lastStackSerie.dataPoints[serieData.index]; + switch (serieLabel.position) + { + case SerieLabel.Position.Center: + + pos = isYAxis ? new Vector3(bottomPos.x + (pos.x - bottomPos.x) / 2, pos.y) : + new Vector3(pos.x, bottomPos.y + (pos.y - bottomPos.y) / 2); + break; + case SerieLabel.Position.Bottom: + pos = isYAxis ? new Vector3(bottomPos.x, pos.y) : new Vector3(pos.x, bottomPos.y); + break; + } + } + serieData.labelPosition = pos; + } + protected override void OnRefreshLabel() { base.OnRefreshLabel(); + var isYAxis = IsAnyYAxisIsCategory(); var anyPercentStack = SeriesHelper.IsPercentStack(m_Series, SerieType.Bar); + for (int i = 0; i < m_Series.Count; i++) { var serie = m_Series.GetSerie(i); @@ -1546,7 +1546,6 @@ namespace XCharts if (!serie.IsCoordinateSerie()) continue; var total = serie.yTotal; var isPercentStack = SeriesHelper.IsPercentStack(m_Series, serie.stack, SerieType.Bar); - for (int j = 0; j < serie.data.Count; j++) { var serieData = serie.data[j]; @@ -1554,14 +1553,17 @@ namespace XCharts if (j >= serie.dataPoints.Count) { serieData.SetLabelActive(false); + serieData.SetIconActive(false); continue; } var pos = serie.dataPoints[j]; var serieLabel = SerieHelper.GetSerieLabel(serie, serieData); + var iconStyle = SerieHelper.GetIconStyle(serie, serieData); var dimension = 1; var isIgnore = serie.IsIgnoreIndex(j); + Internal_RefreshLabelPosition(serie, serieData, serieLabel, pos, serie.type == SerieType.Bar, isYAxis); serieData.labelObject.SetPosition(serieData.labelPosition); - serieData.labelObject.UpdateIcon(serieData.iconStyle); + serieData.labelObject.UpdateIcon(iconStyle); if (serie.show && serieLabel.show && serieData.canShowLabel && !isIgnore) { double value = 0; diff --git a/Runtime/Internal/DrawSeriePie.cs b/Runtime/Internal/DrawSeriePie.cs index f5e80d09..3c3e37d4 100644 --- a/Runtime/Internal/DrawSeriePie.cs +++ b/Runtime/Internal/DrawSeriePie.cs @@ -499,9 +499,9 @@ namespace XCharts var currAngle = serieData.runtimePieHalfAngle; var isHighlight = (serieData.highlighted && serie.emphasis.label.show); var serieLabel = SerieHelper.GetSerieLabel(serie, serieData); + var iconStyle = SerieHelper.GetIconStyle(serie, serieData); var showLabel = ((serieLabel.show || isHighlight) && serieData.canShowLabel); - - if (showLabel || serieData.iconStyle.show) + if (showLabel) { serieData.SetLabelActive(showLabel); float rotate = 0; @@ -558,7 +558,7 @@ namespace XCharts { serieData.SetLabelActive(false); } - serieData.labelObject.UpdateIcon(serieData.iconStyle); + serieData.labelObject.UpdateIcon(iconStyle); } protected int GetPiePosIndex(Serie serie, Vector2 local) diff --git a/Runtime/Internal/DrawSerieRadar.cs b/Runtime/Internal/DrawSerieRadar.cs index aa5c3fca..bc607be6 100644 --- a/Runtime/Internal/DrawSerieRadar.cs +++ b/Runtime/Internal/DrawSerieRadar.cs @@ -88,13 +88,14 @@ namespace XCharts var serieData = serie.data[n]; if (serieData.labelObject == null) continue; var serieLabel = SerieHelper.GetSerieLabel(serie, serieData); + var iconStyle = SerieHelper.GetIconStyle(serie, serieData); var labelPos = serieData.labelPosition; if (serieLabel.margin != 0) { labelPos += serieLabel.margin * (labelPos - center).normalized; } serieData.labelObject.SetPosition(labelPos); - serieData.labelObject.UpdateIcon(serieData.iconStyle); + serieData.labelObject.UpdateIcon(iconStyle); if (serie.show && serieLabel.show && serieData.canShowLabel) { var value = serieData.GetCurrData(1);