[feature][symbol] support symbol settings for StateStyle

This commit is contained in:
monitor1394
2022-07-27 08:00:57 +08:00
parent b3b0c0b3aa
commit 5b2b2d4059
16 changed files with 216 additions and 258 deletions

View File

@@ -57,9 +57,11 @@
## master
* (2022.07.24) 增加`StateStyle``Symbol`用于配置状态下的标记样式
* (2022.07.24) 去掉`SerieSymbol``selectedSize`配置
* (2022.07.24) 增加`Serie``SerieData``state`设置默认状态
* (2022.07.22) 增加`Serie`的三种状态`EmphasisStyle`,`BlurStyle`,`SelectStyle`
* (2022.07.22) 去掉`AreaStyle``m_HighlightColor``m_HighlightToColor`配置
* (2022.07.22) 去掉`AreaStyle``highlightColor``highlightToColor`配置
* (2022.07.22) 去掉`Emphasis`,`EmphasisItemStyle`,`EmphasisLabelStyle`,`EmphasisLabelLine`组件
* (2022.07.20) 文档支持用`Since`标识类从哪个版本开始支持
* (2022.07.20) 修复`Axis``Value`轴时,`AxisLabel``showStartLabel``showEndLabel`参数设置不生效的问题

View File

@@ -31,12 +31,10 @@ namespace XCharts.Editor
{
case SymbolSizeType.Custom:
PropertyField(prop, "m_Size");
PropertyField(prop, "m_SelectedSize");
break;
case SymbolSizeType.FromData:
PropertyField(prop, "m_DataIndex");
PropertyField(prop, "m_DataScale");
PropertyField(prop, "m_SelectedDataScale");
break;
case SymbolSizeType.Function:
break;

View File

@@ -16,6 +16,7 @@ namespace XCharts.Editor
{
++EditorGUI.indentLevel;
OnCustomGUI(prop);
PropertyField(prop, "m_Symbol");
PropertyField(prop, "m_ItemStyle");
PropertyField(prop, "m_Label");
PropertyField(prop, "m_LabelLine");

View File

@@ -18,7 +18,6 @@ namespace XCharts.Example
foreach (var serie in chart.series)
{
serie.symbol.sizeFunction = SymbolSize;
serie.symbol.selectedSizeFunction = SymbolSelectedSize;
}
}
@@ -26,10 +25,5 @@ namespace XCharts.Example
{
return (float) (Math.Sqrt(data[2]) / 6e2);
}
float SymbolSelectedSize(List<double> data)
{
return (float) (Math.Sqrt(data[2]) / 5e2);
}
}
}

View File

