3.0 - radar chart

This commit is contained in:
monitor1394
2022-01-22 21:08:26 +08:00
parent a8b2068029
commit d9840bef52
29 changed files with 471 additions and 249 deletions

View File

@@ -179,6 +179,7 @@ namespace XCharts.Editor
{ {
++EditorGUI.indentLevel; ++EditorGUI.indentLevel;
PropertyField(prop, "m_Name"); PropertyField(prop, "m_Name");
PropertyField(prop, "m_Formatter");
PropertyField(prop, "m_Location"); PropertyField(prop, "m_Location");
PropertyField(prop, "m_TextStyle"); PropertyField(prop, "m_TextStyle");
--EditorGUI.indentLevel; --EditorGUI.indentLevel;

View File

@@ -21,6 +21,7 @@ namespace XCharts.Editor
PropertyField("m_ConnectCenter"); PropertyField("m_ConnectCenter");
PropertyField("m_LineGradient"); PropertyField("m_LineGradient");
PropertyField("m_AxisLine"); PropertyField("m_AxisLine");
PropertyField("m_AxisName");
PropertyField("m_SplitLine"); PropertyField("m_SplitLine");
PropertyField("m_SplitArea"); PropertyField("m_SplitArea");
PropertyField("m_IndicatorList"); PropertyField("m_IndicatorList");
@@ -42,7 +43,6 @@ namespace XCharts.Editor
PropertyField(prop, "m_Min"); PropertyField(prop, "m_Min");
PropertyField(prop, "m_Max"); PropertyField(prop, "m_Max");
PropertyTwoFiled(prop, "m_Range"); PropertyTwoFiled(prop, "m_Range");
PropertyField(prop, "m_TextStyle");
--EditorGUI.indentLevel; --EditorGUI.indentLevel;
} }
} }

View File

@@ -199,13 +199,15 @@ namespace XCharts.Editor
var m_ItemStyle = serieData.FindPropertyRelative("m_ItemStyles"); var m_ItemStyle = serieData.FindPropertyRelative("m_ItemStyles");
var m_Emphasis = serieData.FindPropertyRelative("m_Emphases"); var m_Emphasis = serieData.FindPropertyRelative("m_Emphases");
var m_Symbol = serieData.FindPropertyRelative("m_Symbols"); var m_Symbol = serieData.FindPropertyRelative("m_Symbols");
var m_LineStyle = serieData.FindPropertyRelative("m_LineStyles");
var m_AreaStyle = serieData.FindPropertyRelative("m_AreaStyles");
PropertyField(sereName); PropertyField(sereName);
PropertyField(selected); PropertyField(selected);
PropertyField(m_Ignore); PropertyField(m_Ignore);
var componentNum = m_IconStyle.arraySize + m_Label.arraySize + m_ItemStyle.arraySize + m_Emphasis.arraySize var componentNum = m_IconStyle.arraySize + m_Label.arraySize + m_ItemStyle.arraySize + m_Emphasis.arraySize
+ m_Symbol.arraySize; + m_Symbol.arraySize + m_LineStyle.arraySize + m_AreaStyle.arraySize;
var title = "Component"; var title = "Component";
if (componentNum == 0) title += " (None)"; if (componentNum == 0) title += " (None)";
m_DataComponentFoldout = ChartEditorHelper.DrawHeader(title, m_DataComponentFoldout, false, null, null, m_DataComponentFoldout = ChartEditorHelper.DrawHeader(title, m_DataComponentFoldout, false, null, null,
@@ -229,6 +231,14 @@ namespace XCharts.Editor
{ {
serie.GetSerieData(index).GetOrAddComponent<SymbolStyle>(); serie.GetSerieData(index).GetOrAddComponent<SymbolStyle>();
}, m_Symbol.arraySize == 0), }, m_Symbol.arraySize == 0),
new HeaderMenuInfo("Add LineStyle", () =>
{
serie.GetSerieData(index).GetOrAddComponent<LineStyle>();
}, m_LineStyle.arraySize == 0),
new HeaderMenuInfo("Add AreaStyle", () =>
{
serie.GetSerieData(index).GetOrAddComponent<AreaStyle>();
}, m_AreaStyle.arraySize == 0),
new HeaderMenuInfo("Remove ItemStyle", () => new HeaderMenuInfo("Remove ItemStyle", () =>
{ {
serie.GetSerieData(index).RemoveComponent<ItemStyle>(); serie.GetSerieData(index).RemoveComponent<ItemStyle>();
@@ -249,10 +259,18 @@ namespace XCharts.Editor
{ {
serie.GetSerieData(index).RemoveComponent<SymbolStyle>(); serie.GetSerieData(index).RemoveComponent<SymbolStyle>();
}, m_Symbol.arraySize > 0), }, m_Symbol.arraySize > 0),
new HeaderMenuInfo("Remove LineStyle", () =>
{
serie.GetSerieData(index).RemoveComponent<LineStyle>();
}, m_LineStyle.arraySize > 0),
new HeaderMenuInfo("Remove AreaStyle", () =>
{
serie.GetSerieData(index).RemoveComponent<AreaStyle>();
}, m_AreaStyle.arraySize > 0),
new HeaderMenuInfo("Remove All", () => new HeaderMenuInfo("Remove All", () =>
{ {
serie.GetSerieData(index).RemoveAllComponent(); serie.GetSerieData(index).RemoveAllComponent();
}, m_Symbol.arraySize > 0)); }, componentNum > 0));
if (m_DataComponentFoldout) if (m_DataComponentFoldout)
{ {
if (m_IconStyle.arraySize > 0) if (m_IconStyle.arraySize > 0)
@@ -265,6 +283,10 @@ namespace XCharts.Editor
PropertyField(m_Emphasis.GetArrayElementAtIndex(0)); PropertyField(m_Emphasis.GetArrayElementAtIndex(0));
if (m_Symbol.arraySize > 0) if (m_Symbol.arraySize > 0)
PropertyField(m_Symbol.GetArrayElementAtIndex(0)); PropertyField(m_Symbol.GetArrayElementAtIndex(0));
if (m_LineStyle.arraySize > 0)
PropertyField(m_LineStyle.GetArrayElementAtIndex(0));
if (m_AreaStyle.arraySize > 0)
PropertyField(m_AreaStyle.GetArrayElementAtIndex(0));
} }
EditorGUI.indentLevel--; EditorGUI.indentLevel--;
} }

View File

@@ -20,9 +20,7 @@ namespace XCharts
tooltip.trigger = Tooltip.Trigger.Axis; tooltip.trigger = Tooltip.Trigger.Axis;
var grid = GetOrAddChartComponent<GridCoord>(); var grid = GetOrAddChartComponent<GridCoord>();
grid.left = 100; grid.left = 0.12f;
grid.right = 60;
grid.bottom = 60;
var xAxis = GetOrAddChartComponent<XAxis>(); var xAxis = GetOrAddChartComponent<XAxis>();
xAxis.type = Axis.AxisType.Category; xAxis.type = Axis.AxisType.Category;

View File

@@ -23,6 +23,7 @@ namespace XCharts
} }
[SerializeField] private bool m_Show; [SerializeField] private bool m_Show;
[SerializeField] private string m_Name; [SerializeField] private string m_Name;
[SerializeField] private string m_Formatter;
[SerializeField] private Location m_Location; [SerializeField] private Location m_Location;
[SerializeField] private TextStyle m_TextStyle = new TextStyle(); [SerializeField] private TextStyle m_TextStyle = new TextStyle();
@@ -45,6 +46,15 @@ namespace XCharts
set { if (PropertyUtil.SetClass(ref m_Name, value)) SetComponentDirty(); } set { if (PropertyUtil.SetClass(ref m_Name, value)) SetComponentDirty(); }
} }
/// <summary> /// <summary>
/// The formatter of indicator's name.
/// 指示器名称显示的格式器。可用在雷达图。
/// </summary>
public string formatter
{
get { return m_Formatter; }
set { if (PropertyUtil.SetClass(ref m_Formatter, value)) SetComponentDirty(); }
}
/// <summary>
/// Location of axis name. /// Location of axis name.
/// 坐标轴名称显示位置。 /// 坐标轴名称显示位置。
/// </summary> /// </summary>

View File

