增加SerieiconStyle统一配置图标

This commit is contained in:
monitor1394
2021-07-18 14:16:06 +08:00
parent 012f6ccb52
commit 31f653e3e0
12 changed files with 91 additions and 106 deletions

View File

@@ -38,6 +38,7 @@
## master ## master
* (2021.07.18) Added `iconStyle` for serie
* (2021.07.15) Added `MarkLine` (#142) * (2021.07.15) Added `MarkLine` (#142)
* (2021.07.09) Optimize `BarChart` to set whether to show bars via `seriedata.show` * (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` * (2021.07.08) Optimize data storage type from `float` to `double`

View File

@@ -38,6 +38,7 @@
## master ## master
* (2021.07.18) 增加`Serie``iconStyle`统一配置图标
* (2021.07.15) 增加`MarkLine`标线 (#142) * (2021.07.15) 增加`MarkLine`标线 (#142)
* (2021.07.09) 优化`BarChart`可通过`serieData.show`设置是否显示柱条 * (2021.07.09) 优化`BarChart`可通过`serieData.show`设置是否显示柱条
* (2021.07.08) 优化数据存储类型由`float`全部转为`double` * (2021.07.08) 优化数据存储类型由`float`全部转为`double`

View File

@@ -978,6 +978,7 @@ K线图系列。
* `name`:数据项名称。 * `name`:数据项名称。
* `selected`:该数据项是否被选中。 * `selected`:该数据项是否被选中。
* `radius`:自定义半径。可用在饼图中自定义某个数据项的半径。 * `radius`:自定义半径。可用在饼图中自定义某个数据项的半径。
* `enableIconStyle`: 是否启用单个数据项的图标设置。
* `iconStyle`:数据项图标样式。 * `iconStyle`:数据项图标样式。
* `enableLabel`:是否启用单个数据项的标签设置。 * `enableLabel`:是否启用单个数据项的标签设置。
* `label`:单个数据项的标签设置。 * `label`:单个数据项的标签设置。

View File

@@ -872,6 +872,7 @@ K线图系列。
* `name`: 数据项名称。 * `name`: 数据项名称。
* `selected`: 该数据项是否被选中。 * `selected`: 该数据项是否被选中。
* `radius`: 自定义半径。可用在饼图中自定义某个数据项的半径。 * `radius`: 自定义半径。可用在饼图中自定义某个数据项的半径。
* `enableIconStyle`: 是否启用单个数据项的图标设置。
* `iconStyle`: 数据项图标样式。 * `iconStyle`: 数据项图标样式。
* `enableLabel`: 是否启用单个数据项的标签设置。 * `enableLabel`: 是否启用单个数据项的标签设置。
* `label`: 单个数据项的标签设置。 * `label`: 单个数据项的标签设置。

View File

@@ -103,7 +103,7 @@ namespace XCharts
PropertyField(prop, "m_ShowAsPositiveNumber"); PropertyField(prop, "m_ShowAsPositiveNumber");
PropertyField(prop, "m_Large"); PropertyField(prop, "m_Large");
PropertyField(prop, "m_LargeThreshold"); PropertyField(prop, "m_LargeThreshold");
PropertyField(prop, "m_MarkLine"); PropertyField(prop, "m_MarkLine");
break; break;
case SerieType.Pie: case SerieType.Pie:
PropertyField(prop, "m_RoseType"); PropertyField(prop, "m_RoseType");
@@ -200,6 +200,7 @@ namespace XCharts
break; break;
} }
PropertyField(prop, "m_ItemStyle"); PropertyField(prop, "m_ItemStyle");
PropertyField(prop, "m_IconStyle");
PropertyField(prop, "m_Label"); PropertyField(prop, "m_Label");
PropertyField(prop, "m_Emphasis"); PropertyField(prop, "m_Emphasis");
PropertyField(prop, "m_Animation"); PropertyField(prop, "m_Animation");
@@ -400,6 +401,7 @@ namespace XCharts
{ {
EditorGUI.indentLevel += 2; EditorGUI.indentLevel += 2;
var m_Ignore = serieData.FindPropertyRelative("m_Ignore"); var m_Ignore = serieData.FindPropertyRelative("m_Ignore");
var m_EnableIcon = serieData.FindPropertyRelative("m_EnableIconStyle");
var m_Icon = serieData.FindPropertyRelative("m_IconStyle"); var m_Icon = serieData.FindPropertyRelative("m_IconStyle");
var m_EnableLabel = serieData.FindPropertyRelative("m_EnableLabel"); var m_EnableLabel = serieData.FindPropertyRelative("m_EnableLabel");
var m_Label = serieData.FindPropertyRelative("m_Label"); var m_Label = serieData.FindPropertyRelative("m_Label");
@@ -412,6 +414,7 @@ namespace XCharts
EditorGUI.PropertyField(drawRect, m_Ignore); EditorGUI.PropertyField(drawRect, m_Ignore);
AddHeight(EditorGUI.GetPropertyHeight(m_Ignore)); AddHeight(EditorGUI.GetPropertyHeight(m_Ignore));
EditorGUI.PropertyField(drawRect, m_Icon); EditorGUI.PropertyField(drawRect, m_Icon);
ChartEditorHelper.MakeBool(drawRect, m_EnableIcon, 1, "(enable)");
AddHeight(EditorGUI.GetPropertyHeight(m_Icon)); AddHeight(EditorGUI.GetPropertyHeight(m_Icon));
EditorGUI.PropertyField(drawRect, m_Symbol); EditorGUI.PropertyField(drawRect, m_Symbol);
ChartEditorHelper.MakeBool(drawRect, m_EnableSymbol, 1, "(enable)"); ChartEditorHelper.MakeBool(drawRect, m_EnableSymbol, 1, "(enable)");

View File

@@ -319,6 +319,7 @@ namespace XCharts
[SerializeField] private ItemStyle m_ItemStyle = new ItemStyle(); [SerializeField] private ItemStyle m_ItemStyle = new ItemStyle();
[SerializeField] private Emphasis m_Emphasis = new Emphasis(); [SerializeField] private Emphasis m_Emphasis = new Emphasis();
[SerializeField] private TitleStyle m_TitleStyle = new TitleStyle(); [SerializeField] private TitleStyle m_TitleStyle = new TitleStyle();
[SerializeField] private IconStyle m_IconStyle = new IconStyle();
[SerializeField] private MarkLine m_MarkLine = MarkLine.defaultMarkLine; [SerializeField] private MarkLine m_MarkLine = MarkLine.defaultMarkLine;
[SerializeField] [Range(1, 10)] private int m_ShowDataDimension; [SerializeField] [Range(1, 10)] private int m_ShowDataDimension;
[SerializeField] private bool m_ShowDataName; [SerializeField] private bool m_ShowDataName;
@@ -862,6 +863,15 @@ namespace XCharts
set { if (PropertyUtil.SetClass(ref m_MarkLine, value, true)) SetAllDirty(); } set { if (PropertyUtil.SetClass(ref m_MarkLine, value, true)) SetAllDirty(); }
} }
/// <summary> /// <summary>
/// the icon of data.
/// 数据项图标样式。
/// </summary>
public IconStyle iconStyle
{
get { return m_IconStyle; }
set { if (PropertyUtil.SetClass(ref m_IconStyle, value, true)) SetAllDirty(); }
}
/// <summary>
/// 数据项里的数据维数。 /// 数据项里的数据维数。
/// </summary> /// </summary>
public int showDataDimension { get { return m_ShowDataDimension; } set { m_ShowDataDimension = value; } } public int showDataDimension { get { return m_ShowDataDimension; } set { m_ShowDataDimension = value; } }
@@ -1097,6 +1107,7 @@ namespace XCharts
gaugePointer.ClearVerticesDirty(); gaugePointer.ClearVerticesDirty();
titleStyle.ClearVerticesDirty(); titleStyle.ClearVerticesDirty();
markLine.ClearVerticesDirty(); markLine.ClearVerticesDirty();
iconStyle.ClearVerticesDirty();
} }
public override void ClearComponentDirty() public override void ClearComponentDirty()
@@ -1113,6 +1124,7 @@ namespace XCharts
gaugePointer.ClearComponentDirty(); gaugePointer.ClearComponentDirty();
titleStyle.ClearComponentDirty(); titleStyle.ClearComponentDirty();
markLine.ClearComponentDirty(); markLine.ClearComponentDirty();
iconStyle.ClearComponentDirty();
} }
/// <summary> /// <summary>
@@ -1789,60 +1801,6 @@ namespace XCharts
else return m_BarWidth * categoryWidth; else return m_BarWidth * categoryWidth;
} }
/// <summary>
/// 设置所有数据的图标是否显示
/// </summary>
/// <param name="flag"></param>
public void SetDataIconActive(bool flag)
{
foreach (var data in m_Data)
{
data.iconStyle.show = flag;
}
}
/// <summary>
/// 设置指定index的数据图标是否显示
/// </summary>
/// <param name="dataIndex"></param>
/// <param name="flag"></param>
public void SetDataIconActive(int dataIndex, bool flag)
{
if (dataIndex >= 0 && dataIndex < m_Data.Count)
{
var data = m_Data[dataIndex];
data.iconStyle.show = flag;
}
}
/// <summary>
/// 统一设置图标的尺寸
/// </summary>
/// <param name="width"></param>
/// <param name="height"></param>
public void SetDataIconSize(float width, float height)
{
foreach (var data in m_Data)
{
data.iconStyle.width = width;
data.iconStyle.height = height;
}
}
/// <summary>
/// 设置指定index的数据图标的图片
/// </summary>
/// <param name="dataIndex"></param>
/// <param name="image"></param>
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) public bool IsIgnoreIndex(int index, int dimension = 1)
{ {
var serieData = GetSerieData(index); var serieData = GetSerieData(index);

View File

@@ -21,6 +21,7 @@ namespace XCharts
[SerializeField] private bool m_Selected; [SerializeField] private bool m_Selected;
[SerializeField] private bool m_Ignore = false; [SerializeField] private bool m_Ignore = false;
[SerializeField] private float m_Radius; [SerializeField] private float m_Radius;
[SerializeField] private bool m_EnableIconStyle = false;
[SerializeField] private IconStyle m_IconStyle = new IconStyle(); [SerializeField] private IconStyle m_IconStyle = new IconStyle();
[SerializeField] private bool m_EnableLabel = false; [SerializeField] private bool m_EnableLabel = false;
[SerializeField] private SerieLabel m_Label = new SerieLabel(); [SerializeField] private SerieLabel m_Label = new SerieLabel();
@@ -58,6 +59,10 @@ namespace XCharts
/// </summary> /// </summary>
public bool selected { get { return m_Selected; } set { m_Selected = value; } } public bool selected { get { return m_Selected; } set { m_Selected = value; } }
/// <summary> /// <summary>
/// 是否启用单个数据项的图标设置。
/// </summary>
public bool enableIconStyle { get { return m_EnableIconStyle; } set { m_EnableIconStyle = value; } }
/// <summary>
/// the icon of data. /// the icon of data.
/// 数据项图标样式。 /// 数据项图标样式。
/// </summary> /// </summary>
@@ -185,6 +190,7 @@ namespace XCharts
m_Show = true; m_Show = true;
m_Selected = false; m_Selected = false;
m_CanShowLabel = true; m_CanShowLabel = true;
m_EnableIconStyle = false;
m_EnableSymbol = false; m_EnableSymbol = false;
m_EnableLabel = false; m_EnableLabel = false;
m_EnableEmphasis = false; m_EnableEmphasis = false;
@@ -381,6 +387,10 @@ namespace XCharts
{ {
if (labelObject != null) labelObject.SetLabelActive(flag); 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) public void SetPolygon(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4)
{ {

View File

@@ -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) public static SerieSymbol GetSerieSymbol(Serie serie, SerieData serieData)
{ {
if (!serie.IsPerformanceMode() && serieData.enableSymbol) return serieData.symbol; if (!serie.IsPerformanceMode() && serieData.enableSymbol) return serieData.symbol;

View File

@@ -540,8 +540,9 @@ namespace XCharts
if (m_SerieLabelRoot == null) return; if (m_SerieLabelRoot == null) return;
if (count == -1) count = serie.dataCount; if (count == -1) count = serie.dataCount;
var serieLabel = SerieHelper.GetSerieLabel(serie, serieData); var serieLabel = SerieHelper.GetSerieLabel(serie, serieData);
var iconStyle = SerieHelper.GetIconStyle(serie, serieData);
if (serie.IsPerformanceMode()) return; 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 textName = ChartCached.GetSerieLabelName(s_SerieLabelObjectName, serie.index, serieData.index);
var color = Color.grey; var color = Color.grey;
if (serie.type == SerieType.Pie) if (serie.type == SerieType.Pie)
@@ -555,13 +556,13 @@ namespace XCharts
(Color)m_Theme.GetColor(serie.index); (Color)m_Theme.GetColor(serie.index);
} }
var labelObj = SerieLabelPool.Get(textName, m_SerieLabelRoot.transform, serieLabel, color, 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<Image>(); var iconImage = labelObj.transform.Find("Icon").GetComponent<Image>();
var isAutoSize = serieLabel.backgroundWidth == 0 || serieLabel.backgroundHeight == 0; var isAutoSize = serieLabel.backgroundWidth == 0 || serieLabel.backgroundHeight == 0;
var item = new ChartLabel(); var item = new ChartLabel();
item.SetLabel(labelObj, isAutoSize, serieLabel.paddingLeftRight, serieLabel.paddingTopBottom); item.SetLabel(labelObj, isAutoSize, serieLabel.paddingLeftRight, serieLabel.paddingTopBottom);
item.SetIcon(iconImage); item.SetIcon(iconImage);
item.SetIconActive(false); item.SetIconActive(iconStyle.show);
serieData.labelObject = item; serieData.labelObject = item;
} }

View File

@@ -1471,7 +1471,7 @@ namespace XCharts
if (serieData.labelObject == null) continue; if (serieData.labelObject == null) continue;
var serieLabel = SerieHelper.GetSerieLabel(serie, serieData, serieData.highlighted); var serieLabel = SerieHelper.GetSerieLabel(serie, serieData, serieData.highlighted);
serieData.index = j; 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]; var pos = serie.dataPoints[j];
@@ -1482,48 +1482,8 @@ namespace XCharts
} }
else else
{ {
var value = serieData.data[1]; Internal_RefreshLabelPosition(serie, serieData, serieLabel, pos, serie.type == SerieType.Bar, isYAxis);
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;
}
m_RefreshLabel = true; m_RefreshLabel = true;
serieData.labelPosition = pos;
if (serieLabel.show) DrawLabelBackground(vh, serie, serieData); 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() protected override void OnRefreshLabel()
{ {
base.OnRefreshLabel(); base.OnRefreshLabel();
var isYAxis = IsAnyYAxisIsCategory();
var anyPercentStack = SeriesHelper.IsPercentStack(m_Series, SerieType.Bar); var anyPercentStack = SeriesHelper.IsPercentStack(m_Series, SerieType.Bar);
for (int i = 0; i < m_Series.Count; i++) for (int i = 0; i < m_Series.Count; i++)
{ {
var serie = m_Series.GetSerie(i); var serie = m_Series.GetSerie(i);
@@ -1546,7 +1546,6 @@ namespace XCharts
if (!serie.IsCoordinateSerie()) continue; if (!serie.IsCoordinateSerie()) continue;
var total = serie.yTotal; var total = serie.yTotal;
var isPercentStack = SeriesHelper.IsPercentStack(m_Series, serie.stack, SerieType.Bar); var isPercentStack = SeriesHelper.IsPercentStack(m_Series, serie.stack, SerieType.Bar);
for (int j = 0; j < serie.data.Count; j++) for (int j = 0; j < serie.data.Count; j++)
{ {
var serieData = serie.data[j]; var serieData = serie.data[j];
@@ -1554,14 +1553,17 @@ namespace XCharts
if (j >= serie.dataPoints.Count) if (j >= serie.dataPoints.Count)
{ {
serieData.SetLabelActive(false); serieData.SetLabelActive(false);
serieData.SetIconActive(false);
continue; continue;
} }
var pos = serie.dataPoints[j]; var pos = serie.dataPoints[j];
var serieLabel = SerieHelper.GetSerieLabel(serie, serieData); var serieLabel = SerieHelper.GetSerieLabel(serie, serieData);
var iconStyle = SerieHelper.GetIconStyle(serie, serieData);
var dimension = 1; var dimension = 1;
var isIgnore = serie.IsIgnoreIndex(j); var isIgnore = serie.IsIgnoreIndex(j);
Internal_RefreshLabelPosition(serie, serieData, serieLabel, pos, serie.type == SerieType.Bar, isYAxis);
serieData.labelObject.SetPosition(serieData.labelPosition); serieData.labelObject.SetPosition(serieData.labelPosition);
serieData.labelObject.UpdateIcon(serieData.iconStyle); serieData.labelObject.UpdateIcon(iconStyle);
if (serie.show && serieLabel.show && serieData.canShowLabel && !isIgnore) if (serie.show && serieLabel.show && serieData.canShowLabel && !isIgnore)
{ {
double value = 0; double value = 0;

View File

@@ -499,9 +499,9 @@ namespace XCharts
var currAngle = serieData.runtimePieHalfAngle; var currAngle = serieData.runtimePieHalfAngle;
var isHighlight = (serieData.highlighted && serie.emphasis.label.show); var isHighlight = (serieData.highlighted && serie.emphasis.label.show);
var serieLabel = SerieHelper.GetSerieLabel(serie, serieData); var serieLabel = SerieHelper.GetSerieLabel(serie, serieData);
var iconStyle = SerieHelper.GetIconStyle(serie, serieData);
var showLabel = ((serieLabel.show || isHighlight) && serieData.canShowLabel); var showLabel = ((serieLabel.show || isHighlight) && serieData.canShowLabel);
if (showLabel)
if (showLabel || serieData.iconStyle.show)
{ {
serieData.SetLabelActive(showLabel); serieData.SetLabelActive(showLabel);
float rotate = 0; float rotate = 0;
@@ -558,7 +558,7 @@ namespace XCharts
{ {
serieData.SetLabelActive(false); serieData.SetLabelActive(false);
} }
serieData.labelObject.UpdateIcon(serieData.iconStyle); serieData.labelObject.UpdateIcon(iconStyle);
} }
protected int GetPiePosIndex(Serie serie, Vector2 local) protected int GetPiePosIndex(Serie serie, Vector2 local)

View File

@@ -88,13 +88,14 @@ namespace XCharts
var serieData = serie.data[n]; var serieData = serie.data[n];
if (serieData.labelObject == null) continue; if (serieData.labelObject == null) continue;
var serieLabel = SerieHelper.GetSerieLabel(serie, serieData); var serieLabel = SerieHelper.GetSerieLabel(serie, serieData);
var iconStyle = SerieHelper.GetIconStyle(serie, serieData);
var labelPos = serieData.labelPosition; var labelPos = serieData.labelPosition;
if (serieLabel.margin != 0) if (serieLabel.margin != 0)
{ {
labelPos += serieLabel.margin * (labelPos - center).normalized; labelPos += serieLabel.margin * (labelPos - center).normalized;
} }
serieData.labelObject.SetPosition(labelPos); serieData.labelObject.SetPosition(labelPos);
serieData.labelObject.UpdateIcon(serieData.iconStyle); serieData.labelObject.UpdateIcon(iconStyle);
if (serie.show && serieLabel.show && serieData.canShowLabel) if (serie.show && serieLabel.show && serieData.canShowLabel)
{ {
var value = serieData.GetCurrData(1); var value = serieData.GetCurrData(1);