UI update 02
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts.Runtime
|
||||
{
|
||||
[System.Serializable]
|
||||
public class EndLabelStyle : LabelStyle
|
||||
{
|
||||
public EndLabelStyle()
|
||||
{
|
||||
m_Offset = new Vector3(5, 0, 0);
|
||||
m_TextStyle.alignment = TextAnchor.MiddleLeft;
|
||||
m_NumericFormatter = "f0";
|
||||
m_Formatter = "{a}:{c}";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b3ca55f3ab0314339ae171c8ac07c4e2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,166 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts.Runtime
|
||||
{
|
||||
/// <summary>
|
||||
/// 标签的引导线
|
||||
/// </summary>
|
||||
[System.Serializable]
|
||||
public class LabelLine : ChildComponent, ISerieComponent, ISerieDataComponent
|
||||
{
|
||||
/// <summary>
|
||||
/// 标签视觉引导线类型
|
||||
/// </summary>
|
||||
public enum LineType
|
||||
{
|
||||
/// <summary>
|
||||
/// 折线
|
||||
/// </summary>
|
||||
BrokenLine,
|
||||
/// <summary>
|
||||
/// 曲线
|
||||
/// </summary>
|
||||
Curves,
|
||||
/// <summary>
|
||||
/// 水平线
|
||||
/// </summary>
|
||||
HorizontalLine
|
||||
}
|
||||
|
||||
[SerializeField] private bool m_Show = true;
|
||||
[SerializeField] private LineType m_LineType = LineType.BrokenLine;
|
||||
[SerializeField] private Color32 m_LineColor = ChartConst.clearColor32;
|
||||
[SerializeField] private float m_LineAngle = 60;
|
||||
[SerializeField] private float m_LineWidth = 1.0f;
|
||||
[SerializeField] private float m_LineGap = 1.0f;
|
||||
[SerializeField] private float m_LineLength1 = 25f;
|
||||
[SerializeField] private float m_LineLength2 = 15f;
|
||||
[SerializeField][Since("v3.8.0")] private float m_LineEndX = 0f;
|
||||
[SerializeField] private SymbolStyle m_StartSymbol = new SymbolStyle() { show = false, type = SymbolType.Circle, size = 3 };
|
||||
[SerializeField] private SymbolStyle m_EndSymbol = new SymbolStyle() { show = false, type = SymbolType.Circle, size = 3 };
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
m_Show = false;
|
||||
m_LineType = LineType.BrokenLine;
|
||||
m_LineColor = Color.clear;
|
||||
m_LineAngle = 60;
|
||||
m_LineWidth = 1.0f;
|
||||
m_LineGap = 1.0f;
|
||||
m_LineLength1 = 25f;
|
||||
m_LineLength2 = 15f;
|
||||
m_LineEndX = 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Whether the label line is showed.
|
||||
/// ||是否显示视觉引导线。
|
||||
/// </summary>
|
||||
public bool show
|
||||
{
|
||||
get { return m_Show; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_Show, value)) SetAllDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// the type of visual guide line.
|
||||
/// ||视觉引导线类型。
|
||||
/// </summary>
|
||||
public LineType lineType
|
||||
{
|
||||
get { return m_LineType; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_LineType, value)) SetVerticesDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// the color of visual guild line.
|
||||
/// ||视觉引导线颜色。默认和serie一致取自调色板。
|
||||
/// </summary>
|
||||
public Color32 lineColor
|
||||
{
|
||||
get { return m_LineColor; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_LineColor, value)) SetVerticesDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// the angle of visual guild line. Valid for broken line and curve line. Invalid in Pie.
|
||||
/// ||视觉引导线的固定角度。对折线和曲线有效。在Pie中无效。
|
||||
/// </summary>
|
||||
public float lineAngle
|
||||
{
|
||||
get { return m_LineAngle; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_LineAngle, value)) SetVerticesDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// the width of visual guild line.
|
||||
/// ||视觉引导线的宽度。
|
||||
/// </summary>
|
||||
public float lineWidth
|
||||
{
|
||||
get { return m_LineWidth; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_LineWidth, value)) SetVerticesDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// the gap of container and guild line.
|
||||
/// ||视觉引导线和容器的间距。
|
||||
/// </summary>
|
||||
public float lineGap
|
||||
{
|
||||
get { return m_LineGap; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_LineGap, value)) SetVerticesDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// The length of the first segment of visual guide line.
|
||||
/// ||视觉引导线第一段的长度。
|
||||
/// </summary>
|
||||
public float lineLength1
|
||||
{
|
||||
get { return m_LineLength1; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_LineLength1, value)) SetVerticesDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// The length of the second segment of visual guide line.
|
||||
/// ||视觉引导线第二段的长度。
|
||||
/// </summary>
|
||||
public float lineLength2
|
||||
{
|
||||
get { return m_LineLength2; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_LineLength2, value)) SetVerticesDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// The fixed x position of the end point of visual guide line.
|
||||
/// ||视觉引导线结束点的固定x位置。当不为0时,会代替lineLength2设定引导线的x位置。
|
||||
/// </summary>
|
||||
public float lineEndX
|
||||
{
|
||||
get { return m_LineEndX; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_LineEndX, value)) SetVerticesDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// The symbol of the start point of labelline.
|
||||
/// ||起始点的图形标记。
|
||||
/// </summary>
|
||||
public SymbolStyle startSymbol
|
||||
{
|
||||
get { return m_StartSymbol; }
|
||||
set { if (PropertyUtil.SetClass(ref m_StartSymbol, value)) SetVerticesDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// The symbol of the end point of labelline.
|
||||
/// ||结束点的图形标记。
|
||||
/// </summary>
|
||||
public SymbolStyle endSymbol
|
||||
{
|
||||
get { return m_EndSymbol; }
|
||||
set { if (PropertyUtil.SetClass(ref m_EndSymbol, value)) SetVerticesDirty(); }
|
||||
}
|
||||
|
||||
public Vector3 GetStartSymbolOffset()
|
||||
{
|
||||
return m_StartSymbol != null && m_StartSymbol.show ? m_StartSymbol.offset3 : Vector3.zero;
|
||||
}
|
||||
|
||||
public Vector3 GetEndSymbolOffset()
|
||||
{
|
||||
return m_EndSymbol != null && m_EndSymbol.show ? m_EndSymbol.offset3 : Vector3.zero;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1c3977205b6f14d8a97ae32177691580
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,542 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts.Runtime
|
||||
{
|
||||
/// <summary>
|
||||
/// Text label of chart, to explain some data information about graphic item like value, name and so on.
|
||||
/// ||图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。
|
||||
/// </summary>
|
||||
[System.Serializable]
|
||||
public class LabelStyle : ChildComponent, ISerieComponent, ISerieDataComponent
|
||||
{
|
||||
/// <summary>
|
||||
/// The position of label.
|
||||
/// ||标签的位置。
|
||||
/// </summary>
|
||||
public enum Position
|
||||
{
|
||||
Default,
|
||||
/// <summary>
|
||||
/// Outside of sectors of pie chart, which relates to corresponding sector through visual guide line.
|
||||
/// ||饼图扇区外侧,通过视觉引导线连到相应的扇区。
|
||||
/// </summary>
|
||||
Outside,
|
||||
/// <summary>
|
||||
/// Inside the sectors of pie chart.
|
||||
/// ||饼图扇区内部。
|
||||
/// </summary>
|
||||
Inside,
|
||||
/// <summary>
|
||||
/// In the center of pie chart.
|
||||
/// ||在饼图中心位置。
|
||||
/// </summary>
|
||||
Center,
|
||||
/// <summary>
|
||||
/// top of symbol.
|
||||
/// ||图形标志的顶部。
|
||||
/// </summary>
|
||||
Top,
|
||||
/// <summary>
|
||||
/// the bottom of symbol.
|
||||
/// ||图形标志的底部。
|
||||
/// </summary>
|
||||
Bottom,
|
||||
/// <summary>
|
||||
/// the left of symbol.
|
||||
/// ||图形标志的左边。
|
||||
/// </summary>
|
||||
Left,
|
||||
/// <summary>
|
||||
/// the right of symbol.
|
||||
/// ||图形标志的右边。
|
||||
/// </summary>
|
||||
Right,
|
||||
/// <summary>
|
||||
/// the start of line.
|
||||
/// ||线的起始点。
|
||||
/// </summary>
|
||||
Start,
|
||||
/// <summary>
|
||||
/// the middle of line.
|
||||
/// ||线的中点。
|
||||
/// </summary>
|
||||
Middle,
|
||||
/// <summary>
|
||||
/// the end of line.
|
||||
/// ||线的结束点。
|
||||
/// </summary>
|
||||
End
|
||||
}
|
||||
|
||||
[SerializeField] protected bool m_Show = true;
|
||||
[SerializeField] Position m_Position = Position.Default;
|
||||
[SerializeField] protected bool m_AutoOffset = false;
|
||||
[SerializeField] protected Vector3 m_Offset;
|
||||
[SerializeField] protected float m_Rotate;
|
||||
[SerializeField][Since("v3.6.0")] protected bool m_AutoRotate = false;
|
||||
[SerializeField] protected float m_Distance;
|
||||
[SerializeField] protected string m_Formatter;
|
||||
[SerializeField] protected string m_NumericFormatter = "";
|
||||
[SerializeField] protected float m_Width = 0;
|
||||
[SerializeField] protected float m_Height = 0;
|
||||
[SerializeField][Since("v3.15.0")] protected float m_FixedX = 0;
|
||||
[SerializeField][Since("v3.15.0")] protected float m_FixedY = 0;
|
||||
|
||||
[SerializeField] protected IconStyle m_Icon = new IconStyle();
|
||||
[SerializeField] protected ImageStyle m_Background = new ImageStyle();
|
||||
[SerializeField] protected TextPadding m_TextPadding = new TextPadding();
|
||||
[SerializeField] protected TextStyle m_TextStyle = new TextStyle();
|
||||
protected LabelFormatterFunction m_FormatterFunction;
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
m_Show = false;
|
||||
m_Position = Position.Default;
|
||||
m_Offset = Vector3.zero;
|
||||
m_Distance = 0;
|
||||
m_Rotate = 0;
|
||||
m_Width = 0;
|
||||
m_Height = 0;
|
||||
m_NumericFormatter = "";
|
||||
m_AutoOffset = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Whether the label is showed.
|
||||
/// ||是否显示文本标签。
|
||||
/// </summary>
|
||||
public bool show
|
||||
{
|
||||
get { return m_Show; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_Show, value)) SetAllDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// The position of label.
|
||||
/// ||标签的位置。
|
||||
/// </summary>
|
||||
public Position position
|
||||
{
|
||||
get { return m_Position; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_Position, value)) SetAllDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// label content string template formatter. \n line wrapping is supported. Formatters for some components will not take effect. <br />
|
||||
/// Template placeholder have the following, some of which apply only to fixed components: <br />
|
||||
/// `{.}` : indicates the dot mark. <br />
|
||||
/// `{a}` : indicates the series name. <br />
|
||||
/// `{b}` : category value of x axis or data name. <br />
|
||||
/// `{c}` : data value. <br />
|
||||
/// `{d}` : percentage. <br />
|
||||
/// `{e}` : indicates the data name. <br />
|
||||
/// `{f}` : data sum. <br />
|
||||
/// `{g}` : indicates the total number of data. <br />
|
||||
/// `{h}` : hexadecimal color value. <br />
|
||||
/// `{y}` : category value of y axis. <br />
|
||||
/// `{value}` : the value of the axis or legend. <br />
|
||||
/// `{index}` : the index of the axis. <br />
|
||||
/// The following placeholder apply to `UITable` components: <br />
|
||||
/// `{name}` : indicates the row name of the table. <br />
|
||||
/// `{index}` : indicates the row number of the table. <br />
|
||||
/// The following placeholder apply to `UIStatistc` components: <br />
|
||||
/// `{title}` : title text. <br />
|
||||
/// `{dd}` : day. <br />
|
||||
/// `{hh}` : hours. <br />
|
||||
/// `{mm}` : minutes. <br />
|
||||
/// `{ss}` : second. <br />
|
||||
/// `{fff}` : milliseconds. <br />
|
||||
/// `{d}` : day. <br />
|
||||
/// `{h}` : hours. <br />
|
||||
/// `{m}` : minutes. <br />
|
||||
/// `{s}` : second. <br />
|
||||
/// `{f}` : milliseconds. <br />
|
||||
/// Example :{b}:{c}<br />
|
||||
/// ||标签内容字符串模版格式器。支持用 \n 换行。部分组件的格式器会不生效。<br/>
|
||||
/// 模板通配符有以下这些,部分只适用于固定的组件:<br/>
|
||||
/// `{.}`:圆点标记。<br/>
|
||||
/// `{a}`:系列名。<br/>
|
||||
/// `{b}`:X轴类目名或数据名。<br/>
|
||||
/// `{c}`:数据值。<br/>
|
||||
/// `{d}`:百分比。<br/>
|
||||
/// `{e}`:数据名。<br/>
|
||||
/// `{f}`:数据和。<br/>
|
||||
/// `{g}`:数据总个数。<br/>
|
||||
/// `{h}`:十六进制颜色值。<br/>
|
||||
/// `{y}`:Y轴的类目名。<br/>
|
||||
/// `{value}`:坐标轴或图例的值。<br/>
|
||||
/// `{index}`:坐标轴编号。<br/>
|
||||
/// 以下通配符适用UITable组件:<br/>
|
||||
/// `{name}`: 表格的行名。<br/>
|
||||
/// `{index}`:表格的行号。<br/>
|
||||
/// 以下通配符适用UIStatistc组件:<br/>
|
||||
/// `{title}`:标题文本。<br/>
|
||||
/// `{dd}`:天。<br/>
|
||||
/// `{hh}`:小时。<br/>
|
||||
/// `{mm}`:分钟。<br/>
|
||||
/// `{ss}`:秒。<br/>
|
||||
/// `{fff}`:毫秒。<br/>
|
||||
/// `{d}`:天。<br/>
|
||||
/// `{h}`:小时。<br/>
|
||||
/// `{m}`:分钟。<br/>
|
||||
/// `{s}`:秒。<br/>
|
||||
/// `{f}`:毫秒。<br/>
|
||||
/// 示例:“{b}:{c}”
|
||||
/// </summary>
|
||||
public string formatter
|
||||
{
|
||||
get { return m_Formatter; }
|
||||
set { if (PropertyUtil.SetClass(ref m_Formatter, value)) SetComponentDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// Standard number and date format string. Used to format a Double value or a DateTime date as a string.
|
||||
/// numericFormatter is used as an argument to either `Double.ToString ()` or `DateTime.ToString()`. <br />
|
||||
/// The number format uses the Axx format: A is a single-character format specifier that supports C currency,
|
||||
/// D decimal, E exponent, F fixed-point number, G regular, N digit, P percentage, R round trip, and X hexadecimal.
|
||||
/// xx is precision specification, from 0-99. E.g. F1, E2<br />
|
||||
/// Date format: Starts with `date`, which is used to format DateTime. Common date formats are:
|
||||
/// yyyy year, MM month, dd day, HH hour, mm minute, ss second, fff millisecond. For example: date:yyyy-MM-dd HH:mm:ss<br />
|
||||
/// Time format: Starts with `time`, which is used to format TimeSpan. Common time formats are:
|
||||
/// d day, HH hour, mm minute, ss second, fffffff fractional part.
|
||||
/// Only the version of Unity2018 or later can support formatting, and the characters inside should be escaped.
|
||||
/// For example: time:HH\:mm\:ss<br />
|
||||
/// number format reference: https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings<br/>
|
||||
/// date format reference: https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings<br/>
|
||||
/// Note: The date and time formats are only supported by 'v3.12.0' or later.<br/>
|
||||
/// ||标准数字和日期格式字符串。用于将Double数值或DateTime日期格式化显示为字符串。numericFormatter用来作为Double.ToString()或DateTime.ToString()的参数。<br/>
|
||||
/// 数字格式使用Axx的形式:A是格式说明符的单字符,支持C货币、D十进制、E指数、F定点数、G常规、N数字、P百分比、R往返、X十六进制的。xx是精度说明,从0-99。如:F1, E2<br/>
|
||||
/// 日期格式:以`date`开头,用来格式化DateTime,常见格式有:yyyy年,MM月,dd日,HH时,mm分,ss秒,fff毫秒。如:date:yyyy-MM-dd HH:mm:ss<br/>
|
||||
/// 时间格式:以`time`开头,用来格式化TimeSpan,常见格式有:d日,HH时,mm分,ss秒,fffffff小数部分。
|
||||
/// 需要Unity2018以上版本才支持格式化,并且里面的字符要转义。如:time:d\.HH\:mm\:ss<br/>
|
||||
/// 数值格式化参考:https://docs.microsoft.com/zh-cn/dotnet/standard/base-types/standard-numeric-format-strings <br/>
|
||||
/// 日期格式化参考:https://learn.microsoft.com/zh-cn/dotnet/standard/base-types/standard-date-and-time-format-strings <br/>
|
||||
/// 时间格式化参考:https://learn.microsoft.com/zh-cn/dotnet/standard/base-types/standard-timespan-format-strings <br/>
|
||||
/// 注意:date和time格式需要`v3.12.0`以上版本才支持。
|
||||
/// </summary>
|
||||
public string numericFormatter
|
||||
{
|
||||
get { return m_NumericFormatter; }
|
||||
set { if (PropertyUtil.SetClass(ref m_NumericFormatter, value)) SetComponentDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// offset to the host graphic element.
|
||||
/// ||距离图形元素的偏移
|
||||
/// </summary>
|
||||
public Vector3 offset
|
||||
{
|
||||
get { return m_Offset; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_Offset, value)) SetAllDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// Rotation of label.
|
||||
/// ||文本的旋转。
|
||||
/// </summary>
|
||||
public float rotate
|
||||
{
|
||||
get { return m_Rotate; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_Rotate, value)) SetComponentDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// auto rotate of label.
|
||||
/// ||是否自动旋转。
|
||||
/// </summary>
|
||||
public bool autoRotate
|
||||
{
|
||||
get { return m_AutoRotate; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_AutoRotate, value)) SetComponentDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// the distance of label to axis line.
|
||||
/// ||距离轴线的距离。
|
||||
/// </summary>
|
||||
public float distance
|
||||
{
|
||||
get { return m_Distance; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_Distance, value)) SetAllDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// the width of label. If set as default value 0, it means than the label width auto set as the text width.
|
||||
/// ||标签的宽度。一般不用指定,不指定时则自动是文字的宽度。
|
||||
/// </summary>
|
||||
public float width
|
||||
{
|
||||
get { return m_Width; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_Width, value)) SetComponentDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// the height of label. If set as default value 0, it means than the label height auto set as the text height.
|
||||
/// ||标签的高度。一般不用指定,不指定时则自动是文字的高度。
|
||||
/// </summary>
|
||||
public float height
|
||||
{
|
||||
get { return m_Height; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_Height, value)) SetComponentDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// the text padding of label.
|
||||
/// ||文本的边距。
|
||||
/// </summary>
|
||||
public TextPadding textPadding
|
||||
{
|
||||
get { return m_TextPadding; }
|
||||
set { if (PropertyUtil.SetClass(ref m_TextPadding, value)) SetComponentDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// Whether to automatically offset. When turned on, the Y offset will automatically determine the opening of the curve to determine whether to offset up or down.
|
||||
/// ||是否开启自动偏移。当开启时,Y的偏移会自动判断曲线的开口来决定向上还是向下偏移。
|
||||
/// </summary>
|
||||
public bool autoOffset
|
||||
{
|
||||
get { return m_AutoOffset; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_AutoOffset, value)) SetAllDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// the fixed x of label. When not 0, it will be fixed on the specified x value.
|
||||
/// ||固定的X值。不为0时,会固定在指定的X值上。
|
||||
/// </summary>
|
||||
public float fixedX
|
||||
{
|
||||
get { return m_FixedX; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_FixedX, value)) SetComponentDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// the fixed y of label. When not 0, it will be fixed on the specified y value.
|
||||
/// ||固定的Y值。不为0时,会固定在指定的Y值上。
|
||||
/// </summary>
|
||||
public float fixedY
|
||||
{
|
||||
get { return m_FixedY; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_FixedY, value)) SetComponentDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// the sytle of background.
|
||||
/// ||背景图样式。
|
||||
/// </summary>
|
||||
public ImageStyle background
|
||||
{
|
||||
get { return m_Background; }
|
||||
set { if (PropertyUtil.SetClass(ref m_Background, value)) SetAllDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// the sytle of icon.
|
||||
/// ||图标样式。
|
||||
/// </summary>
|
||||
public IconStyle icon
|
||||
{
|
||||
get { return m_Icon; }
|
||||
set { if (PropertyUtil.SetClass(ref m_Icon, value)) SetAllDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// the sytle of text.
|
||||
/// ||文本样式。
|
||||
/// </summary>
|
||||
public TextStyle textStyle
|
||||
{
|
||||
get { return m_TextStyle; }
|
||||
set { if (PropertyUtil.SetClass(ref m_TextStyle, value)) SetAllDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// the formatter function of label, which supports string template and callback function.
|
||||
/// ||标签的文本格式化函数,支持字符串模版和回调函数。
|
||||
/// </summary>
|
||||
public LabelFormatterFunction formatterFunction
|
||||
{
|
||||
get { return m_FormatterFunction; }
|
||||
set { m_FormatterFunction = value; }
|
||||
}
|
||||
/// <summary>
|
||||
/// whether the label is inside.
|
||||
/// ||是否在内部。
|
||||
/// </summary>
|
||||
public bool IsInside()
|
||||
{
|
||||
return m_Position == Position.Inside || m_Position == Position.Center;
|
||||
}
|
||||
|
||||
public bool IsDefaultPosition(Position position)
|
||||
{
|
||||
return m_Position == Position.Default || m_Position == position;
|
||||
}
|
||||
|
||||
public bool IsAutoSize()
|
||||
{
|
||||
return width == 0 && height == 0;
|
||||
}
|
||||
|
||||
public Vector3 GetOffset(float radius)
|
||||
{
|
||||
var x = ChartHelper.GetActualValue(m_Offset.x, radius);
|
||||
var y = ChartHelper.GetActualValue(m_Offset.y, radius);
|
||||
var z = ChartHelper.GetActualValue(m_Offset.z, radius);
|
||||
return new Vector3(x, y, z);
|
||||
}
|
||||
|
||||
public Color GetColor(Color defaultColor)
|
||||
{
|
||||
if (ChartHelper.IsClearColor(textStyle.color))
|
||||
{
|
||||
return IsInside() ? Color.black : defaultColor;
|
||||
}
|
||||
else
|
||||
{
|
||||
return textStyle.color;
|
||||
}
|
||||
}
|
||||
|
||||
public virtual LabelStyle Clone()
|
||||
{
|
||||
var label = new LabelStyle();
|
||||
label.m_Show = m_Show;
|
||||
label.m_Position = m_Position;
|
||||
label.m_Offset = m_Offset;
|
||||
label.m_Rotate = m_Rotate;
|
||||
label.m_Distance = m_Distance;
|
||||
label.m_Formatter = m_Formatter;
|
||||
label.m_Width = m_Width;
|
||||
label.m_Height = m_Height;
|
||||
label.m_NumericFormatter = m_NumericFormatter;
|
||||
label.m_AutoOffset = m_AutoOffset;
|
||||
label.m_FixedX = m_FixedX;
|
||||
label.m_FixedY = m_FixedY;
|
||||
label.m_Icon.Copy(m_Icon);
|
||||
label.m_Background.Copy(m_Background);
|
||||
label.m_TextPadding = m_TextPadding;
|
||||
label.m_TextStyle.Copy(m_TextStyle);
|
||||
return label;
|
||||
}
|
||||
|
||||
public virtual void Copy(LabelStyle label)
|
||||
{
|
||||
m_Show = label.m_Show;
|
||||
m_Position = label.m_Position;
|
||||
m_Offset = label.m_Offset;
|
||||
m_Rotate = label.m_Rotate;
|
||||
m_Distance = label.m_Distance;
|
||||
m_Formatter = label.m_Formatter;
|
||||
m_Width = label.m_Width;
|
||||
m_Height = label.m_Height;
|
||||
m_NumericFormatter = label.m_NumericFormatter;
|
||||
m_AutoOffset = label.m_AutoOffset;
|
||||
m_FixedX = label.m_FixedX;
|
||||
m_FixedY = label.m_FixedY;
|
||||
m_Icon.Copy(label.m_Icon);
|
||||
m_Background.Copy(label.m_Background);
|
||||
m_TextPadding = label.m_TextPadding;
|
||||
m_TextStyle.Copy(label.m_TextStyle);
|
||||
}
|
||||
|
||||
public virtual string GetFormatterContent(int labelIndex, int totalIndex, string category)
|
||||
{
|
||||
if (string.IsNullOrEmpty(category))
|
||||
return GetFormatterFunctionContent(labelIndex, category, category);
|
||||
|
||||
if (string.IsNullOrEmpty(m_Formatter))
|
||||
{
|
||||
return GetFormatterFunctionContent(labelIndex, category, category);
|
||||
}
|
||||
else
|
||||
{
|
||||
var content = m_Formatter;
|
||||
FormatterHelper.ReplaceAxisLabelContent(ref content, category, labelIndex, totalIndex);
|
||||
return GetFormatterFunctionContent(labelIndex, category, category);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual string GetFormatterContent(int labelIndex, int totalIndex, double value, double minValue, double maxValue, bool isLog = false)
|
||||
{
|
||||
var newNumericFormatter = numericFormatter;
|
||||
if (value == 0 && !DateTimeUtil.IsDateOrTimeRegex(newNumericFormatter))
|
||||
{
|
||||
newNumericFormatter = "f0";
|
||||
}
|
||||
else if (string.IsNullOrEmpty(newNumericFormatter) && !isLog)
|
||||
{
|
||||
if (Math.Abs(maxValue) >= Math.Abs(minValue))
|
||||
{
|
||||
newNumericFormatter = MathUtil.IsInteger(maxValue) ? "0.#" : "f" + MathUtil.GetPrecision(maxValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
newNumericFormatter = MathUtil.IsInteger(minValue) ? "0.#" : "f" + MathUtil.GetPrecision(minValue);
|
||||
}
|
||||
}
|
||||
if (string.IsNullOrEmpty(m_Formatter))
|
||||
{
|
||||
if (isLog)
|
||||
{
|
||||
return GetFormatterFunctionContent(labelIndex, value, ChartCached.NumberToStr(value, newNumericFormatter));
|
||||
}
|
||||
if (minValue >= -1 && minValue <= 1 && maxValue >= -1 && maxValue <= 1)
|
||||
{
|
||||
int minAcc = MathUtil.GetPrecision(minValue);
|
||||
int maxAcc = MathUtil.GetPrecision(maxValue);
|
||||
int curAcc = MathUtil.GetPrecision(value);
|
||||
int acc = Mathf.Max(Mathf.Max(minAcc, maxAcc), curAcc);
|
||||
return GetFormatterFunctionContent(labelIndex, value, ChartCached.FloatToStr(value, newNumericFormatter, acc));
|
||||
}
|
||||
return GetFormatterFunctionContent(labelIndex, value, ChartCached.NumberToStr(value, newNumericFormatter));
|
||||
}
|
||||
else
|
||||
{
|
||||
var content = m_Formatter;
|
||||
FormatterHelper.ReplaceAxisLabelContent(ref content, newNumericFormatter, value, labelIndex, totalIndex);
|
||||
return GetFormatterFunctionContent(labelIndex, value, content);
|
||||
}
|
||||
}
|
||||
|
||||
private static bool isDateFormatter = false;
|
||||
private static string newFormatter = null;
|
||||
public string GetFormatterDateTime(int labelIndex, int totalIndex, double value, double minValue, double maxValue, bool local)
|
||||
{
|
||||
var timestamp = value;
|
||||
var dateTime = DateTimeUtil.GetDateTime(timestamp, local);
|
||||
var dateString = string.Empty;
|
||||
if (string.IsNullOrEmpty(numericFormatter) || numericFormatter.Equals("f2"))
|
||||
{
|
||||
dateString = DateTimeUtil.GetDateTimeFormatString(dateTime, maxValue - minValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
if (DateTimeUtil.IsDateOrTimeRegex(numericFormatter, ref isDateFormatter, ref newFormatter))
|
||||
{
|
||||
if (isDateFormatter)
|
||||
dateString = ChartCached.NumberToDateStr(timestamp, newFormatter, local);
|
||||
else
|
||||
dateString = ChartCached.NumberToTimeStr(timestamp, newFormatter);
|
||||
}
|
||||
else
|
||||
{
|
||||
dateString = dateTime.ToString(numericFormatter);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
XLog.Warning("not support datetime formatter:" + numericFormatter);
|
||||
}
|
||||
}
|
||||
if (!string.IsNullOrEmpty(m_Formatter))
|
||||
{
|
||||
var content = m_Formatter;
|
||||
FormatterHelper.ReplaceAxisLabelContent(ref content, dateString, labelIndex, totalIndex);
|
||||
return GetFormatterFunctionContent(labelIndex, value, content);
|
||||
}
|
||||
else
|
||||
{
|
||||
return GetFormatterFunctionContent(labelIndex, value, dateString);
|
||||
}
|
||||
}
|
||||
|
||||
protected string GetFormatterFunctionContent(int labelIndex, string category, string currentContent)
|
||||
{
|
||||
return m_FormatterFunction == null ? currentContent :
|
||||
m_FormatterFunction(labelIndex, labelIndex, category, currentContent);
|
||||
}
|
||||
|
||||
protected string GetFormatterFunctionContent(int labelIndex, double value, string currentContent)
|
||||
{
|
||||
return m_FormatterFunction == null ? currentContent :
|
||||
m_FormatterFunction(labelIndex, value, null, currentContent);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0b2c690f282f04752898422894f61738
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,90 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts.Runtime
|
||||
{
|
||||
public static class SerieLabelHelper
|
||||
{
|
||||
|
||||
public static Color GetLabelColor(Serie serie, ThemeStyle theme, int index)
|
||||
{
|
||||
if (serie.label != null && !ChartHelper.IsClearColor(serie.label.textStyle.color))
|
||||
{
|
||||
return serie.label.textStyle.color;
|
||||
}
|
||||
else
|
||||
{
|
||||
return theme.GetColor(index);
|
||||
}
|
||||
}
|
||||
|
||||
public static bool CanShowLabel(Serie serie, SerieData serieData, LabelStyle label, int dimesion)
|
||||
{
|
||||
return serie.show && serieData.context.canShowLabel && !serie.IsIgnoreValue(serieData, dimesion);
|
||||
}
|
||||
|
||||
public static string GetFormatterContent(Serie serie, SerieData serieData,
|
||||
double dataValue, double dataTotal, LabelStyle serieLabel, Color color, BaseChart chart = null)
|
||||
{
|
||||
if (serieLabel == null)
|
||||
{
|
||||
serieLabel = SerieHelper.GetSerieLabel(serie, serieData);
|
||||
}
|
||||
var numericFormatter = serieLabel == null ? "" : serieLabel.numericFormatter;
|
||||
var serieName = serie.serieName;
|
||||
var dataName = serieData != null ? serieData.name : null;
|
||||
if (string.IsNullOrEmpty(serieLabel.formatter))
|
||||
{
|
||||
var currentContent = ChartCached.NumberToStr(dataValue, numericFormatter);
|
||||
if (serieLabel.formatterFunction == null)
|
||||
return currentContent;
|
||||
else
|
||||
return serieLabel.formatterFunction(serieData.index, dataValue, null, currentContent);
|
||||
}
|
||||
else
|
||||
{
|
||||
var content = serieLabel.formatter;
|
||||
FormatterHelper.ReplaceSerieLabelContent(ref content, numericFormatter, serie.dataCount, dataValue,
|
||||
dataTotal, serieName, dataName, dataName, color, serieData, chart, serie.index, serie.useSortData);
|
||||
if (serieLabel.formatterFunction == null)
|
||||
return content;
|
||||
else
|
||||
return serieLabel.formatterFunction(serieData.index, dataValue, null, content);
|
||||
}
|
||||
}
|
||||
|
||||
public static string GetTitleFormatterContent(Serie serie, SerieData serieData,
|
||||
int dataIndex, LabelStyle titleStyle, BaseChart chart)
|
||||
{
|
||||
string content;
|
||||
if (string.IsNullOrEmpty(titleStyle.formatter))
|
||||
{
|
||||
content = serieData.name;
|
||||
}
|
||||
else
|
||||
{
|
||||
content = titleStyle.formatter;
|
||||
FormatterHelper.ReplaceContent(ref content, dataIndex, titleStyle.numericFormatter, serie, chart, null, serieData);
|
||||
}
|
||||
return content;
|
||||
}
|
||||
|
||||
public static void SetGaugeLabelText(Serie serie)
|
||||
{
|
||||
var serieData = serie.GetSerieData(0);
|
||||
if (serieData == null) return;
|
||||
if (serieData.labelObject == null) return;
|
||||
var label = SerieHelper.GetSerieLabel(serie, serieData);
|
||||
if (label == null) return;
|
||||
var value = serieData.GetData(1);
|
||||
var total = serie.max;
|
||||
var content = SerieLabelHelper.GetFormatterContent(serie, serieData, value, total, null, Color.clear);
|
||||
serieData.labelObject.SetText(content);
|
||||
serieData.labelObject.SetPosition(serie.context.center + label.offset);
|
||||
if (!ChartHelper.IsClearColor(label.textStyle.color))
|
||||
{
|
||||
serieData.labelObject.text.SetColor(label.textStyle.color);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 654a13ef33a064e4fbf078742f397b20
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user