@@ -9,7 +9,7 @@ namespace XCharts
/// 区域填充样式。 /// 区域填充样式。
/// </summary> /// </summary>
[System.Serializable] [System.Serializable]
public class AreaStyle : ChildComponent, ISerieExtraComponent public class AreaStyle : ChildComponent, ISerieExtraComponent, ISerieDataComponent
{ {
/// <summary> /// <summary>
/// Origin position of area. /// Origin position of area.

View File

@@ -11,7 +11,7 @@ namespace XCharts
/// toColortoColor2可设置水平方向的渐变如需要设置垂直方向的渐变可使用VisualMap。 /// toColortoColor2可设置水平方向的渐变如需要设置垂直方向的渐变可使用VisualMap。
/// </summary> /// </summary>
[System.Serializable] [System.Serializable]
public class LineStyle : ChildComponent public class LineStyle : ChildComponent, ISerieDataComponent
{ {
/// <summary> /// <summary>
/// 线的类型。 /// 线的类型。

View File

@@ -42,7 +42,7 @@ namespace XCharts
private void InitLegend(Legend legend) private void InitLegend(Legend legend)
{ {
legend.painter = null; // legend component does not need to paint legend.painter = null;
legend.refreshComponent = delegate () legend.refreshComponent = delegate ()
{ {
legend.OnChanged(); legend.OnChanged();
@@ -55,9 +55,10 @@ namespace XCharts
if (legend.show && legend.data.Count > 0) if (legend.show && legend.data.Count > 0)
{ {
datas = new List<string>(); datas = new List<string>();
for (int i = 0; i < chart.m_LegendRealShowName.Count; i++) foreach (var data in legend.data)
{ {
if (legend.data.Contains(chart.m_LegendRealShowName[i])) datas.Add(chart.m_LegendRealShowName[i]); if (chart.m_LegendRealShowName.Contains(data) || chart.IsSerieName(data))
datas.Add(data);
} }
} }
else else
@@ -130,13 +131,6 @@ namespace XCharts
chart.OnLegendButtonExit(index, selectedName); chart.OnLegendButtonExit(index, selectedName);
}); });
} }
if (legend.selectedMode == Legend.SelectedMode.Single)
{
for (int n = 0; n < chart.m_LegendRealShowName.Count; n++)
{
chart.OnLegendButtonClick(n, chart.m_LegendRealShowName[n], n == 0 ? true : false);
}
}
LegendHelper.ResetItemPosition(legend, chart.chartPosition, chart.chartWidth, chart.chartHeight); LegendHelper.ResetItemPosition(legend, chart.chartPosition, chart.chartWidth, chart.chartHeight);
}; };
legend.refreshComponent(); legend.refreshComponent();

View File

@@ -71,7 +71,7 @@ namespace XCharts
UpdateRuntimeData(markArea); UpdateRuntimeData(markArea);
var colorIndex = chart.GetLegendRealShowNameIndex(serie.serieName); var colorIndex = chart.GetLegendRealShowNameIndex(serie.serieName);
var serieColor = SerieHelper.GetLineColor(serie, chart.theme, colorIndex, false); var serieColor = SerieHelper.GetLineColor(serie, null, chart.theme, colorIndex, false);
var areaColor = markArea.itemStyle.GetColor(serieColor); var areaColor = markArea.itemStyle.GetColor(serieColor);
UGL.DrawRectangle(vh, markArea.runtimeRect, areaColor, areaColor); UGL.DrawRectangle(vh, markArea.runtimeRect, areaColor, areaColor);
} }

View File

@@ -104,7 +104,7 @@ namespace XCharts
var sp = Vector3.zero; var sp = Vector3.zero;
var ep = Vector3.zero; var ep = Vector3.zero;
var colorIndex = chart.GetLegendRealShowNameIndex(serie.serieName); var colorIndex = chart.GetLegendRealShowNameIndex(serie.serieName);
var serieColor = SerieHelper.GetLineColor(serie, chart.theme, colorIndex, false); var serieColor = SerieHelper.GetLineColor(serie, null, chart.theme, colorIndex, false);
animation.InitProgress(0, 1f); animation.InitProgress(0, 1f);
ResetTempMarkLineGroupData(markLine); ResetTempMarkLineGroupData(markLine);
if (m_TempGroupData.Count > 0) if (m_TempGroupData.Count > 0)

View File

@@ -51,7 +51,6 @@ namespace XCharts
[SerializeField] private double m_Max; [SerializeField] private double m_Max;
[SerializeField] private double m_Min; [SerializeField] private double m_Min;
[SerializeField] private double[] m_Range = new double[2] { 0, 0 }; [SerializeField] private double[] m_Range = new double[2] { 0, 0 };
[SerializeField] private TextStyle m_TextStyle = new TextStyle();
/// <summary> /// <summary>
/// The name of indicator. /// The name of indicator.
@@ -69,11 +68,6 @@ namespace XCharts
/// </summary> /// </summary>
public double min { get { return m_Min; } set { m_Min = value; } } public double min { get { return m_Min; } set { m_Min = value; } }
/// <summary> /// <summary>
/// the style of text.
/// 文本样式。
/// </summary>
public TextStyle textStyle { get { return m_TextStyle; } set { m_TextStyle = value; } }
/// <summary>
/// the text conponent of indicator. /// the text conponent of indicator.
/// 指示器的文本组件。 /// 指示器的文本组件。
/// </summary> /// </summary>
@@ -103,6 +97,7 @@ namespace XCharts
[SerializeField] private int m_SplitNumber = 5; [SerializeField] private int m_SplitNumber = 5;
[SerializeField] private float[] m_Center = new float[2] { 0.5f, 0.5f }; [SerializeField] private float[] m_Center = new float[2] { 0.5f, 0.5f };
[SerializeField] private AxisLine m_AxisLine = AxisLine.defaultAxisLine; [SerializeField] private AxisLine m_AxisLine = AxisLine.defaultAxisLine;
[SerializeField] private AxisName m_AxisName = AxisName.defaultAxisName;
[SerializeField] private AxisSplitLine m_SplitLine = AxisSplitLine.defaultSplitLine; [SerializeField] private AxisSplitLine m_SplitLine = AxisSplitLine.defaultSplitLine;
[SerializeField] private AxisSplitArea m_SplitArea = AxisSplitArea.defaultSplitArea; [SerializeField] private AxisSplitArea m_SplitArea = AxisSplitArea.defaultSplitArea;
[SerializeField] private bool m_Indicator = true; [SerializeField] private bool m_Indicator = true;
@@ -171,6 +166,15 @@ namespace XCharts
set { if (PropertyUtil.SetClass(ref m_AxisLine, value, true)) SetAllDirty(); } set { if (PropertyUtil.SetClass(ref m_AxisLine, value, true)) SetAllDirty(); }
} }
/// <summary> /// <summary>
/// Name options for radar indicators.
/// 雷达图每个指示器名称的配置项。
/// </summary>
public AxisName axisName
{
get { return m_AxisName; }
set { if (PropertyUtil.SetClass(ref m_AxisName, value, true)) SetAllDirty(); }
}
/// <summary>
/// split line. /// split line.
/// 分割线。 /// 分割线。
/// </summary> /// </summary>
@@ -288,6 +292,8 @@ namespace XCharts
center[1] = 0.4f; center[1] = 0.4f;
splitLine.show = true; splitLine.show = true;
splitArea.show = true; splitArea.show = true;
axisName.show = true;
axisName.name = null;
} }
private bool IsEqualsIndicatorList(List<Indicator> indicators1, List<Indicator> indicators2) private bool IsEqualsIndicatorList(List<Indicator> indicators1, List<Indicator> indicators2)
@@ -410,5 +416,31 @@ namespace XCharts
{ {
indicatorList.Clear(); indicatorList.Clear();
} }
public string GetFormatterIndicatorContent(int indicatorIndex)
{
var indicator = GetIndicator(indicatorIndex);
if (indicator == null)
return string.Empty;
else
return GetFormatterIndicatorContent(indicator.name);
}
public string GetFormatterIndicatorContent(string indicatorName)
{
if (string.IsNullOrEmpty(indicatorName))
return indicatorName;
if (string.IsNullOrEmpty(m_AxisName.formatter))
{
return indicatorName;
}
else
{
var content = m_AxisName.formatter;
FormatterHelper.ReplaceAxisLabelContent(ref content, indicatorName);
return content;
}
}
} }
} }

View File