@@ -34,12 +34,9 @@ namespace XCharts.Runtime
public class SerieSymbol : SymbolStyle, ISerieDataComponent
{
[SerializeField] private SymbolSizeType m_SizeType = SymbolSizeType.Custom;
[SerializeField] private float m_SelectedSize = 0f;
[SerializeField] private int m_DataIndex = 1;
[SerializeField] private float m_DataScale = 1;
[SerializeField] private float m_SelectedDataScale = 1.5f;
[SerializeField] private SymbolSizeFunction m_SizeFunction;
[SerializeField] private SymbolSizeFunction m_SelectedSizeFunction;
[SerializeField] private int m_StartIndex;
[SerializeField] private int m_Interval;
[SerializeField] private bool m_ForceShowLast = false;
@@ -49,12 +46,9 @@ namespace XCharts.Runtime
{
base.Reset();
m_SizeType = SymbolSizeType.Custom;
m_SelectedSize = 0f;
m_DataIndex = 1;
m_DataScale = 1;
m_SelectedDataScale = 1.5f;
m_SizeFunction = null;
m_SelectedSizeFunction = null;
m_StartIndex = 0;
m_Interval = 0;
m_ForceShowLast = false;
@@ -71,15 +65,6 @@ namespace XCharts.Runtime
set { if (PropertyUtil.SetStruct(ref m_SizeType, value)) SetVerticesDirty(); }
}
/// <summary>
/// the size of selected symbol.
/// |被选中的标记的大小。
/// </summary>
public float selectedSize
{
get { return m_SelectedSize; }
set { if (PropertyUtil.SetStruct(ref m_SelectedSize, value)) SetVerticesDirty(); }
}
/// <summary>
/// whitch data index is when the sizeType assined as FromData.
/// |当sizeType指定为FromData时指定的数据源索引。
/// </summary>
@@ -98,15 +83,6 @@ namespace XCharts.Runtime
set { if (PropertyUtil.SetStruct(ref m_DataScale, value)) SetVerticesDirty(); }
}
/// <summary>
/// the scale of selected data when sizeType assined as FromData.
/// |当sizeType指定为FromData时指定的高亮倍数系数。
/// </summary>
public float selectedDataScale
{
get { return m_SelectedDataScale; }
set { if (PropertyUtil.SetStruct(ref m_SelectedDataScale, value)) SetVerticesDirty(); }
}
/// <summary>
/// the function of size when sizeType assined as Function.
/// |当sizeType指定为Function时指定的委托函数。
/// </summary>
@@ -116,15 +92,6 @@ namespace XCharts.Runtime
set { if (PropertyUtil.SetClass(ref m_SizeFunction, value)) SetVerticesDirty(); }
}
/// <summary>
/// the function of size when sizeType assined as Function.
/// |当sizeType指定为Function时指定的高亮委托函数。
/// </summary>
public SymbolSizeFunction selectedSizeFunction
{
get { return m_SelectedSizeFunction; }
set { if (PropertyUtil.SetClass(ref m_SelectedSizeFunction, value)) SetVerticesDirty(); }
}
/// <summary>
/// the index start to show symbol.
/// |开始显示图形标记的索引。
/// </summary>
@@ -187,42 +154,6 @@ namespace XCharts.Runtime
}
}
/// <summary>
/// 根据sizeType获得高亮时的标记大小
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public float GetSelectedSize(List<double> data, float themeSelectedSize)
{
switch (m_SizeType)
{
case SymbolSizeType.Custom:
return selectedSize == 0 ? themeSelectedSize : selectedSize;
case SymbolSizeType.FromData:
if (data != null && dataIndex >= 0 && dataIndex < data.Count)
{
return (float) data[dataIndex] * m_SelectedDataScale;
}
else
{
return selectedSize == 0 ? themeSelectedSize : selectedSize;
}
case SymbolSizeType.Function:
if (data != null && selectedSizeFunction != null)
return selectedSizeFunction(data);
else
return selectedSize == 0 ? themeSelectedSize : selectedSize;
default:
return selectedSize == 0 ? themeSelectedSize : selectedSize;
}
}
public bool ShowSymbol(int dataIndex, int dataCount)
{
if (!show)

View File

@@ -242,9 +242,10 @@ namespace XCharts.Runtime
private void DrawMarkLineSymbol(VertexHelper vh, SymbolStyle symbol, Serie serie, GridCoord grid, ThemeStyle theme,
Vector3 pos, Vector3 startPos, Color32 lineColor)
{
var tickness = SerieHelper.GetSymbolBorder(serie, null, theme);
var borderColor = SerieHelper.GetSymbolBorderColor(serie, null, theme);
var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, null);
float tickness = 0f;
float[] cornerRadius = null;
Color32 borderColor;
SerieHelper.GetSymbolInfo(out borderColor, out tickness, out cornerRadius, serie, null, chart.theme);
chart.DrawClipSymbol(vh, symbol.type, symbol.size, tickness, pos, lineColor, lineColor,
ColorUtil.clearColor32, borderColor, symbol.gap, true, cornerRadius, grid, startPos);
}

View File

@@ -16,6 +16,7 @@ namespace XCharts.Runtime
[SerializeField] private ItemStyle m_ItemStyle = new ItemStyle();
[SerializeField] private LineStyle m_LineStyle = new LineStyle();
[SerializeField] private AreaStyle m_AreaStyle = new AreaStyle();
[SerializeField] private SerieSymbol m_Symbol = new SerieSymbol();
public void Reset()
{
@@ -23,6 +24,7 @@ namespace XCharts.Runtime
m_Label.Reset();
m_LabelLine.Reset();
m_ItemStyle.Reset();
m_Symbol.Reset();
}
/// <summary>
@@ -73,6 +75,14 @@ namespace XCharts.Runtime
get { return m_AreaStyle; }
set { if (PropertyUtil.SetClass(ref m_AreaStyle, value, true)) SetVerticesDirty(); }
}
/// <summary>
/// 标记样式。
/// </summary>
public SerieSymbol symbol
{
get { return m_Symbol; }
set { if (PropertyUtil.SetClass(ref m_Symbol, value, true)) SetVerticesDirty(); }
}
public override bool vertsDirty
{
@@ -82,7 +92,8 @@ namespace XCharts.Runtime
m_Label.vertsDirty ||
m_ItemStyle.vertsDirty ||
m_LineStyle.vertsDirty ||
m_AreaStyle.vertsDirty;
m_AreaStyle.vertsDirty ||
m_Symbol.vertsDirty;
}
}
@@ -102,12 +113,14 @@ namespace XCharts.Runtime
m_ItemStyle.ClearVerticesDirty();
m_LineStyle.ClearVerticesDirty();
m_AreaStyle.ClearVerticesDirty();
m_Symbol.ClearVerticesDirty();
}
public override void ClearComponentDirty()
{
base.ClearComponentDirty();
m_Label.ClearComponentDirty();
m_Symbol.ClearComponentDirty();
}
}
}

