using System.Collections.Generic;
using UnityEngine;
namespace XCharts.Runtime
{
///
/// Legend component.The legend component shows different sets of tags, colors, and names.
/// You can control which series are not displayed by clicking on the legend.
/// |图例组件。
/// 图例组件展现了不同系列的标记,颜色和名字。可以通过点击图例控制哪些系列不显示。
///
[System.Serializable]
[ComponentHandler(typeof(LegendHandler), true)]
public class Legend : MainComponent, IPropertyChanged
{
public enum Type
{
///
/// 自动匹配。
///
Auto,
///
/// 自定义图标。
///
Custom,
///
/// 空心圆。
///
EmptyCircle,
///
/// 圆形。
///
Circle,
///
/// 正方形。可通过Setting的legendIconCornerRadius参数调整圆角。
///
Rect,
///
/// 三角形。
///
Triangle,
///
/// 菱形。
///
Diamond,
}
///
/// Selected mode of legend, which controls whether series can be toggled displaying by clicking legends.
/// |图例选择的模式,控制是否可以通过点击图例改变系列的显示状态。默认开启图例选择,可以设成 None 关闭。
///
public enum SelectedMode
{
///
/// 多选。
///
Multiple,
///
/// 单选。
///
Single,
///
/// 无法选择。
///
None
}
[SerializeField] private bool m_Show = true;
[SerializeField] private Type m_IconType = Type.Auto;
[SerializeField] private SelectedMode m_SelectedMode = SelectedMode.Multiple;
[SerializeField] private Orient m_Orient = Orient.Horizonal;
[SerializeField] private Location m_Location = new Location() { align = Location.Align.TopCenter, top = 0.125f };
[SerializeField] private float m_ItemWidth = 25.0f;
[SerializeField] private float m_ItemHeight = 12.0f;
[SerializeField] private float m_ItemGap = 10f;
[SerializeField] private bool m_ItemAutoColor = true;
[SerializeField] private float m_ItemOpacity = 1;
[SerializeField] private string m_Formatter;
[SerializeField] protected string m_NumericFormatter = "";
[SerializeField] private LabelStyle m_LabelStyle = new LabelStyle();
[SerializeField] private List m_Data = new List();
[SerializeField] private List m_Icons = new List();
[SerializeField] private List m_Colors = new List();
public LegendContext context = new LegendContext();
///
/// Whether to show legend component.
/// |是否显示图例组件。
///
public bool show
{
get { return m_Show; }
set { if (PropertyUtil.SetStruct(ref m_Show, value)) SetComponentDirty(); }
}
///
/// Type of legend.
/// |图例类型。
/// [default:Type.Auto]
///
public Type iconType
{
get { return m_IconType; }
set { if (PropertyUtil.SetStruct(ref m_IconType, value)) SetAllDirty(); }
}
///
/// Selected mode of legend, which controls whether series can be toggled displaying by clicking legends.
/// |选择模式。控制是否可以通过点击图例改变系列的显示状态。默认开启图例选择,可以设成 None 关闭。
/// [default:SelectedMode.Multiple]
///
public SelectedMode selectedMode
{
get { return m_SelectedMode; }
set { if (PropertyUtil.SetStruct(ref m_SelectedMode, value)) SetComponentDirty(); }
}
///
/// Specify whether the layout of legend component is horizontal or vertical.
/// |布局方式是横还是竖。
/// [default:Orient.Horizonal]
///
public Orient orient
{
get { return m_Orient; }
set { if (PropertyUtil.SetStruct(ref m_Orient, value)) SetComponentDirty(); }
}
///
/// The location of legend.
/// |图例显示的位置。
/// [default:Location.defaultTop]
///
public Location location
{
get { return m_Location; }
set { if (PropertyUtil.SetClass(ref m_Location, value)) SetComponentDirty(); }
}
///
/// Image width of legend symbol.
/// |图例标记的图形宽度。
/// [default:24f]
///
public float itemWidth
{
get { return m_ItemWidth; }
set { if (PropertyUtil.SetStruct(ref m_ItemWidth, value)) SetComponentDirty(); }
}
///
/// Image height of legend symbol.
/// |图例标记的图形高度。
/// [default:12f]
///
public float itemHeight
{
get { return m_ItemHeight; }
set { if (PropertyUtil.SetStruct(ref m_ItemHeight, value)) SetComponentDirty(); }
}
///
/// The distance between each legend, horizontal distance in horizontal layout, and vertical distance in vertical layout.
/// |图例每项之间的间隔。横向布局时为水平间隔,纵向布局时为纵向间隔。
/// [default:10f]
///
public float itemGap
{
get { return m_ItemGap; }
set { if (PropertyUtil.SetStruct(ref m_ItemGap, value)) SetComponentDirty(); }
}
///
/// Whether the legend symbol matches the color automatically.
/// |图例标记的图形是否自动匹配颜色。
/// [default:true]
///
public bool itemAutoColor
{
get { return m_ItemAutoColor; }
set { if (PropertyUtil.SetStruct(ref m_ItemAutoColor, value)) SetComponentDirty(); }
}
///
/// the opacity of item color.
/// |图例标记的图形的颜色透明度。
///
public float itemOpacity
{
get { return m_ItemOpacity; }
set { if (PropertyUtil.SetStruct(ref m_ItemOpacity, value)) SetComponentDirty(); }
}
///
/// Standard numeric format strings.
/// |标准数字格式字符串。用于将数值格式化显示为字符串。
/// 使用Axx的形式:A是格式说明符的单字符,支持C货币、D十进制、E指数、F定点数、G常规、N数字、P百分比、R往返、X十六进制的。xx是精度说明,从0-99。
/// 参考:https://docs.microsoft.com/zh-cn/dotnet/standard/base-types/standard-numeric-format-strings
///
///
public string numericFormatter
{
get { return m_NumericFormatter; }
set { if (PropertyUtil.SetClass(ref m_NumericFormatter, value)) SetComponentDirty(); }
}
///
/// Legend content string template formatter. Support for wrapping lines with \n. Template:{value}.
/// |图例内容字符串模版格式器。支持用 \n 换行。
/// 模板变量为图例名称 {value}。其他模板变量参考Toolip的itemFormatter。
///
public string formatter
{
get { return m_Formatter; }
set { if (PropertyUtil.SetClass(ref m_Formatter, value)) SetComponentDirty(); }
}
///
/// the style of text.
/// |文本样式。
///
public LabelStyle labelStyle
{
get { return m_LabelStyle; }
set { if (PropertyUtil.SetClass(ref m_LabelStyle, value)) SetComponentDirty(); }
}
///
/// Data array of legend. An array item is usually a name representing string. (If it is a pie chart,
/// it could also be the name of a single data in the pie chart) of a series.
/// |If data is not specified, it will be auto collected from series.
/// |图例的数据数组。数组项通常为一个字符串,每一项代表一个系列的 name(如果是饼图,也可以是饼图单个数据的 name)。
/// 如果 data 没有被指定,会自动从当前系列中获取。指定data时里面的数据项和serie匹配时才会生效。
///
public List data
{
get { return m_Data; }
set { if (value != null) { m_Data = value; SetComponentDirty(); } }
}
///
/// 自定义的图例标记图形。
///
public List icons
{
get { return m_Icons; }
set { if (value != null) { m_Icons = value; SetComponentDirty(); } }
}
///
/// the colors of legend item.
/// 图例标记的颜色列表。
///
public List colors
{
get { return m_Colors; }
set { if (value != null) { m_Colors = value; SetAllDirty(); } }
}
///
/// 图表是否需要刷新(图例组件不需要刷新图表)
///
public override bool vertsDirty { get { return false; } }
///
/// 组件是否需要刷新
///
public override bool componentDirty
{
get { return m_ComponentDirty || location.componentDirty || labelStyle.componentDirty; }
}
public override void ClearComponentDirty()
{
base.ClearComponentDirty();
location.ClearComponentDirty();
labelStyle.ClearComponentDirty();
}
///
/// Clear legend data.
/// |清空。
///
public override void ClearData()
{
m_Data.Clear();
SetComponentDirty();
}
///
/// Whether include in legend data by the specified name.
/// |是否包括由指定名字的图例
///
///
///
public bool ContainsData(string name)
{
return m_Data.Contains(name);
}
///
/// Removes the legend with the specified name.
/// |移除指定名字的图例。
///
///
public void RemoveData(string name)
{
if (m_Data.Contains(name))
{
m_Data.Remove(name);
SetComponentDirty();
}
}
///
/// Add legend data.
/// |添加图例。
///
///
public void AddData(string name)
{
if (!m_Data.Contains(name) && !string.IsNullOrEmpty(name))
{
m_Data.Add(name);
SetComponentDirty();
}
}
///
/// Gets the legend for the specified index.
/// |获得指定索引的图例。
///
///
///
public string GetData(int index)
{
if (index >= 0 && index < m_Data.Count)
{
return m_Data[index];
}
return null;
}
///
/// Gets the index of the specified legend.
/// |获得指定图例的索引。
///
///
///
public int GetIndex(string legendName)
{
return m_Data.IndexOf(legendName);
}
///
/// Remove all legend buttons.
/// |移除所有图例按钮。
///
public void RemoveButton()
{
context.buttonList.Clear();
}
///
/// Bind buttons to legends.
/// |给图例绑定按钮。
///
///
///
///
public void SetButton(string name, LegendItem item, int total)
{
context.buttonList[name] = item;
int index = context.buttonList.Values.Count;
item.SetIconActive(iconType == Type.Custom);
item.SetActive(show);
}
///
/// Update the legend button color.
/// |更新图例按钮颜色。
///
///
///
public void UpdateButtonColor(string name, Color color)
{
if (context.buttonList.ContainsKey(name))
{
context.buttonList[name].SetIconColor(color);
}
}
///
/// Update the text color of legend.
/// |更新图例文字颜色。
///
///
///
public void UpdateContentColor(string name, Color color)
{
if (context.buttonList.ContainsKey(name))
{
context.buttonList[name].SetContentColor(color);
}
}
///
/// Gets the legend button for the specified index.
/// |获得指定索引的图例按钮。
///
///
///
public Sprite GetIcon(int index)
{
if (index >= 0 && index < m_Icons.Count)
{
return m_Icons[index];
}
else
{
return null;
}
}
public Color GetColor(int index)
{
if (index >= 0 && index < m_Colors.Count)
return m_Colors[index];
else
return Color.white;
}
///
/// Callback handling when parameters change.
/// |参数变更时的回调处理。
///
public void OnChanged()
{
m_Location.OnChanged();
}
}
}