@@ -40,23 +40,32 @@ namespace XCharts
radar.painter = chart.GetPainter(radar.index); radar.painter = chart.GetPainter(radar.index);
radar.refreshComponent = delegate () radar.refreshComponent = delegate ()
{ {
ChartHelper.HideAllObject(chart.transform, INDICATOR_TEXT + "_" + radar.index);
radar.UpdateRadarCenter(chart.chartPosition, chart.chartWidth, chart.chartHeight); radar.UpdateRadarCenter(chart.chartPosition, chart.chartWidth, chart.chartHeight);
var radarObject = ChartHelper.AddObject("Radar" + radar.index, chart.transform, chart.chartMinAnchor,
chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta);
radar.gameObject = radarObject;
radar.gameObject.hideFlags = chart.chartHideFlags;
var textStyle = radar.axisName.textStyle;
ChartHelper.HideAllObject(radarObject.transform, INDICATOR_TEXT);
for (int i = 0; i < radar.indicatorList.Count; i++) for (int i = 0; i < radar.indicatorList.Count; i++)
{ {
var indicator = radar.indicatorList[i]; var indicator = radar.indicatorList[i];
var pos = radar.GetIndicatorPosition(i); var pos = radar.GetIndicatorPosition(i);
var textStyle = indicator.textStyle; var objName = INDICATOR_TEXT + "_" + i;
var objName = INDICATOR_TEXT + "_" + radar.index + "_" + i;
var txt = ChartHelper.AddTextObject(objName, chart.transform, new Vector2(0.5f, 0.5f), var labelGameObject = ChartHelper.AddObject(objName, radarObject.transform, new Vector2(0.5f, 0.5f),
new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(txtWid, txtHig), new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(txtWid, txtHig));
textStyle, chart.theme.axis); var label = ChartHelper.GetOrAddComponent<ChartLabel>(labelGameObject);
txt.gameObject.hideFlags = chart.chartHideFlags; label.label = ChartHelper.AddTextObject("Text", label.gameObject.transform, new Vector2(0.5f, 0.5f),
txt.SetAlignment(textStyle.GetAlignment(TextAnchor.MiddleCenter)); new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(txtWid, txtHig), textStyle, chart.theme.common);
txt.SetText(radar.indicatorList[i].name); label.SetAutoSize(true);
txt.SetActive(radar.indicator); label.label.SetAlignment(textStyle.GetAlignment(TextAnchor.MiddleCenter));
label.SetText(radar.GetFormatterIndicatorContent(i));
label.SetActive(radar.indicator);
label.color = textStyle.backgroundColor;
var offset = new Vector3(textStyle.offset.x, textStyle.offset.y); var offset = new Vector3(textStyle.offset.x, textStyle.offset.y);
AxisHelper.AdjustCircleLabelPos(txt, pos, radar.context.center, txtHig, offset); AxisHelper.AdjustCircleLabelPos(label, pos, radar.context.center, txtHig, offset);
} }
chart.RefreshBasePainter(); chart.RefreshBasePainter();
}; };

View File

@@ -13,7 +13,6 @@ namespace XCharts
public class TitleStyle : ChildComponent public class TitleStyle : ChildComponent
{ {
[SerializeField] private bool m_Show; [SerializeField] private bool m_Show;
[FormerlySerializedAs("m_textStyle")]
[SerializeField] private TextStyle m_TextStyle = new TextStyle(); [SerializeField] private TextStyle m_TextStyle = new TextStyle();
/// <summary> /// <summary>

View File

@@ -357,7 +357,7 @@ namespace XCharts
{ {
var serie = series[i]; var serie = series[i];
serie.context.isTriggerByAxis = isTriggerByAxis; serie.context.isTriggerByAxis = isTriggerByAxis;
if (isTriggerByAxis) if (isTriggerByAxis && dataIndex >= 0)
serie.context.pointerItemDataIndex = dataIndex; serie.context.pointerItemDataIndex = dataIndex;
serie.handler.UpdateTooltipSerieParams(dataIndex, showCategory, category, serie.handler.UpdateTooltipSerieParams(dataIndex, showCategory, category,
tooltip.marker, tooltip.itemFormatter, tooltip.numericFormatter, tooltip.marker, tooltip.itemFormatter, tooltip.numericFormatter,

View File

@@ -2,7 +2,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using System.Text;
using UnityEngine; using UnityEngine;
namespace XCharts namespace XCharts
@@ -453,7 +452,7 @@ namespace XCharts
public static IconStyle GetIconStyle(Serie serie, SerieData serieData) public static IconStyle GetIconStyle(Serie serie, SerieData serieData)
{ {
if (serieData.iconStyle != null) return serieData.iconStyle; if (serieData != null && serieData.iconStyle != null) return serieData.iconStyle;
else return serie.iconStyle; else return serie.iconStyle;
} }
@@ -463,55 +462,62 @@ namespace XCharts
else return serie.symbol; else return serie.symbol;
} }
public static Color32 GetAreaColor(Serie serie, ThemeStyle theme, int index, bool highlight) public static LineStyle GetLineStyle(Serie serie, SerieData serieData)
{
if (serieData != null && serieData.lineStyle != null) return serieData.lineStyle;
else return serie.lineStyle;
}
public static AreaStyle GetAreaStyle(Serie serie, SerieData serieData)
{
if (serieData != null && serieData.areaStyle != null) return serieData.areaStyle;
else return serie.areaStyle;
}
public static Color32 GetAreaColor(Serie serie, SerieData serieData, ThemeStyle theme, int index, bool highlight)
{ {
Color32 color = ChartConst.clearColor32; Color32 color = ChartConst.clearColor32;
var areaStyle = serie.areaStyle; var areaStyle = GetAreaStyle(serie, serieData);
if (areaStyle == null || !areaStyle.show) if (areaStyle == null || !areaStyle.show)
return color; return color;
if (!ChartHelper.IsClearColor(areaStyle.color)) color = areaStyle.color;
else if (!ChartHelper.IsClearColor(serie.itemStyle.color)) color = serie.itemStyle.color;
else color = theme.GetColor(index);
ChartHelper.SetColorOpacity(ref color, areaStyle.opacity);
if (highlight) if (highlight)
{ {
if (!ChartHelper.IsClearColor(areaStyle.highlightColor)) if (!ChartHelper.IsClearColor(areaStyle.highlightColor))
color = areaStyle.highlightColor; color = areaStyle.highlightColor;
else else
color = ChartHelper.GetHighlightColor(color); color = ChartHelper.GetHighlightColor(color);
ChartHelper.SetColorOpacity(ref color, areaStyle.opacity);
return color;
} }
if (!ChartHelper.IsClearColor(areaStyle.color)) color = areaStyle.color;
else if (!ChartHelper.IsClearColor(serie.itemStyle.color)) color = serie.itemStyle.color;
else color = theme.GetColor(index);
ChartHelper.SetColorOpacity(ref color, areaStyle.opacity);
return color; return color;
} }
public static Color32 GetAreaToColor(Serie serie, ThemeStyle theme, int index, bool highlight) public static Color32 GetAreaToColor(Serie serie, SerieData serieData, ThemeStyle theme, int index, bool highlight)
{ {
Color32 color = ChartConst.clearColor32; Color32 color = ChartConst.clearColor32;
var areaStyle = serie.areaStyle; var areaStyle = GetAreaStyle(serie, serieData);
if (areaStyle == null || !areaStyle.show) if (areaStyle == null || !areaStyle.show)
return color; return color;
if (!ChartHelper.IsClearColor(areaStyle.toColor)) if (!ChartHelper.IsClearColor(areaStyle.toColor)) color = areaStyle.toColor;
else if (!ChartHelper.IsClearColor(serie.itemStyle.toColor)) color = serie.itemStyle.toColor;
else color = theme.GetColor(index);
ChartHelper.SetColorOpacity(ref color, areaStyle.opacity);
if (highlight)
{ {
color = areaStyle.toColor; if (!ChartHelper.IsClearColor(areaStyle.highlightToColor))
if (highlight) color = areaStyle.highlightToColor;
{ else
if (!ChartHelper.IsClearColor(areaStyle.highlightToColor)) color = areaStyle.highlightToColor; color = ChartHelper.GetHighlightColor(color);
else color = ChartHelper.GetHighlightColor(color);
}
ChartHelper.SetColorOpacity(ref color, areaStyle.opacity);
return color;
}
else
{
return GetAreaColor(serie, theme, index, highlight);
} }
return color;
} }
public static Color32 GetLineColor(Serie serie, ThemeStyle theme, int index, bool highlight) public static Color32 GetLineColor(Serie serie, SerieData serieData, ThemeStyle theme, int index, bool highlight)
{ {
Color32 color = ChartConst.clearColor32; Color32 color = ChartConst.clearColor32;
var lineStyle = GetLineStyle(serie, serieData);
if (highlight) if (highlight)
{ {
var itemStyleEmphasis = GetItemStyleEmphasis(serie, null); var itemStyleEmphasis = GetItemStyleEmphasis(serie, null);
@@ -522,13 +528,10 @@ namespace XCharts
return color; return color;
} }
} }
if (!ChartHelper.IsClearColor(serie.lineStyle.color)) color = serie.lineStyle.GetColor(); if (!ChartHelper.IsClearColor(lineStyle.color)) color = lineStyle.color;
else if (!ChartHelper.IsClearColor(serie.itemStyle.color)) color = serie.itemStyle.GetColor(); else if (!ChartHelper.IsClearColor(serie.itemStyle.color)) color = serie.itemStyle.GetColor();
if (ChartHelper.IsClearColor(color)) if (ChartHelper.IsClearColor(color)) color = theme.GetColor(index);
{ ChartHelper.SetColorOpacity(ref color, lineStyle.opacity);
color = theme.GetColor(index);
ChartHelper.SetColorOpacity(ref color, serie.lineStyle.opacity);
}
if (highlight) color = ChartHelper.GetHighlightColor(color); if (highlight) color = ChartHelper.GetHighlightColor(color);
return color; return color;
} }
@@ -781,7 +784,11 @@ namespace XCharts
{ {
if (field.IsDefined(typeof(SerializeField), false)) if (field.IsDefined(typeof(SerializeField), false))
{ {
field.SetValue(newSerie, field.GetValue(oldSerie)); var filedValue = field.GetValue(oldSerie);
if (filedValue == null) continue;
var filedType = filedValue.GetType();
if (filedType.IsClass)
field.SetValue(newSerie, ReflectionUtil.DeepCloneSerializeField(filedValue));
} }
} }
} }