View File

@@ -836,7 +836,7 @@ namespace XCharts.Runtime
}
}
public static Color32 GetHighlightColor(Color32 color, float rate = 0.8f)
public static Color32 GetHighlightColor(Color32 color, float rate = 1.2f)
{
var newColor = color;
newColor.r = (byte) (color.r * rate);
@@ -852,7 +852,7 @@ namespace XCharts.Runtime
return newColor;
}
public static Color32 GetSelectColor(Color32 color, float rate = 0.7f)
public static Color32 GetSelectColor(Color32 color, float rate = 0.8f)
{
var newColor = color;
newColor.r = (byte) (color.r * rate);

View File

@@ -56,70 +56,62 @@ namespace XCharts.Runtime
}
m_LastCheckContextFlag = needCheck;
var themeSymbolSize = chart.theme.serie.lineSymbolSize;
var themeSymbolSelectedSize = chart.theme.serie.lineSymbolSelectedSize;
var needInteract = false;
if (m_LegendEnter)
{
serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate);
for (int i = 0; i < serie.dataCount; i++)
{
var serieData = serie.data[i];
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize);
serieData.context.highlight = true;
serieData.interact.SetValue(ref needInteract, symbolSelectedSize);
}
}
else if (serie.context.isTriggerByAxis)
{
serie.context.pointerEnter = true;
serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate);
for (int i = 0; i < serie.dataCount; i++)
{
var serieData = serie.data[i];
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
var symbolSize = symbol.GetSize(serieData.data, themeSymbolSize);
var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize);
if (i == serie.context.pointerItemDataIndex)
var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, SerieState.Emphasis);
serieData.context.highlight = true;
serieData.interact.SetValue(ref needInteract, size);
}
}
else if (serie.context.isTriggerByAxis)
{
serie.context.pointerEnter = false;
serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate);
for (int i = 0; i < serie.dataCount; i++)
{
var serieData = serie.data[i];
var highlight = i == serie.context.pointerItemDataIndex;
serieData.context.highlight = highlight;
var state = SerieHelper.GetSerieState(serie, serieData, true);
var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, state);
serieData.interact.SetValue(ref needInteract, size);
if (highlight)
{
serieData.context.highlight = true;
serieData.interact.SetValue(ref needInteract, symbolSelectedSize);
}
else
{
serieData.context.highlight = false;
serieData.interact.SetValue(ref needInteract, symbolSize);
serie.context.pointerEnter = true;
serie.context.pointerItemDataIndex = i;
}
}
}
else
{
var lastIndex = serie.context.pointerItemDataIndex;
serie.context.pointerItemDataIndex = -1;
serie.context.pointerEnter = false;
for (int i = 0; i < serie.dataCount; i++)
{
var serieData = serie.data[i];
serieData.index = i;
var dist = Vector3.Distance(chart.pointerPos, serieData.context.position);
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
var symbolSize = symbol.GetSize(serieData.data, themeSymbolSize);
var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize);
if (dist <= symbolSelectedSize)
var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize);
var highlight = dist <= size;
serieData.context.highlight = highlight;
var state = SerieHelper.GetSerieState(serie, serieData, true);
size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, state);
serieData.interact.SetValue(ref needInteract, size);
if (highlight)
{
serie.context.pointerItemDataIndex = serieData.index;
serie.context.pointerEnter = true;
serie.context.pointerItemDataIndex = serieData.index;
serie.interact.SetValue(ref needInteract, lineWidth, true);
serieData.context.highlight = true;
serieData.interact.SetValue(ref needInteract, symbolSelectedSize);
}
else
{
serieData.context.highlight = false;
serieData.interact.SetValue(ref needInteract, symbolSize);
}
}
if (lastIndex != serie.context.pointerItemDataIndex)
needInteract = true;
}
if (needInteract)
{
@@ -157,8 +149,8 @@ namespace XCharts.Runtime
continue;
if (serieData.context.isClip)
continue;
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
var state = SerieHelper.GetSerieState(serie, serieData, true);
var symbol = SerieHelper.GetSerieSymbol(serie, serieData, state);
if (!symbol.show || !symbol.ShowSymbol(i, count))
continue;
@@ -175,30 +167,24 @@ namespace XCharts.Runtime
if (ChartHelper.IsIngore(pos))
continue;
var highlight = serie.data[i].context.highlight || serie.highlight;
var symbolSize = highlight ?
theme.serie.lineSymbolSelectedSize :
theme.serie.lineSymbolSize;
var symbolSize = 0f;
if (!serieData.interact.TryGetValue(ref symbolSize, ref interacting))
{
symbolSize = highlight ?
symbol.GetSelectedSize(serieData.data, symbolSize) :
symbol.GetSize(serieData.data, symbolSize);
symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, chart.theme.serie.lineSymbolSize, state);
serieData.interact.SetValue(ref interacting, symbolSize);
symbolSize = serie.animation.GetSysmbolSize(symbolSize);
}
var state = SerieHelper.GetSerieState(serie, serieData);
Color32 symbolColor, symbolToColor,symbolEmptyColor;
SerieHelper.GetItemColor(out symbolColor, out symbolToColor,out symbolEmptyColor, serie, serieData, theme, serie.index, state);
float symbolBorder = 0f;
float[] cornerRadius = null;
Color32 symbolColor, symbolToColor, symbolEmptyColor, borderColor;
SerieHelper.GetItemColor(out symbolColor, out symbolToColor, out symbolEmptyColor, serie, serieData, theme, serie.index);
SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, null, chart.theme, state);
if (isVisualMapGradient)
{
symbolColor = VisualMapHelper.GetLineGradientColor(visualMap, pos, m_SerieGrid, axis, relativedAxis, symbolColor);
symbolToColor = symbolColor;
}
var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, theme, state);
var borderColor = SerieHelper.GetSymbolBorderColor(serie, serieData, theme, state);
var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, state);
chart.DrawClipSymbol(vh, symbol.type, symbolSize, symbolBorder, pos,
symbolColor, symbolToColor, symbolEmptyColor, borderColor, symbol.gap, clip, cornerRadius, m_SerieGrid,
i > 0 ? serie.context.dataPoints[i - 1] : m_SerieGrid.context.position);

