From a5e13794e805f7df1d2d4cc488e1b913c3bdc778 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Wed, 7 Sep 2022 07:14:22 +0800 Subject: [PATCH] [feature][symbol] add `minSize` and `maxSize` for SerieSymbol --- CHANGELOG.md | 3 +- Documentation/XChartsConfiguration-EN.md | 2 + Documentation/XChartsConfiguration-ZH.md | 2 + Editor/ChildComponents/SerieSymbolDrawer.cs | 2 + Runtime/Component/Child/SerieSymbl.cs | 28 ++++++++++++- Runtime/Serie/Heatmap/HeatmapHandler.cs | 46 ++++++++++++++++----- 6 files changed, 71 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fce9944..21e7e268 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,7 +58,8 @@ ## master -* (2022.09.06) 增加`AxisSplitLine`的`showStartLine`和`showEndLine`参数 +* (2022.09.06) 增加`SerieSymbol`的`minSize`和`maxSize`参数设置最大最小尺寸的支持 +* (2022.09.06) 增加`AxisSplitLine`的`showStartLine`和`showEndLine`参数设置是否显示首位分割线的支持 * (2022.09.06) 增加`Heatmap`通过`symbol`设置不同的图案的支持 * (2022.09.05) 增加`Heatmap`的`heatmapType`支持设置`Data`和`Count`两种不同映射方式的热力图 * (2022.09.05) 优化`Tooltip`在热力图为数值轴时的指示 diff --git a/Documentation/XChartsConfiguration-EN.md b/Documentation/XChartsConfiguration-EN.md index ab523e2d..676e15dd 100644 --- a/Documentation/XChartsConfiguration-EN.md +++ b/Documentation/XChartsConfiguration-EN.md @@ -1174,6 +1174,8 @@ Inherits or Implemented: [SymbolStyle](#SymbolStyle),[ISerieDataComponent](#ISer |`interval`|||the interval of show symbol. |`forceShowLast`|false||whether to show the last symbol. |`repeat`|false||图形是否重复。 +|`minSize`|0f|v3.3.0|Minimum symbol size. +|`maxSize`|0f|v3.3.0|Maximum symbol size. ## `SerieTheme` diff --git a/Documentation/XChartsConfiguration-ZH.md b/Documentation/XChartsConfiguration-ZH.md index 7fe54734..8abb88b2 100644 --- a/Documentation/XChartsConfiguration-ZH.md +++ b/Documentation/XChartsConfiguration-ZH.md @@ -1174,6 +1174,8 @@ Inherits or Implemented: [SymbolStyle](#SymbolStyle),[ISerieDataComponent](#ISer |`interval`|||显示图形标记的间隔。0表示显示所有标签,1表示隔一个隔显示一个标签,以此类推。 |`forceShowLast`|false||是否强制显示最后一个图形标记。 |`repeat`|false||图形是否重复。 +|`minSize`|0f|v3.3.0|图形最小尺寸。只在sizeType为SymbolSizeType.FromData时有效。 +|`maxSize`|0f|v3.3.0|图形最大尺寸。只在sizeType为SymbolSizeType.FromData时有效。 ## `SerieTheme` diff --git a/Editor/ChildComponents/SerieSymbolDrawer.cs b/Editor/ChildComponents/SerieSymbolDrawer.cs index 23639c5b..31a132e4 100644 --- a/Editor/ChildComponents/SerieSymbolDrawer.cs +++ b/Editor/ChildComponents/SerieSymbolDrawer.cs @@ -35,6 +35,8 @@ namespace XCharts.Editor case SymbolSizeType.FromData: PropertyField(prop, "m_DataIndex"); PropertyField(prop, "m_DataScale"); + PropertyField(prop, "m_MinSize"); + PropertyField(prop, "m_MaxSize"); break; case SymbolSizeType.Function: break; diff --git a/Runtime/Component/Child/SerieSymbl.cs b/Runtime/Component/Child/SerieSymbl.cs index 7cdc1013..c31c5bd5 100644 --- a/Runtime/Component/Child/SerieSymbl.cs +++ b/Runtime/Component/Child/SerieSymbl.cs @@ -41,6 +41,8 @@ namespace XCharts.Runtime [SerializeField] private int m_Interval; [SerializeField] private bool m_ForceShowLast = false; [SerializeField] private bool m_Repeat = false; + [SerializeField][Since("v3.3.0")] private float m_MinSize = 0f; + [SerializeField][Since("v3.3.0")] private float m_MaxSize = 0f; public override void Reset() { @@ -53,6 +55,8 @@ namespace XCharts.Runtime m_Interval = 0; m_ForceShowLast = false; m_Repeat = false; + m_MinSize = 0f; + m_MaxSize = 0f; } /// @@ -126,6 +130,25 @@ namespace XCharts.Runtime get { return m_Repeat; } set { if (PropertyUtil.SetStruct(ref m_Repeat, value)) SetAllDirty(); } } + /// + /// Minimum symbol size. + /// |图形最小尺寸。只在sizeType为SymbolSizeType.FromData时有效。 + /// + public float minSize + { + get { return m_MinSize; } + set { if (PropertyUtil.SetStruct(ref m_MinSize, value)) SetVerticesDirty(); } + } + /// + /// Maximum symbol size. + /// |图形最大尺寸。只在sizeType为SymbolSizeType.FromData时有效。 + /// + public float maxSize + { + get { return m_MaxSize; } + set { if (PropertyUtil.SetStruct(ref m_MaxSize, value)) SetVerticesDirty(); } + } + /// /// 根据指定的sizeType获得标记的大小 /// @@ -140,7 +163,10 @@ namespace XCharts.Runtime case SymbolSizeType.FromData: if (data != null && dataIndex >= 0 && dataIndex < data.Count) { - return (float) data[dataIndex] * m_DataScale; + var value = (float) data[dataIndex] * m_DataScale; + if (m_MinSize != 0 && value < m_MinSize) value = m_MinSize; + if (m_MaxSize != 0 && value > m_MaxSize) value = m_MaxSize; + return value; } else { diff --git a/Runtime/Serie/Heatmap/HeatmapHandler.cs b/Runtime/Serie/Heatmap/HeatmapHandler.cs index 83a553ef..648b37e1 100644 --- a/Runtime/Serie/Heatmap/HeatmapHandler.cs +++ b/Runtime/Serie/Heatmap/HeatmapHandler.cs @@ -187,9 +187,9 @@ namespace XCharts.Runtime var zeroX = m_SerieGrid.context.x; var zeroY = m_SerieGrid.context.y; var borderWidth = serie.itemStyle.show ? serie.itemStyle.borderWidth : 0; - var rectWid = xWidth - 2 * borderWidth; - var rectHig = yWidth - 2 * borderWidth; - var defaultSymbolSize = Mathf.Min(rectWid, rectHig) * 0.25f; + var splitWid = xWidth - 2 * borderWidth; + var splitHig = yWidth - 2 * borderWidth; + var defaultSymbolSize = Mathf.Min(splitWid, splitHig) * 0.25f; serie.animation.InitProgress(0, xCount); var animationIndex = serie.animation.GetCurrIndex(); @@ -237,9 +237,8 @@ namespace XCharts.Runtime serie.context.dataPoints.Add(pos); serie.context.dataIndexs.Add(serieData.index); serieData.context.position = pos; - serieData.context.canShowLabel = false; - serieData.context.rect = new Rect(pos.x - rectWid / 2, pos.y - rectHig / 2, rectWid, rectHig); + if ((value < rangeMin && rangeMin != visualMap.min) || (value > rangeMax && rangeMax != visualMap.max)) { @@ -256,9 +255,22 @@ namespace XCharts.Runtime var highlight = (serieData.context.highlight) || visualMap.context.pointerIndex > 0; - + var rectWid = 0f; + var rectHig = 0f; if (isRectSymbol) { + if (symbol.size == 0 && symbol.sizeType == SymbolSizeType.Custom) + { + rectWid = splitWid; + rectHig = splitHig; + } + else + { + var symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, defaultSymbolSize, state); + rectWid = symbolSize; + rectHig = symbolSize; + } + serieData.context.rect = new Rect(pos.x - rectWid / 2, pos.y - rectHig / 2, rectWid, rectHig); UGL.DrawRectangle(vh, serieData.context.rect, color); if (borderWidth > 0 && !ChartHelper.IsClearColor(borderColor)) @@ -270,6 +282,7 @@ namespace XCharts.Runtime { var symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, defaultSymbolSize, state); var emptyColor = SerieHelper.GetItemBackgroundColor(serie, serieData, chart.theme, serie.context.colorIndex, state); + serieData.context.rect = new Rect(pos.x - symbolSize / 2, pos.y - symbolSize / 2, symbolSize, symbolSize); chart.DrawSymbol(vh, symbol.type, symbolSize, symbolBorder, pos, color, color, emptyColor, borderColor, symbol.gap, cornerRadius); } @@ -319,9 +332,9 @@ namespace XCharts.Runtime var zeroX = m_SerieGrid.context.x; var zeroY = m_SerieGrid.context.y; var borderWidth = serie.itemStyle.show ? serie.itemStyle.borderWidth : 0; - var rectWid = xWidth - 2 * borderWidth; - var rectHig = yWidth - 2 * borderWidth; - var defaultSymbolSize = Mathf.Min(rectWid, rectHig) * 0.25f; + var splitWid = xWidth - 2 * borderWidth; + var splitHig = yWidth - 2 * borderWidth; + var defaultSymbolSize = Mathf.Min(splitWid, splitHig) * 0.25f; serie.animation.InitProgress(0, xCount); var animationIndex = serie.animation.GetCurrIndex(); @@ -403,9 +416,22 @@ namespace XCharts.Runtime var pos = new Vector3(zeroX + (i + 0.5f) * xWidth, zeroY + (j + 0.5f) * yWidth); - var rect = new Rect(pos.x - rectWid / 2, pos.y - rectHig / 2, rectWid, rectHig); + + var rectWid = 0f; + var rectHig = 0f; if (isRectSymbol) { + if (symbol.size == 0 && symbol.sizeType == SymbolSizeType.Custom) + { + rectWid = splitWid; + rectHig = splitHig; + } + else + { + rectWid = symbolSize; + rectHig = symbolSize; + } + var rect = new Rect(pos.x - rectWid / 2, pos.y - rectHig / 2, rectWid, rectHig); UGL.DrawRectangle(vh, rect, color); if (borderWidth > 0 && !ChartHelper.IsClearColor(borderColor))