View File

@@ -99,14 +99,11 @@ namespace XCharts
} }
if (found) break; if (found) break;
} }
else if (name.Equals(serie.serieName))
{ {
if (name.Equals(serie.serieName)) destSerie = serie;
{ destSerieData = null;
destSerie = serie; break;
destSerieData = null;
break;
}
} }
} }
return SerieHelper.GetItemColor(destSerie, destSerieData, chart.theme, index, false); return SerieHelper.GetItemColor(destSerie, destSerieData, chart.theme, index, false);

View File

@@ -792,6 +792,7 @@ namespace XCharts
var handler = (SerieHandler)Activator.CreateInstance(attribute.handler); var handler = (SerieHandler)Activator.CreateInstance(attribute.handler);
handler.attribute = attribute; handler.attribute = attribute;
handler.chart = this; handler.chart = this;
handler.defaultDimension = 1;
handler.SetSerie(serie); handler.SetSerie(serie);
serie.handler = handler; serie.handler = handler;
m_SerieHandlers.Add(handler); m_SerieHandlers.Add(handler);
@@ -841,5 +842,17 @@ namespace XCharts
{ {
return "serie" + m_Series.Count; return "serie" + m_Series.Count;
} }
public bool IsSerieName(string name)
{
if (string.IsNullOrEmpty(name))
return false;
foreach (var serie in m_Series)
{
if (name.Equals(serie.serieName))
return true;
}
return false;
}
} }
} }

View File