View File

@@ -47,21 +47,19 @@ namespace XCharts.Runtime
}
m_LastCheckContextFlag = needCheck;
var themeSymbolSize = chart.theme.serie.lineSymbolSize;
var themeSymbolSelectedSize = chart.theme.serie.lineSymbolSelectedSize;
lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
var needInteract = false;
if (m_LegendEnter)
{
serie.context.pointerEnter = true;
serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate);
for (int i = 0; i < serie.dataCount; i++)
{
var serieData = serie.data[i];
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize);
var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, SerieState.Emphasis);
serieData.context.highlight = true;
serieData.interact.SetValue(ref needInteract, symbolSelectedSize);
serieData.interact.SetValue(ref needInteract, size);
}
}
else
@@ -205,27 +203,23 @@ namespace XCharts.Runtime
continue;
var count = serie.dataCount;
Color32 symbolColor, symbolToColor,symbolEmptyColor;
float symbolBorder = 0f;
float[] cornerRadius = null;
Color32 symbolColor, symbolToColor, symbolEmptyColor, borderColor;
for (int i = 0; i < count; i++)
{
var serieData = serie.GetSerieData(i);
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
var state = SerieHelper.GetSerieState(serie, serieData, true);
var symbol = SerieHelper.GetSerieSymbol(serie, serieData, state);
if (ChartHelper.IsIngore(serieData.context.position))
continue;
bool highlight = serieData.context.highlight || serie.highlight;
if ((!symbol.show || !symbol.ShowSymbol(i, count) || serie.IsPerformanceMode()) &&
!serieData.context.highlight)
if (!symbol.show || !symbol.ShowSymbol(i, count))
continue;
var symbolSize = highlight ?
symbol.GetSelectedSize(serieData.data, chart.theme.serie.lineSymbolSize) :
symbol.GetSize(serieData.data, chart.theme.serie.lineSymbolSize);
var state = SerieHelper.GetSerieState(serie, serieData);
SerieHelper.GetItemColor(out symbolColor, out symbolToColor,out symbolEmptyColor, serie, serieData, chart.theme, n);
var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, chart.theme, state);
var borderColor = SerieHelper.GetSymbolBorderColor(serie, serieData, chart.theme, state);
var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, state);
var symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, chart.theme.serie.lineSymbolSize, state);
SerieHelper.GetItemColor(out symbolColor, out symbolToColor, out symbolEmptyColor, serie, serieData, chart.theme, n);
SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, null, chart.theme, state);
symbolSize = serie.animation.GetSysmbolSize(symbolSize);
chart.DrawSymbol(vh, symbol.type, symbolSize, symbolBorder, serieData.context.position,

View File

@@ -261,8 +261,6 @@ namespace XCharts.Runtime
var isY = axis is YAxis;
var isVisualMapGradient = VisualMapHelper.IsNeedLineGradient(visualMap);
var isLineStyleGradient = serie.lineStyle.IsNeedGradient();
//var highlight = serie.highlight || serie.context.pointerEnter;
var lineColor = SerieHelper.GetLineColor(serie, null, theme, serie.context.colorIndex);
var lastDataIsIgnore = datas[0].isIgnoreBreak;

View File

@@ -73,15 +73,14 @@ namespace XCharts.Runtime
var needInteract = false;
if (m_LegendEnter)
{
serie.context.pointerEnter = true;
serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate);
for (int i = 0; i < serie.dataCount; i++)
{
var serieData = serie.data[i];
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize);
var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, SerieState.Emphasis);
serieData.context.highlight = true;
serieData.interact.SetValue(ref needInteract, symbolSelectedSize);
serieData.interact.SetValue(ref needInteract, size);
}
}
else if (serie.context.isTriggerByAxis)
@@ -91,47 +90,42 @@ namespace XCharts.Runtime
for (int i = 0; i < serie.dataCount; i++)
{
var serieData = serie.data[i];
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
var symbolSize = symbol.GetSize(serieData.data, themeSymbolSize);
var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize);
if (i == serie.context.pointerItemDataIndex)
var highlight = i == serie.context.pointerItemDataIndex;
serieData.context.highlight = highlight;
var state = SerieHelper.GetSerieState(serie, serieData, true);
var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, state);
serieData.interact.SetValue(ref needInteract, size);
if (highlight)
{
serieData.context.highlight = true;
serieData.interact.SetValue(ref needInteract, symbolSelectedSize);
}
else
{
serieData.context.highlight = false;
serieData.interact.SetValue(ref needInteract, symbolSize);
serie.context.pointerEnter = true;
serie.context.pointerItemDataIndex = i;
}
}
}
else
{
var lastIndex = serie.context.pointerItemDataIndex;
serie.context.pointerItemDataIndex = -1;
serie.context.pointerEnter = false;
foreach (var serieData in serie.data)
for (int i = 0; i < serie.dataCount; i++)
{
var serieData = serie.data[i];
var dist = Vector3.Distance(chart.pointerPos, serieData.context.position);
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
var symbolSize = symbol.GetSize(serieData.data, themeSymbolSize);
var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize);
if (dist <= symbolSelectedSize)
var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize);
var highlight = dist <= size;
serieData.context.highlight = highlight;
var state = SerieHelper.GetSerieState(serie, serieData, true);
size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, state);
serieData.interact.SetValue(ref needInteract, size);
if (highlight)
{
serie.context.pointerItemDataIndex = serieData.index;
serie.context.pointerEnter = true;
serie.context.pointerItemDataIndex = serieData.index;
serie.interact.SetValue(ref needInteract, lineWidth, true);
serieData.context.highlight = true;
serieData.interact.SetValue(ref needInteract, symbolSelectedSize);
}
else
{
serieData.context.highlight = false;
serieData.interact.SetValue(ref needInteract, symbolSize);
}
}
if (lastIndex != serie.context.pointerItemDataIndex)
needInteract = true;
}
if (needInteract)
{

View File

@@ -224,10 +224,10 @@ namespace XCharts.Runtime
{
continue;
}
var serieState = SerieHelper.GetSerieState(serie, serieData, true);
var lineStyle = SerieHelper.GetLineStyle(serie, serieData);
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
var isHighlight = serieData.context.highlight;
var serieState = SerieHelper.GetSerieState(serie, serieData);
var symbol = SerieHelper.GetSerieSymbol(serie, serieData, serieState);
var colorIndex = chart.GetLegendRealShowNameIndex(serieData.legendName);
var showArea = SerieHelper.GetAreaColor(out areaColor, out areaToColor, serie, serieData, chart.theme, colorIndex);
var lineColor = SerieHelper.GetLineColor(serie, serieData, chart.theme, colorIndex);
@@ -300,25 +300,21 @@ namespace XCharts.Runtime
if (symbol.show && symbol.type != SymbolType.None)
{
float symbolBorder = 0f;
float[] cornerRadius = null;
Color32 symbolColor, symbolToColor, symbolEmptyColor, borderColor;
for (int m = 0; m < serieData.context.dataPoints.Count; m++)
{
var point = serieData.context.dataPoints[m];
var symbolSize = isHighlight ?
symbol.GetSelectedSize(null, chart.theme.serie.lineSymbolSelectedSize) :
symbol.GetSize(null, chart.theme.serie.lineSymbolSize);
var symbolSize = 0f;
if (!serieData.interact.TryGetValue(ref symbolSize, ref interacting))
{
symbolSize = isHighlight ?
symbol.GetSelectedSize(serieData.data, symbolSize) :
symbol.GetSize(serieData.data, symbolSize);
symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, chart.theme.serie.lineSymbolSize, serieState);
serieData.interact.SetValue(ref interacting, symbolSize);
symbolSize = serie.animation.GetSysmbolSize(symbolSize);
}
Color32 symbolColor, symbolToColor, symbolEmptyColor;
SerieHelper.GetItemColor(out symbolColor, out symbolToColor, out symbolEmptyColor, serie, serieData, chart.theme, j, serieState);
var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, chart.theme, serieState);
var borderColor = SerieHelper.GetSymbolBorderColor(serie, serieData, chart.theme, serieState);
var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, serieState);
SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, serieData, chart.theme, serieState);
chart.DrawSymbol(vh, symbol.type, symbolSize, symbolBorder, point, symbolColor,
symbolToColor, symbolEmptyColor, borderColor, symbol.gap, cornerRadius);
}
@@ -451,20 +447,18 @@ namespace XCharts.Runtime
}
if (serie.symbol.show && serie.symbol.type != SymbolType.None)
{
float symbolBorder = 0f;
float[] cornerRadius = null;
Color32 symbolColor, symbolToColor, symbolEmptyColor, borderColor;
for (int j = 0; j < serie.data.Count; j++)
{
var serieData = serie.data[j];
if (!serieData.show) continue;
var state = SerieHelper.GetSerieState(serie, serieData);
var serieIndex = serieData.index;
var symbolSize = state == SerieState.Emphasis ?
serie.symbol.GetSelectedSize(serieData.data, chart.theme.serie.lineSymbolSelectedSize) :
serie.symbol.GetSize(serieData.data, chart.theme.serie.lineSymbolSize);
Color32 symbolColor, symbolToColor,symbolEmptyColor;
SerieHelper.GetItemColor(out symbolColor, out symbolToColor,out symbolEmptyColor, serie, serieData, chart.theme, serieIndex, state);
var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, chart.theme, state);
var borderColor = SerieHelper.GetSymbolBorderColor(serie, serieData, chart.theme, state);
var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, state);
var symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, chart.theme.serie.lineSymbolSize, state);
SerieHelper.GetItemColor(out symbolColor, out symbolToColor, out symbolEmptyColor, serie, serieData, chart.theme, serieIndex, state);
SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, serieData, chart.theme, state);
if (!radar.IsInIndicatorRange(j, serieData.GetData(1)))
{
symbolColor = radar.outRangeColor;

View File

@@ -82,22 +82,21 @@ namespace XCharts.Runtime
for (int i = serie.dataCount - 1; i >= 0; i--)
{
var serieData = serie.data[i];
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
var symbolSize = symbol.GetSize(serieData.data, themeSymbolSize);
var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize);
var symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize);
if (m_LegendEnter ||
(!needHideAll && Vector3.Distance(serieData.context.position, chart.pointerPos) <= symbolSize))
{
serie.context.pointerItemDataIndex = i;
serie.context.pointerEnter = true;
serieData.context.highlight = true;
serieData.interact.SetValue(ref needInteract, symbolSelectedSize);
}
else
{
serieData.context.highlight = false;
serieData.interact.SetValue(ref needInteract, symbolSize);
}
var state = SerieHelper.GetSerieState(serie, serieData, true);
symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, state);
serieData.interact.SetValue(ref needInteract, symbolSize);
}
if (needInteract)
{
@@ -144,19 +143,19 @@ namespace XCharts.Runtime
serie.containerIndex = m_Grid.index;
serie.containterInstanceId = m_Grid.instanceId;
float symbolBorder = 0f;
float[] cornerRadius = null;
Color32 color, toColor, emptyColor, borderColor;
foreach (var serieData in dataList)
{
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
if (!symbol.ShowSymbol(serieData.index, maxCount))
continue;
var highlight = serie.highlight || serieData.context.highlight;
var state = SerieHelper.GetSerieState(serie, serieData);
Color32 color, toColor, emptyColor;
var state = SerieHelper.GetSerieState(serie, serieData, true);
SerieHelper.GetItemColor(out color, out toColor, out emptyColor, serie, serieData, chart.theme, colorIndex, state);
var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, theme, state);
var borderColor = SerieHelper.GetSymbolBorderColor(serie, serieData, theme, state);
var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, state);
SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, serieData, chart.theme, state);
double xValue = serieData.GetCurrData(0, dataChangeDuration, xAxis.inverse);
double yValue = serieData.GetCurrData(1, dataChangeDuration, yAxis.inverse);
@@ -175,14 +174,10 @@ namespace XCharts.Runtime
serie.context.dataPoints.Add(pos);
serieData.context.position = pos;
var datas = serieData.data;
var symbolSize = serie.highlight || serieData.context.highlight ?
theme.serie.scatterSymbolSelectedSize :
theme.serie.scatterSymbolSize;
var symbolSize = 0f;
if (!serieData.interact.TryGetValue(ref symbolSize, ref interacting))
{
symbolSize = highlight ?
symbol.GetSelectedSize(serieData.data, symbolSize) :
symbol.GetSize(serieData.data, symbolSize);
symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, chart.theme.serie.scatterSymbolSize, state);
serieData.interact.SetValue(ref interacting, symbolSize);
}
@@ -249,24 +244,25 @@ namespace XCharts.Runtime
serie.containerIndex = axis.index;
serie.containterInstanceId = axis.instanceId;
float symbolBorder = 0f;
float[] cornerRadius = null;
Color32 color, toColor, emptyColor, borderColor;
foreach (var serieData in dataList)
{
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
if (!symbol.ShowSymbol(serieData.index, maxCount))
continue;
var state = SerieHelper.GetSerieState(serie, serieData);
Color32 color, toColor, emptyColor;
var state = SerieHelper.GetSerieState(serie, serieData, true);
SerieHelper.GetItemColor(out color, out toColor, out emptyColor, serie, serieData, chart.theme, colorIndex, state);
var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, theme, state);
var borderColor = SerieHelper.GetSymbolBorderColor(serie, serieData, theme, state);
var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, state);
var xValue = serieData.GetCurrData(0, dataChangeDuration, axis.inverse);
SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, serieData, chart.theme, state);
if (serieData.IsDataChanged())
dataChanging = true;
var pos = Vector3.zero;
var xValue = serieData.GetCurrData(0, dataChangeDuration, axis.inverse);
if (axis.orient == Orient.Horizonal)
{
var xDataHig = GetDataHig(axis, xValue, axis.context.width);
@@ -283,11 +279,7 @@ namespace XCharts.Runtime
serieData.context.position = pos;
var datas = serieData.data;
var symbolSize = 0f;
if (serie.highlight || serieData.context.highlight)
symbolSize = symbol.GetSelectedSize(datas, theme.serie.scatterSymbolSelectedSize);
else
symbolSize = symbol.GetSize(datas, theme.serie.scatterSymbolSize);
var symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, chart.theme.serie.scatterSymbolSize, state);
symbolSize *= rate;
if (isEffectScatter)