@@ -359,25 +359,6 @@ namespace XCharts
} }
#endif #endif
internal static GameObject AddTooltipContent(string name, Transform parent, TextStyle textStyle,
ThemeStyle theme)
{
var anchorMax = new Vector2(0, 1);
var anchorMin = new Vector2(0, 1);
var pivot = new Vector2(0, 1);
var sizeDelta = new Vector2(100, 100);
GameObject tooltipObj = AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta);
var img = GetOrAddComponent<Image>(tooltipObj);
img.color = Color.black;
var txt = AddTextObject("Text", tooltipObj.transform, anchorMin, anchorMax, pivot, sizeDelta,
textStyle, theme.tooltip);
txt.SetAlignment(textStyle.GetAlignment(TextAnchor.UpperLeft));
txt.SetText("Text");
txt.SetLocalPosition(new Vector2(3, -3));
tooltipObj.transform.localPosition = Vector3.zero;
return tooltipObj;
}
internal static Painter AddPainterObject(string name, Transform parent, Vector2 anchorMin, Vector2 anchorMax, internal static Painter AddPainterObject(string name, Transform parent, Vector2 anchorMin, Vector2 anchorMax,
Vector2 pivot, Vector2 sizeDelta, HideFlags hideFlags, int siblingIndex) Vector2 pivot, Vector2 sizeDelta, HideFlags hideFlags, int siblingIndex)
{ {

View File

@@ -9,6 +9,10 @@ namespace XCharts
[UnityEngine.Scripting.Preserve] [UnityEngine.Scripting.Preserve]
internal sealed class HeatmapHandler : SerieHandler<Heatmap> internal sealed class HeatmapHandler : SerieHandler<Heatmap>
{ {
private GridCoord m_SerieGrid;
public override int defaultDimension { get { return 2; } }
public override void Update() public override void Update()
{ {
base.Update(); base.Update();
@@ -33,14 +37,21 @@ namespace XCharts
if (serieData == null) if (serieData == null)
return; return;
if (string.IsNullOrEmpty(category))
{
var xAxis = chart.GetChartComponent<XAxis>(serie.xAxisIndex);
if (xAxis != null)
category = xAxis.GetData((int)serieData.GetData(0));
}
title = serie.serieName; title = serie.serieName;
var param = serie.context.param; var param = serie.context.param;
param.serieName = serie.serieName; param.serieName = serie.serieName;
param.serieIndex = serie.index; param.serieIndex = serie.index;
param.dimension = 2; param.dimension = defaultDimension;
param.serieData = serieData; param.serieData = serieData;
param.color = chart.theme.GetColor(serie.index); param.color = serieData.context.color;
param.marker = SerieHelper.GetItemMarker(serie, serieData, marker); param.marker = SerieHelper.GetItemMarker(serie, serieData, marker);
param.itemFormatter = SerieHelper.GetItemFormatter(serie, serieData, itemFormatter); param.itemFormatter = SerieHelper.GetItemFormatter(serie, serieData, itemFormatter);
param.numericFormatter = SerieHelper.GetNumericFormatter(serie, serieData, numericFormatter); param.numericFormatter = SerieHelper.GetNumericFormatter(serie, serieData, numericFormatter);
@@ -48,40 +59,67 @@ namespace XCharts
param.columns.Add(param.marker); param.columns.Add(param.marker);
param.columns.Add(category); param.columns.Add(category);
param.columns.Add(ChartCached.NumberToStr(serieData.GetData(2), param.numericFormatter)); param.columns.Add(ChartCached.NumberToStr(serieData.GetData(defaultDimension), param.numericFormatter));
paramList.Add(param); paramList.Add(param);
} }
private void UpdateSerieContext() private void UpdateSerieContext()
{ {
serie.context.pointerItemDataIndex = -1; if (m_SerieGrid == null)
serie.context.pointerEnter = false;
if (!chart.isPointerInChart)
return; return;
var grid = chart.GetChartComponent<GridCoord>(serie.containerIndex); var needCheck = (chart.isPointerInChart && m_SerieGrid.IsPointerEnter()) || m_LegendEnter;
if (grid == null) var needInteract = false;
return; if (!needCheck)
if (!grid.IsPointerEnter())
return;
foreach (var serieData in serie.data)
{ {
if (serieData.context.rect.Contains(chart.pointerPos)) if (m_LastCheckContextFlag != needCheck)
{
m_LastCheckContextFlag = needCheck;
serie.context.pointerItemDataIndex = -1;
serie.context.pointerEnter = false;
foreach (var serieData in serie.data)
{
serieData.context.highlight = false;
}
chart.RefreshPainter(serie);
}
return;
}
m_LastCheckContextFlag = needCheck;
if (m_LegendEnter)
{
serie.context.pointerEnter = true;
foreach (var serieData in serie.data)
{ {
serie.context.pointerItemDataIndex = serieData.index;
serie.context.pointerEnter = true;
serieData.context.highlight = true; serieData.context.highlight = true;
chart.RefreshTopPainter();
} }
else }
else
{
serie.context.pointerItemDataIndex = -1;
serie.context.pointerEnter = false;
var count = 0;
foreach (var serieData in serie.data)
{ {
serieData.context.highlight = false; if (!needInteract && serieData.context.rect.Contains(chart.pointerPos))
{
serie.context.pointerItemDataIndex = serieData.index;
serie.context.pointerEnter = true;
serieData.context.highlight = true;
needInteract = true;
}
else
{
serieData.context.highlight = false;
}
count++;
} }
} }
if (needInteract)
{
chart.RefreshPainter(serie);
}
} }
private void DrawHeatmapSerie(VertexHelper vh, int colorIndex, Heatmap serie) private void DrawHeatmapSerie(VertexHelper vh, int colorIndex, Heatmap serie)
@@ -89,21 +127,20 @@ namespace XCharts
if (serie.animation.HasFadeOut()) return; if (serie.animation.HasFadeOut()) return;
XAxis xAxis; XAxis xAxis;
YAxis yAxis; YAxis yAxis;
GridCoord grid;
if (!chart.TryGetChartComponent<XAxis>(out xAxis, serie.xAxisIndex)) return; if (!chart.TryGetChartComponent<XAxis>(out xAxis, serie.xAxisIndex)) return;
if (!chart.TryGetChartComponent<YAxis>(out yAxis, serie.yAxisIndex)) return; if (!chart.TryGetChartComponent<YAxis>(out yAxis, serie.yAxisIndex)) return;
if (!chart.TryGetChartComponent<GridCoord>(out grid, xAxis.gridIndex)) return; m_SerieGrid = chart.GetChartComponent<GridCoord>(xAxis.gridIndex);
xAxis.boundaryGap = true; xAxis.boundaryGap = true;
yAxis.boundaryGap = true; yAxis.boundaryGap = true;
var visualMap = chart.GetVisualMapOfSerie(serie); var visualMap = chart.GetVisualMapOfSerie(serie);
var emphasis = serie.emphasis; var emphasis = serie.emphasis;
var xCount = xAxis.data.Count; var xCount = xAxis.data.Count;
var yCount = yAxis.data.Count; var yCount = yAxis.data.Count;
var xWidth = grid.context.width / xCount; var xWidth = m_SerieGrid.context.width / xCount;
var yWidth = grid.context.height / yCount; var yWidth = m_SerieGrid.context.height / yCount;
var zeroX = grid.context.x; var zeroX = m_SerieGrid.context.x;
var zeroY = grid.context.y; var zeroY = m_SerieGrid.context.y;
var dataList = serie.GetDataList(); var dataList = serie.GetDataList();
var rangeMin = visualMap.rangeMin; var rangeMin = visualMap.rangeMin;
var rangeMax = visualMap.rangeMax; var rangeMax = visualMap.rangeMax;
@@ -111,69 +148,83 @@ namespace XCharts
var borderWidth = serie.itemStyle.show ? serie.itemStyle.borderWidth : 0; var borderWidth = serie.itemStyle.show ? serie.itemStyle.borderWidth : 0;
var rectWid = xWidth - 2 * borderWidth; var rectWid = xWidth - 2 * borderWidth;
var rectHig = yWidth - 2 * borderWidth; var rectHig = yWidth - 2 * borderWidth;
var borderColor = serie.itemStyle.opacity > 0 ? serie.itemStyle.borderColor : ChartConst.clearColor32;
var borderColor = serie.itemStyle.opacity > 0
? serie.itemStyle.borderColor
: ChartConst.clearColor32;
borderColor.a = (byte)(borderColor.a * serie.itemStyle.opacity); borderColor.a = (byte)(borderColor.a * serie.itemStyle.opacity);
var borderToColor = serie.itemStyle.opacity > 0 ? serie.itemStyle.borderToColor : ChartConst.clearColor32;
var borderToColor = serie.itemStyle.opacity > 0
? serie.itemStyle.borderToColor
: ChartConst.clearColor32;
borderToColor.a = (byte)(borderToColor.a * serie.itemStyle.opacity); borderToColor.a = (byte)(borderToColor.a * serie.itemStyle.opacity);
serie.context.dataPoints.Clear(); serie.context.dataPoints.Clear();
serie.animation.InitProgress(0, xCount); serie.animation.InitProgress(0, xCount);
var animationIndex = serie.animation.GetCurrIndex(); var animationIndex = serie.animation.GetCurrIndex();
var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); var dataChangeDuration = serie.animation.GetUpdateAnimationDuration();
var dataChanging = false; var dataChanging = false;
serie.containerIndex = grid.index; serie.containerIndex = m_SerieGrid.index;
serie.containterInstanceId = grid.instanceId; serie.containterInstanceId = m_SerieGrid.instanceId;
for (int i = 0; i < xCount; i++) for (int n = 0; n < serie.dataCount; n++)
{ {
for (int j = 0; j < yCount; j++) var serieData = serie.data[n];
serieData.index = n;
var i = (int)serieData.GetData(0);
var j = (int)serieData.GetData(1);
var dimension = VisualMapHelper.GetDimension(visualMap, serieData.data.Count);
if (serie.IsIgnoreValue(serieData, dimension))
{ {
var dataIndex = i * yCount + j; serie.context.dataPoints.Add(Vector3.zero);
if (dataIndex >= dataList.Count) continue; continue;
var serieData = dataList[dataIndex];
var dimension = VisualMapHelper.GetDimension(visualMap, serieData.data.Count);
serieData.index = dataIndex;
if (serie.IsIgnoreIndex(dataIndex, dimension))
{
serie.context.dataPoints.Add(Vector3.zero);
continue;
}
var value = serieData.GetCurrData(dimension, dataChangeDuration, yAxis.inverse,
yAxis.context.minValue, yAxis.context.maxValue);
if (serieData.IsDataChanged()) dataChanging = true;
var pos = new Vector3(zeroX + (i + (xAxis.boundaryGap ? 0.5f : 0)) * xWidth,
zeroY + (j + (yAxis.boundaryGap ? 0.5f : 0)) * yWidth);
serie.context.dataPoints.Add(pos);
serieData.context.canShowLabel = false;
serieData.context.rect = new Rect(pos.x - rectWid / 2, pos.y - rectHig / 2, rectWid, rectHig);
if (value == 0) continue;
if ((value < rangeMin && rangeMin != visualMap.min)
|| (value > rangeMax && rangeMax != visualMap.max))
{
continue;
}
if (!visualMap.IsInSelectedValue(value)) continue;
color = visualMap.GetColor(value);
if (animationIndex >= 0 && i > animationIndex) continue;
serieData.context.canShowLabel = true;
var highlight = (serieData.context.highlight)
|| visualMap.context.pointerIndex > 0;
UGL.DrawRectangle(vh, pos, rectWid / 2, rectHig / 2, color);
if (borderWidth > 0 && !ChartHelper.IsClearColor(borderColor))
{
UGL.DrawBorder(vh, pos, rectWid, rectHig, borderWidth, borderColor, borderToColor);
}
if (visualMap.hoverLink && highlight && emphasis != null && emphasis.show
&& emphasis.itemStyle.borderWidth > 0)
{
var emphasisBorderWidth = emphasis.itemStyle.borderWidth;
var emphasisBorderColor = emphasis.itemStyle.opacity > 0
? emphasis.itemStyle.borderColor : ChartConst.clearColor32;
var emphasisBorderToColor = emphasis.itemStyle.opacity > 0
? emphasis.itemStyle.borderToColor : ChartConst.clearColor32;
UGL.DrawBorder(vh, pos, rectWid, rectHig, emphasisBorderWidth, emphasisBorderColor,
emphasisBorderToColor);
}
} }
var value = serieData.GetCurrData(dimension, dataChangeDuration, yAxis.inverse,
yAxis.context.minValue, yAxis.context.maxValue);
if (serieData.IsDataChanged()) dataChanging = true;
var pos = new Vector3(zeroX + (i + (xAxis.boundaryGap ? 0.5f : 0)) * xWidth,
zeroY + (j + (yAxis.boundaryGap ? 0.5f : 0)) * yWidth);
serie.context.dataPoints.Add(pos);
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 == 0) continue;
if ((value < rangeMin && rangeMin != visualMap.min)
|| (value > rangeMax && rangeMax != visualMap.max))
{
continue;
}
if (!visualMap.IsInSelectedValue(value)) continue;
if (animationIndex >= 0 && i > animationIndex) continue;
color = visualMap.GetColor(value);
if (serieData.context.highlight)
color = ChartHelper.GetHighlightColor(color);
serieData.context.canShowLabel = true;
serieData.context.color = color;
var highlight = (serieData.context.highlight)
|| visualMap.context.pointerIndex > 0;
//UGL.DrawRectangle(vh, pos, rectWid / 2, rectHig / 2, color);
UGL.DrawRectangle(vh, serieData.context.rect, color);
if (borderWidth > 0 && !ChartHelper.IsClearColor(borderColor))
{
UGL.DrawBorder(vh, pos, rectWid, rectHig, borderWidth, borderColor, borderToColor);
}
if (visualMap.hoverLink && highlight && emphasis != null && emphasis.show
&& emphasis.itemStyle.borderWidth > 0)
{
var emphasisBorderWidth = emphasis.itemStyle.borderWidth;
var emphasisBorderColor = emphasis.itemStyle.opacity > 0
? emphasis.itemStyle.borderColor : ChartConst.clearColor32;
var emphasisBorderToColor = emphasis.itemStyle.opacity > 0
? emphasis.itemStyle.borderToColor : ChartConst.clearColor32;
UGL.DrawBorder(vh, pos, rectWid, rectHig, emphasisBorderWidth, emphasisBorderColor,
emphasisBorderToColor);
}
} }
if (!serie.animation.IsFinish()) if (!serie.animation.IsFinish())
{ {

View File

@@ -253,7 +253,7 @@ namespace XCharts
if (serie.context.dataPoints.Count < 2) if (serie.context.dataPoints.Count < 2)
return; return;
var lineColor = SerieHelper.GetLineColor(serie, chart.theme, serie.index, false); var lineColor = SerieHelper.GetLineColor(serie, null, chart.theme, serie.index, false);
var startPos = Vector3.zero; var startPos = Vector3.zero;
var arrowPos = Vector3.zero; var arrowPos = Vector3.zero;
var lineArrow = serie.lineArrow.arrow; var lineArrow = serie.lineArrow.arrow;

View File

@@ -33,7 +33,7 @@ namespace XCharts
var firstSerieData = datas[0]; var firstSerieData = datas[0];
var startPos = GetPolarPos(m_Polar, m_AngleAxis, firstSerieData, min, max, radius); var startPos = GetPolarPos(m_Polar, m_AngleAxis, firstSerieData, min, max, radius);
var nextPos = Vector3.zero; var nextPos = Vector3.zero;
var lineColor = SerieHelper.GetLineColor(serie, chart.theme, serie.index, serie.highlight); var lineColor = SerieHelper.GetLineColor(serie, null, chart.theme, serie.index, serie.highlight);
var lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth); var lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
var currDetailProgress = 0f; var currDetailProgress = 0f;
var totalDetailProgress = datas.Count; var totalDetailProgress = datas.Count;

View File

@@ -28,8 +28,8 @@ namespace XCharts
if (serie.areaStyle == null || !serie.areaStyle.show) if (serie.areaStyle == null || !serie.areaStyle.show)
return; return;
var srcAreaColor = SerieHelper.GetAreaColor(serie, theme, serie.context.colorIndex, false); var srcAreaColor = SerieHelper.GetAreaColor(serie, null, theme, serie.context.colorIndex, false);
var srcAreaToColor = SerieHelper.GetAreaToColor(serie, theme, serie.context.colorIndex, false); var srcAreaToColor = SerieHelper.GetAreaToColor(serie, null, theme, serie.context.colorIndex, false);
var gridXY = (isY ? grid.context.x : grid.context.y); var gridXY = (isY ? grid.context.x : grid.context.y);
if (lastStackSerie == null) if (lastStackSerie == null)
{ {
@@ -247,7 +247,7 @@ namespace XCharts
var isLineStyleGradient = serie.lineStyle.IsNeedGradient(); var isLineStyleGradient = serie.lineStyle.IsNeedGradient();
//var highlight = serie.highlight || serie.context.pointerEnter; //var highlight = serie.highlight || serie.context.pointerEnter;
var lineColor = SerieHelper.GetLineColor(serie, theme, serie.context.colorIndex, false); var lineColor = SerieHelper.GetLineColor(serie, null, theme, serie.context.colorIndex, false);
var lastDataIsIgnore = datas[0].isIgnoreBreak; var lastDataIsIgnore = datas[0].isIgnoreBreak;
for (int i = 1; i < dataCount; i++) for (int i = 1; i < dataCount; i++)

View File

@@ -42,7 +42,7 @@ namespace XCharts
var animationIndex = serie.animation.GetCurrIndex(); var animationIndex = serie.animation.GetCurrIndex();
var isHorizonal = parallel.orient == Orient.Horizonal; var isHorizonal = parallel.orient == Orient.Horizonal;
var lineColor = SerieHelper.GetLineColor(serie, chart.theme, colorIndex, false); var lineColor = SerieHelper.GetLineColor(serie, null, chart.theme, colorIndex, false);
var lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth); var lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
float currDetailProgress = !isHorizonal float currDetailProgress = !isHorizonal

View File

@@ -83,34 +83,10 @@ namespace XCharts
} }
} }
public override void OnLegendButtonClick(int index, string legendName, bool show)
{
if (!serie.IsLegendName(legendName))
return;
LegendHelper.CheckDataShow(serie, legendName, show);
chart.UpdateLegendColor(legendName, show);
chart.RefreshPainter(serie);
}
public override void OnLegendButtonEnter(int index, string legendName)
{
if (!serie.IsLegendName(legendName))
return;
LegendHelper.CheckDataHighlighted(serie, legendName, true);
chart.RefreshPainter(serie);
}
public override void OnLegendButtonExit(int index, string legendName)
{
if (!serie.IsLegendName(legendName))
return;
LegendHelper.CheckDataHighlighted(serie, legendName, false);
chart.RefreshPainter(serie);
}
private void UpdateSerieContext() private void UpdateSerieContext()
{ {
var needCheck = m_LegendEnter || (chart.isPointerInChart && m_RadarCoord.IsPointerEnter()); var needCheck = m_LegendEnter
|| (chart.isPointerInChart && (m_RadarCoord != null && m_RadarCoord.IsPointerEnter()));
var needInteract = false; var needInteract = false;
var needHideAll = false; var needHideAll = false;
if (!needCheck) if (!needCheck)
@@ -182,8 +158,6 @@ namespace XCharts
serie.containerIndex = m_RadarCoord.index; serie.containerIndex = m_RadarCoord.index;
serie.containterInstanceId = m_RadarCoord.instanceId; serie.containterInstanceId = m_RadarCoord.instanceId;
var areaStyle = serie.areaStyle;
var startPoint = Vector3.zero; var startPoint = Vector3.zero;
var toPoint = Vector3.zero; var toPoint = Vector3.zero;
var firstPoint = Vector3.zero; var firstPoint = Vector3.zero;
@@ -208,25 +182,39 @@ namespace XCharts
{ {
continue; continue;
} }
var lineStyle = SerieHelper.GetLineStyle(serie, serieData);
var areaStyle = SerieHelper.GetAreaStyle(serie, serieData);
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
var isHighlight = serieData.context.highlight; var isHighlight = serieData.context.highlight;
var areaColor = SerieHelper.GetAreaColor(serie, chart.theme, j, isHighlight); var colorIndex = chart.GetLegendRealShowNameIndex(serieData.name);
var areaToColor = SerieHelper.GetAreaToColor(serie, chart.theme, j, isHighlight); var areaColor = SerieHelper.GetAreaColor(serie, serieData, chart.theme, colorIndex, isHighlight);
var lineColor = SerieHelper.GetLineColor(serie, chart.theme, j, isHighlight); var areaToColor = SerieHelper.GetAreaToColor(serie, serieData, chart.theme, colorIndex, isHighlight);
var lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth); var lineColor = SerieHelper.GetLineColor(serie, serieData, chart.theme, colorIndex, isHighlight);
var lineWidth = lineStyle.GetWidth(chart.theme.serie.lineWidth);
int dataCount = m_RadarCoord.indicatorList.Count; int dataCount = m_RadarCoord.indicatorList.Count;
serieData.context.dataPoints.Clear(); serieData.context.dataPoints.Clear();
for (int n = 0; n < dataCount; n++) for (int n = 0; n < dataCount; n++)
{ {
if (n >= serieData.data.Count) break; if (n >= serieData.data.Count) break;
var min = m_RadarCoord.GetIndicatorMin(n);
var max = m_RadarCoord.GetIndicatorMax(n); var max = m_RadarCoord.GetIndicatorMax(n);
var value = serieData.GetCurrData(n, dataChangeDuration); var value = serieData.GetCurrData(n, dataChangeDuration);
if (serieData.IsDataChanged()) dataChanging = true; if (serieData.IsDataChanged()) dataChanging = true;
if (max == 0) if (max == 0)
{ {
max = serie.context.dataMax; if (serie.data.Count > 1)
{
SerieHelper.GetMinMaxData(serie, n, out min, out max);
min = ChartHelper.GetMinDivisibleValue(min, 0);
max = ChartHelper.GetMaxDivisibleValue(max, 0);
if (min > 0) min = 0;
}
else
{
max = serie.context.dataMax;
}
} }
var radius = (float)(max < 0 ? m_RadarCoord.context.dataRadius - m_RadarCoord.context.dataRadius * value / max var radius = (float)(m_RadarCoord.context.dataRadius * (value - min) / (max - min));
: m_RadarCoord.context.dataRadius * value / max);
var currAngle = (n + (m_RadarCoord.positionType == RadarCoord.PositionType.Between ? 0.5f : 0)) * angle; var currAngle = (n + (m_RadarCoord.positionType == RadarCoord.PositionType.Between ? 0.5f : 0)) * angle;
radius *= rate; radius *= rate;
if (n == 0) if (n == 0)
@@ -243,9 +231,9 @@ namespace XCharts
{ {
UGL.DrawTriangle(vh, startPoint, toPoint, centerPos, areaColor, areaColor, areaToColor); UGL.DrawTriangle(vh, startPoint, toPoint, centerPos, areaColor, areaColor, areaToColor);
} }
if (serie.lineStyle.show) if (lineStyle.show)
{ {
ChartDrawer.DrawLineStyle(vh, serie.lineStyle.type, lineWidth, startPoint, toPoint, lineColor); ChartDrawer.DrawLineStyle(vh, lineStyle.type, lineWidth, startPoint, toPoint, lineColor);
} }
startPoint = toPoint; startPoint = toPoint;
} }
@@ -255,23 +243,23 @@ namespace XCharts
{ {
UGL.DrawTriangle(vh, startPoint, firstPoint, centerPos, areaColor, areaColor, areaToColor); UGL.DrawTriangle(vh, startPoint, firstPoint, centerPos, areaColor, areaColor, areaToColor);
} }
if (serie.lineStyle.show) if (lineStyle.show)
{ {
ChartDrawer.DrawLineStyle(vh, serie.lineStyle.type, lineWidth, startPoint, firstPoint, lineColor); ChartDrawer.DrawLineStyle(vh, lineStyle.type, lineWidth, startPoint, firstPoint, lineColor);
} }
if (serie.symbol.show && serie.symbol.type != SymbolType.None) if (symbol.show && symbol.type != SymbolType.None)
{ {
for (int m = 0; m < serieData.context.dataPoints.Count; m++) for (int m = 0; m < serieData.context.dataPoints.Count; m++)
{ {
var point = serieData.context.dataPoints[m]; var point = serieData.context.dataPoints[m];
var symbolSize = isHighlight var symbolSize = isHighlight
? serie.symbol.GetSelectedSize(null, chart.theme.serie.lineSymbolSelectedSize) ? symbol.GetSelectedSize(null, chart.theme.serie.lineSymbolSelectedSize)
: serie.symbol.GetSize(null, chart.theme.serie.lineSymbolSize); : symbol.GetSize(null, chart.theme.serie.lineSymbolSize);
if (!serieData.interact.TryGetValue(ref symbolSize, ref interacting)) if (!serieData.interact.TryGetValue(ref symbolSize, ref interacting))
{ {
symbolSize = isHighlight symbolSize = isHighlight
? serie.symbol.GetSelectedSize(serieData.data, symbolSize) ? symbol.GetSelectedSize(serieData.data, symbolSize)
: serie.symbol.GetSize(serieData.data, symbolSize); : symbol.GetSize(serieData.data, symbolSize);
serieData.interact.SetValue(ref interacting, symbolSize); serieData.interact.SetValue(ref interacting, symbolSize);
symbolSize = serie.animation.GetSysmbolSize(symbolSize); symbolSize = serie.animation.GetSysmbolSize(symbolSize);
} }
@@ -281,8 +269,8 @@ namespace XCharts
var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, chart.theme, isHighlight); var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, chart.theme, isHighlight);
var borderColor = SerieHelper.GetSymbolBorderColor(serie, serieData, chart.theme, isHighlight); var borderColor = SerieHelper.GetSymbolBorderColor(serie, serieData, chart.theme, isHighlight);
var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, isHighlight); var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, isHighlight);
chart.DrawSymbol(vh, serie.symbol.type, symbolSize, symbolBorder, point, symbolColor, chart.DrawSymbol(vh, symbol.type, symbolSize, symbolBorder, point, symbolColor,
symbolToColor, symbolEmptyColor, borderColor, serie.symbol.gap, cornerRadius); symbolToColor, symbolEmptyColor, borderColor, symbol.gap, cornerRadius);
} }
} }
} }
@@ -335,13 +323,16 @@ namespace XCharts
serieData.context.labelPosition = Vector3.zero; serieData.context.labelPosition = Vector3.zero;
continue; continue;
} }
var lineStyle = SerieHelper.GetLineStyle(serie, serieData);
var areaStyle = SerieHelper.GetAreaStyle(serie, serieData);
var isHighlight = serie.context.pointerEnter; var isHighlight = serie.context.pointerEnter;
var areaColor = SerieHelper.GetAreaColor(serie, chart.theme, j, isHighlight); var areaColor = SerieHelper.GetAreaColor(serie, serieData, chart.theme, j, isHighlight);
var areaToColor = SerieHelper.GetAreaToColor(serie, chart.theme, j, isHighlight); var areaToColor = SerieHelper.GetAreaToColor(serie, serieData, chart.theme, j, isHighlight);
var lineColor = SerieHelper.GetLineColor(serie, chart.theme, j, isHighlight); var lineColor = SerieHelper.GetLineColor(serie, serieData, chart.theme, j, isHighlight);
int dataCount = radar.indicatorList.Count; int dataCount = radar.indicatorList.Count;
var index = serieData.index; var index = serieData.index;
var p = radar.context.center; var p = radar.context.center;
var min = radar.GetIndicatorMin(index);
var max = radar.GetIndicatorMax(index); var max = radar.GetIndicatorMax(index);
var value = serieData.GetCurrData(1, dataChangeDuration); var value = serieData.GetCurrData(1, dataChangeDuration);
if (serieData.IsDataChanged()) dataChanging = true; if (serieData.IsDataChanged()) dataChanging = true;
@@ -369,16 +360,16 @@ namespace XCharts
{ {
toPoint = new Vector3(p.x + radius * Mathf.Sin(currAngle), toPoint = new Vector3(p.x + radius * Mathf.Sin(currAngle),
p.y + radius * Mathf.Cos(currAngle)); p.y + radius * Mathf.Cos(currAngle));
if (serie.areaStyle.show) if (areaStyle != null && areaStyle.show)
{ {
UGL.DrawTriangle(vh, startPoint, toPoint, p, areaColor, areaColor, areaToColor); UGL.DrawTriangle(vh, startPoint, toPoint, p, areaColor, areaColor, areaToColor);
} }
if (serie.lineStyle.show) if (lineStyle.show)
{ {
if (radar.connectCenter) if (radar.connectCenter)
ChartDrawer.DrawLineStyle(vh, serie.lineStyle, startPoint, centerPos, ChartDrawer.DrawLineStyle(vh, lineStyle, startPoint, centerPos,
chart.theme.serie.lineWidth, LineStyle.Type.Solid, lastColor, lastColor); chart.theme.serie.lineWidth, LineStyle.Type.Solid, lastColor, lastColor);
ChartDrawer.DrawLineStyle(vh, serie.lineStyle, startPoint, toPoint, chart.theme.serie.lineWidth, ChartDrawer.DrawLineStyle(vh, lineStyle, startPoint, toPoint, chart.theme.serie.lineWidth,
LineStyle.Type.Solid, radar.lineGradient ? lastColor : lineColor, lineColor); LineStyle.Type.Solid, radar.lineGradient ? lastColor : lineColor, lineColor);
} }
startPoint = toPoint; startPoint = toPoint;
@@ -387,16 +378,16 @@ namespace XCharts
serieData.context.position = startPoint; serieData.context.position = startPoint;
serieData.context.labelPosition = startPoint; serieData.context.labelPosition = startPoint;
if (serie.areaStyle.show && j == endIndex) if (areaStyle != null && areaStyle.show && j == endIndex)
{ {
UGL.DrawTriangle(vh, startPoint, firstPoint, centerPos, areaColor, areaColor, areaToColor); UGL.DrawTriangle(vh, startPoint, firstPoint, centerPos, areaColor, areaColor, areaToColor);
} }
if (serie.lineStyle.show && j == endIndex) if (lineStyle.show && j == endIndex)
{ {
if (radar.connectCenter) if (radar.connectCenter)
ChartDrawer.DrawLineStyle(vh, serie.lineStyle, startPoint, centerPos, ChartDrawer.DrawLineStyle(vh, lineStyle, startPoint, centerPos,
chart.theme.serie.lineWidth, LineStyle.Type.Solid, lastColor, lastColor); chart.theme.serie.lineWidth, LineStyle.Type.Solid, lastColor, lastColor);
ChartDrawer.DrawLineStyle(vh, serie.lineStyle, startPoint, firstPoint, chart.theme.serie.lineWidth, ChartDrawer.DrawLineStyle(vh, lineStyle, startPoint, firstPoint, chart.theme.serie.lineWidth,
LineStyle.Type.Solid, lineColor, radar.lineGradient ? firstColor : lineColor); LineStyle.Type.Solid, lineColor, radar.lineGradient ? firstColor : lineColor);
} }
} }

View File

@@ -1617,7 +1617,7 @@ namespace XCharts
{ {
if (useDataNameForColor) if (useDataNameForColor)
{ {
return IsSerieDataLegendName(legendName); return IsSerieDataLegendName(legendName) || IsSerieLegendName(legendName);
} }
else else
{ {

View File

@@ -23,6 +23,8 @@ namespace XCharts
[SerializeField] private List<Emphasis> m_Emphases = new List<Emphasis>(); [SerializeField] private List<Emphasis> m_Emphases = new List<Emphasis>();
[SerializeField] private List<SymbolStyle> m_Symbols = new List<SymbolStyle>(); [SerializeField] private List<SymbolStyle> m_Symbols = new List<SymbolStyle>();
[SerializeField] private List<IconStyle> m_IconStyles = new List<IconStyle>(); [SerializeField] private List<IconStyle> m_IconStyles = new List<IconStyle>();
[SerializeField] private List<LineStyle> m_LineStyles = new List<LineStyle>();
[SerializeField] private List<AreaStyle> m_AreaStyles = new List<AreaStyle>();
[SerializeField] private List<double> m_Data = new List<double>(); [SerializeField] private List<double> m_Data = new List<double>();
[SerializeField] private List<int> m_Children = new List<int>(); [SerializeField] private List<int> m_Children = new List<int>();
@@ -77,6 +79,8 @@ namespace XCharts
/// 单个数据项的标记设置。 /// 单个数据项的标记设置。
/// </summary> /// </summary>
public SymbolStyle symbol { get { return m_Symbols.Count > 0 ? m_Symbols[0] : null; } } public SymbolStyle symbol { get { return m_Symbols.Count > 0 ? m_Symbols[0] : null; } }
public LineStyle lineStyle { get { return m_LineStyles.Count > 0 ? m_LineStyles[0] : null; } }
public AreaStyle areaStyle { get { return m_AreaStyles.Count > 0 ? m_AreaStyles[0] : null; } }
/// <summary> /// <summary>
/// 是否忽略数据。当为 true 时,数据不进行绘制。 /// 是否忽略数据。当为 true 时,数据不进行绘制。
/// </summary> /// </summary>
@@ -124,6 +128,8 @@ namespace XCharts
m_ItemStyles.Clear(); m_ItemStyles.Clear();
m_Emphases.Clear(); m_Emphases.Clear();
m_Symbols.Clear(); m_Symbols.Clear();
m_LineStyles.Clear();
m_AreaStyles.Clear();
} }
public T GetOrAddComponent<T>() where T : ChildComponent public T GetOrAddComponent<T>() where T : ChildComponent
@@ -165,6 +171,18 @@ namespace XCharts
m_Symbols.Add(new SymbolStyle() { show = true }); m_Symbols.Add(new SymbolStyle() { show = true });
return m_Symbols[0] as T; return m_Symbols[0] as T;
} }
else if (type == typeof(LineStyle))
{
if (m_LineStyles.Count == 0)
m_LineStyles.Add(new LineStyle() { show = true });
return m_LineStyles[0] as T;
}
else if (type == typeof(AreaStyle))
{
if (m_AreaStyles.Count == 0)
m_AreaStyles.Add(new AreaStyle() { show = true });
return m_AreaStyles[0] as T;
}
else else
{ {
throw new System.Exception("SerieData not support component:" + type); throw new System.Exception("SerieData not support component:" + type);
@@ -179,6 +197,8 @@ namespace XCharts
m_LabelLines.Clear(); m_LabelLines.Clear();
m_Symbols.Clear(); m_Symbols.Clear();
m_Emphases.Clear(); m_Emphases.Clear();
m_LineStyles.Clear();
m_AreaStyles.Clear();
} }
public void RemoveComponent<T>() where T : ISerieDataComponent public void RemoveComponent<T>() where T : ISerieDataComponent
@@ -196,6 +216,10 @@ namespace XCharts
m_Emphases.Clear(); m_Emphases.Clear();
else if (type == typeof(SymbolStyle)) else if (type == typeof(SymbolStyle))
m_Symbols.Clear(); m_Symbols.Clear();
else if (type == typeof(LineStyle))
m_LineStyles.Clear();
else if (type == typeof(AreaStyle))
m_AreaStyles.Clear();
else else
throw new System.Exception("SerieData not support component:" + type); throw new System.Exception("SerieData not support component:" + type);
} }