View File

@@ -16,6 +16,7 @@ namespace XCharts.Runtime
{
"m_Id",
"m_ParentId",
"m_State",
"m_Ignore",
"m_Selected",
"m_Radius",

View File

@@ -248,13 +248,20 @@ namespace XCharts.Runtime
return serie.state;
}
public static SerieState GetSerieState(Serie serie, SerieData serieData)
public static SerieState GetSerieState(SerieData serieData)
{
if (serieData == null || serieData.state == SerieState.Auto) return GetSerieState(serie);
if (serieData.context.highlight) return SerieState.Emphasis;
return serieData.state;
}
public static SerieState GetSerieState(Serie serie, SerieData serieData, bool defaultSerieState = false)
{
if (serieData == null) return GetSerieState(serie);
if (serieData.context.highlight) return SerieState.Emphasis;
if (serieData.state == SerieState.Auto) return defaultSerieState?serie.state : GetSerieState(serie);
return serieData.state;
}
public static Color32 GetItemBackgroundColor(Serie serie, SerieData serieData, ThemeStyle theme, int index,
SerieState state = SerieState.Auto, bool useDefault = false)
{
@@ -443,10 +450,18 @@ namespace XCharts.Runtime
return stateStyle == null?serie.labelLine : stateStyle.labelLine;
}
public static SerieSymbol GetSerieSymbol(Serie serie, SerieData serieData)
public static SerieSymbol GetSerieSymbol(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)
{
if (!serie.IsPerformanceMode() && serieData.symbol != null) return serieData.symbol;
else return serie.symbol;
if (state == SerieState.Auto) state = GetSerieState(serie, serieData);
if (state == SerieState.Normal)
{
return serieData != null && serieData.symbol != null? serieData.symbol : serie.symbol;
}
else
{
var stateStyle = GetStateStyle(serie, serieData, state);
return stateStyle == null?serie.symbol : stateStyle.symbol;
}
}
public static LineStyle GetLineStyle(Serie serie, SerieData serieData)
@@ -579,29 +594,73 @@ namespace XCharts.Runtime
{
if (!ChartHelper.IsClearColor(checkColor)) color = checkColor;
else if (!ChartHelper.IsClearColor(itemColor)) color = itemColor;
if (ChartHelper.IsClearColor(color)) color = theme.GetColor(colorIndex);
if (ChartHelper.IsClearColor(color) && colorIndex >= 0) color = theme.GetColor(colorIndex);
if (setOpacity) ChartHelper.SetColorOpacity(ref color, opacity);
}
public static float GetSymbolBorder(Serie serie, SerieData serieData, ThemeStyle theme, SerieState state = SerieState.Auto)
public static void GetSymbolInfo(out Color32 borderColor, out float border, out float[] cornerRadius,
Serie serie, SerieData serieData, ThemeStyle theme, SerieState state = SerieState.Auto)
{
var itemStyle = GetItemStyle(serie, serieData, state);
if (itemStyle != null && itemStyle.borderWidth != 0) return itemStyle.borderWidth;
else return serie.lineStyle.GetWidth(theme.serie.lineWidth) * 2;
borderColor = ChartConst.clearColor32;
if (state == SerieState.Auto)
state = GetSerieState(serie, serieData);
var stateStyle = GetStateStyle(serie, serieData, state);
if (stateStyle == null)
{
var itemStyle = GetItemStyle(serie, serieData, SerieState.Normal);
border = itemStyle.borderWidth != 0 ? itemStyle.borderWidth : serie.lineStyle.GetWidth(theme.serie.lineWidth);
cornerRadius = itemStyle.cornerRadius;
GetColor(ref borderColor, itemStyle.borderColor, itemStyle.borderColor, 1, theme, -1);
switch (state)
{
case SerieState.Emphasis:
borderColor = ChartHelper.GetHighlightColor(borderColor);
break;
case SerieState.Blur:
borderColor = ChartHelper.GetBlurColor(borderColor);
break;
case SerieState.Select:
borderColor = ChartHelper.GetSelectColor(borderColor);
break;
default:
break;
}
}
else
{
var itemStyle = stateStyle.itemStyle;
border = itemStyle.borderWidth != 0 ? itemStyle.borderWidth : stateStyle.lineStyle.GetWidth(theme.serie.lineWidth);
cornerRadius = itemStyle.cornerRadius;
GetColor(ref borderColor, stateStyle.itemStyle.borderColor, ColorUtil.clearColor32, 1, theme, -1);
}
}
public static Color32 GetSymbolBorderColor(Serie serie, SerieData serieData, ThemeStyle theme, SerieState state = SerieState.Auto)
public static float GetSysmbolSize(Serie serie, SerieData serieData, ThemeStyle theme, float defaultSize, SerieState state = SerieState.Auto)
{
var itemStyle = GetItemStyle(serie, serieData, state);
if (itemStyle != null && !ChartHelper.IsClearColor(itemStyle.borderColor)) return itemStyle.borderColor;
else return serie.itemStyle.borderColor;
}
public static float[] GetSymbolCornerRadius(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)
{
var itemStyle = GetItemStyle(serie, serieData, state);
if (itemStyle != null) return itemStyle.cornerRadius;
else return null;
if (state == SerieState.Auto)
state = GetSerieState(serie, serieData);
var stateStyle = GetStateStyle(serie, serieData, state);
var size = 0f;
if (stateStyle == null)
{
var symbol = GetSerieSymbol(serie, serieData, SerieState.Normal);
size = symbol.GetSize(serieData.data, defaultSize);
switch (state)
{
case SerieState.Emphasis:
case SerieState.Select:
size *= theme.serie.selectedRate;
break;
default:
break;
}
}
else
{
var symbol = stateStyle.symbol;
size = symbol.GetSize(serieData.data, defaultSize);
}
return size;
}
public static string GetNumericFormatter(Serie serie, SerieData serieData, string defaultFormatter = null)