View File

@@ -11,6 +11,7 @@ namespace XCharts
{ {
public BaseChart chart { get; internal set; } public BaseChart chart { get; internal set; }
public SerieHandlerAttribute attribute { get; internal set; } public SerieHandlerAttribute attribute { get; internal set; }
public virtual int defaultDimension { get; internal set; }
public virtual void InitComponent() { } public virtual void InitComponent() { }
public virtual void RemoveComponent() { } public virtual void RemoveComponent() { }
@@ -62,6 +63,8 @@ namespace XCharts
m_NeedInitComponent = true; m_NeedInitComponent = true;
} }
public override void Update() public override void Update()
{ {
if (m_NeedInitComponent) if (m_NeedInitComponent)
@@ -124,7 +127,13 @@ namespace XCharts
public override void OnLegendButtonClick(int index, string legendName, bool show) public override void OnLegendButtonClick(int index, string legendName, bool show)
{ {
if (serie.IsLegendName(legendName)) if (serie.useDataNameForColor && serie.IsSerieDataLegendName(legendName))
{
LegendHelper.CheckDataShow(serie, legendName, show);
chart.UpdateLegendColor(legendName, show);
chart.RefreshPainter(serie);
}
else if (serie.IsLegendName(legendName))
{ {
chart.SetSerieActive(serie, show); chart.SetSerieActive(serie, show);
chart.RefreshPainter(serie); chart.RefreshPainter(serie);
@@ -133,7 +142,12 @@ namespace XCharts
public override void OnLegendButtonEnter(int index, string legendName) public override void OnLegendButtonEnter(int index, string legendName)
{ {
if (serie.IsLegendName(legendName)) if (serie.useDataNameForColor && serie.IsSerieDataLegendName(legendName))
{
LegendHelper.CheckDataHighlighted(serie, legendName, true);
chart.RefreshPainter(serie);
}
else if (serie.IsLegendName(legendName))
{ {
m_LegendEnter = true; m_LegendEnter = true;
chart.RefreshPainter(serie); chart.RefreshPainter(serie);
@@ -142,7 +156,12 @@ namespace XCharts
public override void OnLegendButtonExit(int index, string legendName) public override void OnLegendButtonExit(int index, string legendName)
{ {
if (serie.IsLegendName(legendName)) if (serie.useDataNameForColor && serie.IsSerieDataLegendName(legendName))
{
LegendHelper.CheckDataHighlighted(serie, legendName, false);
chart.RefreshPainter(serie);
}
else if (serie.IsLegendName(legendName))
{ {
m_LegendEnter = false; m_LegendEnter = false;
chart.RefreshPainter(serie); chart.RefreshPainter(serie);
@@ -272,7 +291,7 @@ namespace XCharts
var emphasisLabel = SerieHelper.GetSerieEmphasisLabel(serie, serieData); var emphasisLabel = SerieHelper.GetSerieEmphasisLabel(serie, serieData);
var isHighlight = (serieData.context.highlight && emphasisLabel != null && emphasisLabel.show); var isHighlight = (serieData.context.highlight && emphasisLabel != null && emphasisLabel.show);
var iconStyle = SerieHelper.GetIconStyle(serie, serieData); var iconStyle = SerieHelper.GetIconStyle(serie, serieData);
var isIgnore = serie.IsIgnoreIndex(serieData.index); var isIgnore = serie.IsIgnoreIndex(serieData.index, defaultDimension);
var currLabel = isHighlight && emphasisLabel != null ? emphasisLabel : serieLabel; var currLabel = isHighlight && emphasisLabel != null ? emphasisLabel : serieLabel;
serieData.labelObject.SetPosition(serieData.context.position); serieData.labelObject.SetPosition(serieData.context.position);
@@ -286,7 +305,7 @@ namespace XCharts
{ {
var content = serie.useDataNameForColor && string.IsNullOrEmpty(currLabel.formatter) var content = serie.useDataNameForColor && string.IsNullOrEmpty(currLabel.formatter)
? serieData.name ? serieData.name
: SerieLabelHelper.GetFormatterContent(serie, serieData, serieData.GetData(1), total, : SerieLabelHelper.GetFormatterContent(serie, serieData, serieData.GetData(defaultDimension), total,
currLabel, chart.theme.GetColor(colorIndex)); currLabel, chart.theme.GetColor(colorIndex));
var invert = currLabel.autoOffset var invert = currLabel.autoOffset

View File

@@ -1,6 +1,9 @@
using System; using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using UnityEngine;
namespace XCharts namespace XCharts
{ {
@@ -44,5 +47,76 @@ namespace XCharts
callback((T)item); callback((T)item);
} }
} }
public static object DeepCloneSerializeField(object obj)
{
if (obj == null)
return null;
var type = obj.GetType();
if (type.IsValueType || type == typeof(string))
{
return obj;
}
else if (type.IsArray)
{
var elementType = Type.GetType(type.FullName.Replace("[]", string.Empty));
var array = obj as Array;
var copied = Array.CreateInstance(elementType, array.Length);
for (int i = 0; i < array.Length; i++)
copied.SetValue(DeepCloneSerializeField(array.GetValue(i)), i);
return Convert.ChangeType(copied, obj.GetType());
}
else if (type.IsClass)
{
object returnObj;
var listObj = obj as IList;
if (listObj != null)
{
var properties = type.GetProperties();
var customList = typeof(List<>).MakeGenericType((properties[properties.Length - 1]).PropertyType);
returnObj = (IList)Activator.CreateInstance(customList);
var list = (IList)returnObj;
foreach (var item in ((IList)obj))
{
if (item == null)
continue;
list.Add(DeepCloneSerializeField(item));
}
}
else
{
try
{
returnObj = Activator.CreateInstance(type);
}
catch
{
return null;
}
var fileds = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
for (int i = 0; i < fileds.Length; i++)
{
var field = fileds[i];
if (!field.IsDefined(typeof(SerializeField), false))
continue;
var filedValue = field.GetValue(obj);
if (filedValue == null)
{
field.SetValue(returnObj, filedValue);
}
else
{
field.SetValue(returnObj, DeepCloneSerializeField(filedValue));
}
}
}
return returnObj;
}
else
{
throw new ArgumentException("DeepCloneSerializeField: Unknown type:" + type + "," + obj);
}
}
} }
} }