mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-14 20:00:09 +00:00
增加GaugeChart仪表盘
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
|
||||
# 更新日志
|
||||
|
||||
* (2019.11.30) 增加`GaugeChart`仪表盘
|
||||
* (2019.11.22) 修复`BarChart`清空数据重新赋值后`SerieLabel`显示异常的问题
|
||||
* (2019.11.16) 修复`SerieLabel`设置`color`等参数不生效的问题
|
||||
* (2019.11.12) 发布`v1.0.5`版本
|
||||
|
||||
@@ -66,10 +66,10 @@ namespace XCharts
|
||||
|
||||
chart.RemoveData();
|
||||
serie = chart.AddSerie(SerieType.Pie, "访问来源");
|
||||
serie.pieRadius[0] = 0;
|
||||
serie.pieRadius[1] = 110;
|
||||
serie.pieCenter[0] = 0.5f;
|
||||
serie.pieCenter[1] = 0.4f;
|
||||
serie.radius[0] = 0;
|
||||
serie.radius[1] = 110;
|
||||
serie.center[0] = 0.5f;
|
||||
serie.center[1] = 0.4f;
|
||||
chart.AddData(0, 335, "直接访问");
|
||||
chart.AddData(0, 310, "邮件营销");
|
||||
chart.AddData(0, 243, "联盟广告");
|
||||
@@ -105,10 +105,10 @@ namespace XCharts
|
||||
IEnumerator Doughnut()
|
||||
{
|
||||
chart.title.subText = "圆环图";
|
||||
serie.pieRadius[0] = 2f;
|
||||
while (serie.pieRadius[0] < serie.pieRadius[1] * 0.7f)
|
||||
serie.radius[0] = 2f;
|
||||
while (serie.radius[0] < serie.radius[1] * 0.7f)
|
||||
{
|
||||
serie.pieRadius[0] += m_RadiusSpeed * Time.deltaTime;
|
||||
serie.radius[0] += m_RadiusSpeed * Time.deltaTime;
|
||||
chart.RefreshChart();
|
||||
yield return null;
|
||||
}
|
||||
@@ -134,14 +134,14 @@ namespace XCharts
|
||||
chart.AddData(1, 335, "直达");
|
||||
chart.AddData(1, 679, "营销广告");
|
||||
chart.AddData(1, 1548, "搜索引擎");
|
||||
serie1.pieRadius[0] = 0;
|
||||
serie1.pieRadius[1] = 2f;
|
||||
serie1.pieCenter[0] = 0.5f;
|
||||
serie1.pieCenter[1] = 0.4f;
|
||||
serie1.radius[0] = 0;
|
||||
serie1.radius[1] = 2f;
|
||||
serie1.center[0] = 0.5f;
|
||||
serie1.center[1] = 0.4f;
|
||||
chart.RefreshChart();
|
||||
while (serie1.pieRadius[1] < serie.pieRadius[0] * 0.75f)
|
||||
while (serie1.radius[1] < serie.radius[0] * 0.75f)
|
||||
{
|
||||
serie1.pieRadius[1] += m_RadiusSpeed * Time.deltaTime;
|
||||
serie1.radius[1] += m_RadiusSpeed * Time.deltaTime;
|
||||
chart.RefreshChart();
|
||||
yield return null;
|
||||
}
|
||||
@@ -163,7 +163,7 @@ namespace XCharts
|
||||
chart.legend.show = false;
|
||||
serie1.ClearData();
|
||||
serie.ClearData();
|
||||
serie1.pieRadius = serie.pieRadius = new float[2] { 0, 80 };
|
||||
serie1.radius = serie.radius = new float[2] { 0, 80 };
|
||||
serie1.label.position = SerieLabel.Position.Outside;
|
||||
serie1.label.lineType = SerieLabel.LineType.Curves;
|
||||
serie1.label.color = Color.clear;
|
||||
@@ -179,24 +179,24 @@ namespace XCharts
|
||||
chart.AddData(i, 40, "rose8");
|
||||
}
|
||||
|
||||
while (serie.pieCenter[0] > 0.25f || serie1.pieCenter[0] < 0.7f)
|
||||
while (serie.center[0] > 0.25f || serie1.center[0] < 0.7f)
|
||||
{
|
||||
if (serie.pieCenter[0] > 0.25f) serie.pieCenter[0] -= m_CenterSpeed * Time.deltaTime;
|
||||
if (serie1.pieCenter[0] < 0.7f) serie1.pieCenter[0] += m_CenterSpeed * Time.deltaTime;
|
||||
if (serie.center[0] > 0.25f) serie.center[0] -= m_CenterSpeed * Time.deltaTime;
|
||||
if (serie1.center[0] < 0.7f) serie1.center[0] += m_CenterSpeed * Time.deltaTime;
|
||||
chart.RefreshChart();
|
||||
yield return null;
|
||||
}
|
||||
yield return new WaitForSeconds(1);
|
||||
while (serie.pieRadius[0] > 3f)
|
||||
while (serie.radius[0] > 3f)
|
||||
{
|
||||
serie.pieRadius[0] -= m_RadiusSpeed * Time.deltaTime;
|
||||
serie1.pieRadius[0] -= m_RadiusSpeed * Time.deltaTime;
|
||||
serie.radius[0] -= m_RadiusSpeed * Time.deltaTime;
|
||||
serie1.radius[0] -= m_RadiusSpeed * Time.deltaTime;
|
||||
chart.RefreshChart();
|
||||
yield return null;
|
||||
}
|
||||
|
||||
serie.pieRadius[0] = 0;
|
||||
serie1.pieRadius[0] = 0;
|
||||
serie.radius[0] = 0;
|
||||
serie1.radius[0] = 0;
|
||||
serie.pieRoseType = RoseType.Area;
|
||||
serie1.pieRoseType = RoseType.Radius;
|
||||
chart.RefreshChart();
|
||||
|
||||
70
Assets/XCharts/Demo/Runtime/Demo70_Gauge.cs
Normal file
70
Assets/XCharts/Demo/Runtime/Demo70_Gauge.cs
Normal file
@@ -0,0 +1,70 @@
|
||||
using System.Runtime.InteropServices;
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
[DisallowMultipleComponent]
|
||||
[ExecuteInEditMode]
|
||||
public class Demo70_Gauge : MonoBehaviour
|
||||
{
|
||||
private GaugeChart chart;
|
||||
private float updateTime;
|
||||
|
||||
void Awake()
|
||||
{
|
||||
chart = gameObject.GetComponent<GaugeChart>();
|
||||
if (chart == null)
|
||||
{
|
||||
chart = gameObject.AddComponent<GaugeChart>();
|
||||
}
|
||||
chart.title.text = "GaugeChart";
|
||||
chart.RemoveData();
|
||||
|
||||
var serie = chart.AddSerie(SerieType.Gauge, "速度");
|
||||
serie.min = 0;
|
||||
serie.max = 220;
|
||||
serie.startAngle = -125;
|
||||
serie.endAngle = 125;
|
||||
serie.center[0] = 0.5f;
|
||||
serie.center[1] = 0.5f;
|
||||
serie.radius[0] = 80;
|
||||
serie.splitNumber = 5;
|
||||
serie.animation.updateAnimation = true;
|
||||
serie.arcShaped = true;
|
||||
|
||||
serie.titleStyle.show = true;
|
||||
serie.titleStyle.textStyle.offset = new Vector2(0, 20);
|
||||
|
||||
serie.label.show = true;
|
||||
serie.label.offset = new Vector3(0, -20);
|
||||
|
||||
serie.gaugeAxis.show = true;
|
||||
serie.gaugeAxis.axisLine.width = 15;
|
||||
|
||||
serie.gaugePointer.show = true;
|
||||
serie.gaugePointer.width = 15;
|
||||
|
||||
var value = UnityEngine.Random.Range(serie.min, serie.max);
|
||||
chart.AddData(0, value, "km/h");
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
updateTime += Time.deltaTime;
|
||||
if (updateTime > 2)
|
||||
{
|
||||
updateTime = 0;
|
||||
var value = UnityEngine.Random.Range(0, 220);
|
||||
chart.UpdateData(0, 0, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/XCharts/Demo/Runtime/Demo70_Gauge.cs.meta
Normal file
11
Assets/XCharts/Demo/Runtime/Demo70_Gauge.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 250f744fcb07d4401994d964c4369d9d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -14,27 +14,24 @@ namespace XCharts
|
||||
[ExecuteInEditMode]
|
||||
public class Demo_Test : MonoBehaviour
|
||||
{
|
||||
LineChart chart;
|
||||
private float updateTime = 0;
|
||||
CoordinateChart chart;
|
||||
void Awake()
|
||||
{
|
||||
chart = gameObject.GetComponent<LineChart>();
|
||||
chart = gameObject.GetComponent<CoordinateChart>();
|
||||
if (chart == null)
|
||||
{
|
||||
chart = gameObject.AddComponent<LineChart>();
|
||||
chart = gameObject.AddComponent<CoordinateChart>();
|
||||
}
|
||||
|
||||
var buttom = transform.parent.gameObject.GetComponentInChildren<Button>();
|
||||
buttom.onClick.AddListener(AddData);
|
||||
}
|
||||
|
||||
void AddData()
|
||||
void Update()
|
||||
{
|
||||
chart.series.list[0].ClearData();
|
||||
chart.series.list[1].ClearData();
|
||||
for (int i = 0; i < 5; i++)
|
||||
updateTime += Time.deltaTime;
|
||||
if (updateTime > 2)
|
||||
{
|
||||
chart.AddData(0, Random.Range(20, 100));
|
||||
chart.AddData(1, Random.Range(1, 10));
|
||||
updateTime = 0;
|
||||
chart.UpdateData(0, Random.Range(0, 5), Random.Range(10, 90));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
* [Legend 图例](#Legend)
|
||||
* [Radar 雷达](#Radar)
|
||||
* [Series 系列](#Series)
|
||||
* [Serie.Gauge 仪表盘](#Serie.Gauge)
|
||||
* [Settings 设置](#Settings)
|
||||
* [Theme 主题](#Theme)
|
||||
* [Tooltip 提示框](#Tooltip)
|
||||
@@ -85,6 +86,17 @@
|
||||
* `itemGap`:主副标题之间的间距。
|
||||
* `location`:标题显示位置 [Location](#Location)。
|
||||
|
||||
## `TitleStyle`
|
||||
|
||||
标题样式。
|
||||
|
||||
* `show`:是否显示标题组件。
|
||||
* `rotate`:旋转。
|
||||
* `offset`:偏移。
|
||||
* `color`:颜色。
|
||||
* `fontSize`:字体大小。
|
||||
* `fontStyle`:字体风格。
|
||||
|
||||
## `Legend`
|
||||
|
||||
---
|
||||
@@ -262,6 +274,23 @@
|
||||
* `bottom`:组件离容器底部的距离。
|
||||
* `backgroundColor`:背景颜色。
|
||||
|
||||
## `GaugeAxis`
|
||||
|
||||
仪表盘坐标轴。
|
||||
|
||||
* `axisLine`:坐标轴轴线样式。
|
||||
* `splitLine`:坐标轴分割线样式。
|
||||
* `axisTick`:坐标轴刻度样式。
|
||||
* `axisLabel`:坐标轴刻度标签样式。
|
||||
* `axisLabelText`:坐标轴刻度标签自定义内容。当内容为空时,axisLabel根据刻度自动显示内容,否则取自该列表定义的内容。
|
||||
|
||||
## `GaugePointer`
|
||||
|
||||
仪表盘指针。
|
||||
|
||||
* `width`:指针宽度。
|
||||
* `length`:指针长度。当为0-1的浮点数时表示相对仪表盘半径的百分比。
|
||||
|
||||
## `XAxis`
|
||||
|
||||
---
|
||||
@@ -415,6 +444,33 @@
|
||||
|
||||
相关接口:
|
||||
|
||||
## `Serie.Gauge`
|
||||
|
||||
仪表盘系列。
|
||||
|
||||
* `show`:系列是否显示在图表上。
|
||||
* `type`:`Gauge`。
|
||||
* `name`:系列名称。用于 `tooltip` 的显示,`legend` 的图例筛选。
|
||||
* `gaugeType`:仪表盘类型,支持以下类型:
|
||||
* `Pointer`:指针类型。
|
||||
* `ProgressBar`:进度条类型。
|
||||
* `center`:中心点坐标。当值为0-1的浮点数时表示百分比。
|
||||
* `radius`:仪表盘半径。
|
||||
* `min`:最小的数据值。映射到startAngle。
|
||||
* `max`:最大的数据值。映射到endAngle。
|
||||
* `startAngle`:仪表盘起始角度。和时钟一样,12点钟位置是0度,顺时针到360度。
|
||||
* `endAngle`:仪表盘结束角度。和时钟一样,12点钟位置是0度,顺时针到360度。
|
||||
* `splitNumber`:仪表盘刻度分割段数。
|
||||
* `arcShaped`:是否启用圆角效果。
|
||||
* `titleStyle`:仪表盘标题 [TitleStyle](#TitleStyle)。
|
||||
* `gaugeAxis`: 仪表盘坐标轴 [GaugeAxis](#GaugeAxis)。
|
||||
* `gaugePointer`:仪表盘指针 [GaugePointer](#GaugePointer)。
|
||||
* `itemStyle`:仪表盘指针样式 [ItemStyle](#ItemStyle)。
|
||||
* `label`:图形上的文本标签 [SerieLabel](#SerieLabel),可用于说明图形的一些数据信息,比如值,名称等。
|
||||
* `emphasis`:高亮样式 [Emphasis](#Emphasis)。
|
||||
* `animation`:起始动画 [SerieAnimation](#SerieAnimation)。
|
||||
* `data`:系列中的数据项 [SerieData](#SerieData) 数组,可以设置`1`到`n`维数据。仪表盘的数据一般只有一个,值通过`label`样式显示,`name`通过`titleStyle`样式显示。
|
||||
|
||||
## `Settings`
|
||||
|
||||
---
|
||||
@@ -426,7 +482,7 @@
|
||||
* `lineSegmentDistance`: 线段的分割距离。普通折线图的线是由很多线段组成,段数由该数值决定。值越小段数越多,但顶点数也会随之增加。当开启有渐变的区域填充时,数值越大渐变过渡效果越差。
|
||||
* `cicleSmoothness`:圆形(包括扇形、环形等)的平滑度。数越小圆越平滑,但顶点数也会随之增加。
|
||||
|
||||
## `Animation`
|
||||
## `SerieAnimation`
|
||||
|
||||
---
|
||||
|
||||
@@ -434,6 +490,8 @@
|
||||
* `easing`:动画的缓动效果。支持以下动画效果:
|
||||
* `Linear`:线性效果。
|
||||
* `duration`:设定的动画时长,单位毫秒。
|
||||
* `updateAnimation`:是否开启数据变更动画。
|
||||
* `updateDuration`:数据变更动画时长,单位毫秒。
|
||||
* `threshold`:是否开启动画的阈值,当单个系列显示的图形数量大于这个阈值时会关闭动画。
|
||||
* `delay`:动画延时,单位毫秒。
|
||||
|
||||
|
||||
33
Assets/XCharts/Editor/GaugeChartEditor.cs
Normal file
33
Assets/XCharts/Editor/GaugeChartEditor.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using UnityEditor;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
/// <summary>
|
||||
/// Editor class used to edit UI GaugeChart.
|
||||
/// </summary>
|
||||
|
||||
[CustomEditor(typeof(GaugeChart), false)]
|
||||
public class GaugeChartEditor : BaseChartEditor
|
||||
{
|
||||
protected SerializedProperty m_Radar;
|
||||
protected SerializedProperty m_Radars;
|
||||
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
m_Target = (GaugeChart)target;
|
||||
}
|
||||
|
||||
protected override void OnEndInspectorGUI()
|
||||
{
|
||||
base.OnEndInspectorGUI();
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/XCharts/Editor/GaugeChartEditor.cs.meta
Normal file
11
Assets/XCharts/Editor/GaugeChartEditor.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bd96c5068df484d1c95748a85d8380a8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -24,11 +24,13 @@ namespace XCharts
|
||||
SerializedProperty m_Enable = prop.FindPropertyRelative("m_Enable");
|
||||
SerializedProperty m_Easting = prop.FindPropertyRelative("m_Easting");
|
||||
SerializedProperty m_Duration = prop.FindPropertyRelative("m_Duration");
|
||||
SerializedProperty m_UpdateAnimation = prop.FindPropertyRelative("m_UpdateAnimation");
|
||||
SerializedProperty m_UpdateDuration = prop.FindPropertyRelative("m_UpdateDuration");
|
||||
SerializedProperty m_Delay = prop.FindPropertyRelative("m_Delay");
|
||||
SerializedProperty m_Threshold = prop.FindPropertyRelative("m_Threshold");
|
||||
SerializedProperty m_ActualDuration = prop.FindPropertyRelative("m_ActualDuration");
|
||||
SerializedProperty m_CurrDetailProgress = prop.FindPropertyRelative("m_CurrDetailProgress");
|
||||
SerializedProperty m_DestDetailProgress = prop.FindPropertyRelative("m_DestDetailProgress");
|
||||
// SerializedProperty m_CurrDetailProgress = prop.FindPropertyRelative("m_CurrDetailProgress");
|
||||
// SerializedProperty m_DestDetailProgress = prop.FindPropertyRelative("m_DestDetailProgress");
|
||||
|
||||
ChartEditorHelper.MakeFoldout(ref drawRect, ref m_AnimationModuleToggle, prop, null, m_Enable, false);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
@@ -37,20 +39,26 @@ namespace XCharts
|
||||
++EditorGUI.indentLevel;
|
||||
EditorGUI.PropertyField(drawRect, m_Easting);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Duration);
|
||||
if (m_Duration.intValue < 0) m_Duration.intValue = 0;
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Delay);
|
||||
if (m_Delay.intValue < 0) m_Delay.intValue = 0;
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Threshold);
|
||||
if (m_Threshold.intValue < 0) m_Threshold.intValue = 0;
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.LabelField(drawRect, "CurrDetailProgress:" + m_CurrDetailProgress.floatValue);
|
||||
EditorGUI.PropertyField(drawRect, m_Delay);
|
||||
if (m_Delay.floatValue < 0) m_Delay.floatValue = 0;
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.LabelField(drawRect, "DestDetailProgress:" + m_DestDetailProgress.floatValue);
|
||||
EditorGUI.PropertyField(drawRect, m_Duration);
|
||||
if (m_Duration.floatValue < 0) m_Duration.floatValue = 0;
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.LabelField(drawRect, "Actual duration:" + m_ActualDuration.intValue + " ms");
|
||||
EditorGUI.PropertyField(drawRect, m_UpdateAnimation);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_UpdateDuration);
|
||||
if (m_UpdateDuration.floatValue < 0) m_UpdateDuration.floatValue = 0;
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
|
||||
// EditorGUI.LabelField(drawRect, "CurrDetailProgress:" + m_CurrDetailProgress.floatValue);
|
||||
// drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
// EditorGUI.LabelField(drawRect, "DestDetailProgress:" + m_DestDetailProgress.floatValue);
|
||||
// drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.LabelField(drawRect, "Actual duration:" + m_ActualDuration.floatValue + " ms");
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
|
||||
82
Assets/XCharts/Editor/PropertyDrawers/GaugeAxisDrawer.cs
Normal file
82
Assets/XCharts/Editor/PropertyDrawers/GaugeAxisDrawer.cs
Normal file
@@ -0,0 +1,82 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
[CustomPropertyDrawer(typeof(GaugeAxis), true)]
|
||||
public class GaugeAxisDrawer : PropertyDrawer
|
||||
{
|
||||
private bool m_DataFoldout = false;
|
||||
private int m_DataSize = 0;
|
||||
private Dictionary<string, bool> m_AxisLineToggle = new Dictionary<string, bool>();
|
||||
|
||||
public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
Rect drawRect = pos;
|
||||
drawRect.height = EditorGUIUtility.singleLineHeight;
|
||||
SerializedProperty show = prop.FindPropertyRelative("m_Show");
|
||||
SerializedProperty m_AxisLine = prop.FindPropertyRelative("m_AxisLine");
|
||||
SerializedProperty m_SplitLine = prop.FindPropertyRelative("m_SplitLine");
|
||||
SerializedProperty m_AxisTick = prop.FindPropertyRelative("m_AxisTick");
|
||||
SerializedProperty m_AxisLabel = prop.FindPropertyRelative("m_AxisLabel");
|
||||
SerializedProperty m_AxisLabelText = prop.FindPropertyRelative("m_AxisLabelText");
|
||||
|
||||
ChartEditorHelper.MakeFoldout(ref drawRect, ref m_AxisLineToggle, prop, "Gauge Axis", show, false);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
if (ChartEditorHelper.IsToggle(m_AxisLineToggle, prop))
|
||||
{
|
||||
++EditorGUI.indentLevel;
|
||||
EditorGUI.PropertyField(drawRect, m_AxisLine);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_AxisLine);
|
||||
EditorGUI.PropertyField(drawRect, m_SplitLine);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_SplitLine);
|
||||
EditorGUI.PropertyField(drawRect, m_AxisTick);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_AxisTick);
|
||||
EditorGUI.PropertyField(drawRect, m_AxisLabel);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_AxisLabel);
|
||||
drawRect.width = EditorGUIUtility.labelWidth + 10;
|
||||
m_DataFoldout = EditorGUI.Foldout(drawRect, m_DataFoldout, "Axis Label Text");
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
drawRect.width = pos.width;
|
||||
if (m_DataFoldout)
|
||||
{
|
||||
ChartEditorHelper.MakeList(ref drawRect, ref m_DataSize, m_AxisLabelText);
|
||||
}
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
}
|
||||
|
||||
public override float GetPropertyHeight(SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
float height = 0;
|
||||
if (ChartEditorHelper.IsToggle(m_AxisLineToggle, prop))
|
||||
{
|
||||
height += 2 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_AxisLine"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_SplitLine"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_AxisTick"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_AxisLabel"));
|
||||
if (m_DataFoldout)
|
||||
{
|
||||
SerializedProperty m_Data = prop.FindPropertyRelative("m_AxisLabelText");
|
||||
int num = m_Data.arraySize + 1;
|
||||
height += num * EditorGUIUtility.singleLineHeight + (num - 1) * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
return height;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dec6cfc5ef85147738a81d8de84b079a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
76
Assets/XCharts/Editor/PropertyDrawers/GaugeAxisLineDrawer.cs
Normal file
76
Assets/XCharts/Editor/PropertyDrawers/GaugeAxisLineDrawer.cs
Normal file
@@ -0,0 +1,76 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
[CustomPropertyDrawer(typeof(GaugeAxis.AxisLine), true)]
|
||||
public class GaugeAxisLineDrawer : PropertyDrawer
|
||||
{
|
||||
private bool m_DataFoldout = false;
|
||||
private int m_DataSize = 0;
|
||||
private Dictionary<string, bool> m_Toggle = new Dictionary<string, bool>();
|
||||
|
||||
public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
Rect drawRect = pos;
|
||||
drawRect.height = EditorGUIUtility.singleLineHeight;
|
||||
SerializedProperty show = prop.FindPropertyRelative("m_Show");
|
||||
SerializedProperty m_Width = prop.FindPropertyRelative("m_Width");
|
||||
SerializedProperty m_Opacity = prop.FindPropertyRelative("m_Opacity");
|
||||
SerializedProperty m_BarBackgroundColor = prop.FindPropertyRelative("m_BarBackgroundColor");
|
||||
SerializedProperty m_BarColor = prop.FindPropertyRelative("m_BarColor");
|
||||
SerializedProperty m_StageColor = prop.FindPropertyRelative("m_StageColor");
|
||||
|
||||
ChartEditorHelper.MakeFoldout(ref drawRect, ref m_Toggle, prop, "Axis Line", show, false);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
if (ChartEditorHelper.IsToggle(m_Toggle, prop))
|
||||
{
|
||||
++EditorGUI.indentLevel;
|
||||
EditorGUI.PropertyField(drawRect, m_Width);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Opacity);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_BarColor);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_BarBackgroundColor);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
m_DataFoldout = EditorGUI.Foldout(drawRect, m_DataFoldout, "Stage Color");
|
||||
drawRect.width = pos.width;
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
if (m_DataFoldout)
|
||||
{
|
||||
ChartEditorHelper.MakeList(ref drawRect, ref m_DataSize, m_StageColor);
|
||||
}
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
}
|
||||
|
||||
public override float GetPropertyHeight(SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
if (ChartEditorHelper.IsToggle(m_Toggle, prop))
|
||||
{
|
||||
float height = 6 * EditorGUIUtility.singleLineHeight + 5 * EditorGUIUtility.standardVerticalSpacing;
|
||||
if (m_DataFoldout)
|
||||
{
|
||||
var arraySize = prop.FindPropertyRelative("m_StageColor").arraySize + 1;
|
||||
height += arraySize * EditorGUIUtility.singleLineHeight + (arraySize) * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += 2 * EditorGUIUtility.standardVerticalSpacing;
|
||||
return height;
|
||||
}
|
||||
return height;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eb7a86643ea2349c8ac2475ab81cb2f9
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,33 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
[CustomPropertyDrawer(typeof(GaugeAxis.AxisLine.StageColor), true)]
|
||||
public class GaugeAxisLineStageColorDrawer : PropertyDrawer
|
||||
{
|
||||
public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
Rect drawRect = pos;
|
||||
drawRect.height = EditorGUIUtility.singleLineHeight;
|
||||
SerializedProperty m_Percent = prop.FindPropertyRelative("m_Percent");
|
||||
SerializedProperty m_Color = prop.FindPropertyRelative("m_Color");
|
||||
|
||||
ChartEditorHelper.MakeTwoField(ref drawRect, drawRect.width, m_Percent, m_Color, "Stage");
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
|
||||
public override float GetPropertyHeight(SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
return 1 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cc7cae70713a74fb496ef686296bc46b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,54 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
[CustomPropertyDrawer(typeof(GaugeAxis.SplitLine), true)]
|
||||
public class GaugeAxisSplitDrawer : PropertyDrawer
|
||||
{
|
||||
private Dictionary<string, bool> m_Toggle = new Dictionary<string, bool>();
|
||||
|
||||
public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
Rect drawRect = pos;
|
||||
drawRect.height = EditorGUIUtility.singleLineHeight;
|
||||
SerializedProperty show = prop.FindPropertyRelative("m_Show");
|
||||
SerializedProperty m_Length = prop.FindPropertyRelative("m_Length");
|
||||
SerializedProperty m_LineStyle = prop.FindPropertyRelative("m_LineStyle");
|
||||
|
||||
ChartEditorHelper.MakeFoldout(ref drawRect, ref m_Toggle, prop, "Split Line", show, false);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
if (ChartEditorHelper.IsToggle(m_Toggle, prop))
|
||||
{
|
||||
++EditorGUI.indentLevel;
|
||||
EditorGUI.PropertyField(drawRect, m_Length);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_LineStyle);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_LineStyle);
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
}
|
||||
|
||||
public override float GetPropertyHeight(SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
if (ChartEditorHelper.IsToggle(m_Toggle, prop))
|
||||
{
|
||||
float height = 2 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_LineStyle"));
|
||||
return height;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d11eb7847e5c74746a570a7c9f6b339a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
57
Assets/XCharts/Editor/PropertyDrawers/GaugeAxisTickDrawer.cs
Normal file
57
Assets/XCharts/Editor/PropertyDrawers/GaugeAxisTickDrawer.cs
Normal file
@@ -0,0 +1,57 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
[CustomPropertyDrawer(typeof(GaugeAxis.AxisTick), true)]
|
||||
public class GaugeAxisTickDrawer : PropertyDrawer
|
||||
{
|
||||
private Dictionary<string, bool> m_Toggle = new Dictionary<string, bool>();
|
||||
|
||||
public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
Rect drawRect = pos;
|
||||
drawRect.height = EditorGUIUtility.singleLineHeight;
|
||||
SerializedProperty show = prop.FindPropertyRelative("m_Show");
|
||||
SerializedProperty m_Length = prop.FindPropertyRelative("m_Length");
|
||||
SerializedProperty m_SplitNumber = prop.FindPropertyRelative("m_SplitNumber");
|
||||
SerializedProperty m_LineStyle = prop.FindPropertyRelative("m_LineStyle");
|
||||
|
||||
ChartEditorHelper.MakeFoldout(ref drawRect, ref m_Toggle, prop, "Axis Tick", show, false);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
if (ChartEditorHelper.IsToggle(m_Toggle, prop))
|
||||
{
|
||||
++EditorGUI.indentLevel;
|
||||
EditorGUI.PropertyField(drawRect, m_Length);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_SplitNumber);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_LineStyle);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_LineStyle);
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
}
|
||||
|
||||
public override float GetPropertyHeight(SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
if (ChartEditorHelper.IsToggle(m_Toggle, prop))
|
||||
{
|
||||
float height = 3 * EditorGUIUtility.singleLineHeight + 2 * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_LineStyle"));
|
||||
return height;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5f561506277b949c1b22116a3f3d3f4f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
51
Assets/XCharts/Editor/PropertyDrawers/GaugePointerDrawer.cs
Normal file
51
Assets/XCharts/Editor/PropertyDrawers/GaugePointerDrawer.cs
Normal file
@@ -0,0 +1,51 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
[CustomPropertyDrawer(typeof(GaugePointer), true)]
|
||||
public class GaugePointerDrawer : PropertyDrawer
|
||||
{
|
||||
private Dictionary<string, bool> m_Toggle = new Dictionary<string, bool>();
|
||||
|
||||
public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
Rect drawRect = pos;
|
||||
drawRect.height = EditorGUIUtility.singleLineHeight;
|
||||
SerializedProperty show = prop.FindPropertyRelative("m_Show");
|
||||
SerializedProperty m_Width = prop.FindPropertyRelative("m_Width");
|
||||
SerializedProperty m_Length = prop.FindPropertyRelative("m_Length");
|
||||
|
||||
ChartEditorHelper.MakeFoldout(ref drawRect, ref m_Toggle, prop, "Gauge Pointer", show, false);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
if (ChartEditorHelper.IsToggle(m_Toggle, prop))
|
||||
{
|
||||
++EditorGUI.indentLevel;
|
||||
EditorGUI.PropertyField(drawRect, m_Width);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Length);
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
}
|
||||
|
||||
public override float GetPropertyHeight(SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
if (ChartEditorHelper.IsToggle(m_Toggle, prop))
|
||||
{
|
||||
return 3 * EditorGUIUtility.singleLineHeight + 2 * EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a3d180de37dd24cfc9bcbb46f650c902
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -58,6 +58,17 @@ namespace XCharts
|
||||
SerializedProperty m_DataDimension = prop.FindPropertyRelative("m_ShowDataDimension");
|
||||
SerializedProperty m_ShowDataName = prop.FindPropertyRelative("m_ShowDataName");
|
||||
SerializedProperty m_ShowDataIcon = prop.FindPropertyRelative("m_ShowDataIcon");
|
||||
SerializedProperty m_Min = prop.FindPropertyRelative("m_Min");
|
||||
SerializedProperty m_Max = prop.FindPropertyRelative("m_Max");
|
||||
SerializedProperty m_StartAngle = prop.FindPropertyRelative("m_StartAngle");
|
||||
SerializedProperty m_EndAngle = prop.FindPropertyRelative("m_EndAngle");
|
||||
SerializedProperty m_SplitNumber = prop.FindPropertyRelative("m_SplitNumber");
|
||||
//SerializedProperty m_Clockwise = prop.FindPropertyRelative("m_Clockwise");
|
||||
SerializedProperty m_ArcShaped = prop.FindPropertyRelative("m_ArcShaped");
|
||||
SerializedProperty m_GaugeType = prop.FindPropertyRelative("m_GaugeType");
|
||||
SerializedProperty m_GaugeAxis = prop.FindPropertyRelative("m_GaugeAxis");
|
||||
SerializedProperty m_GaugePointer = prop.FindPropertyRelative("m_GaugePointer");
|
||||
SerializedProperty m_TitleStyle = prop.FindPropertyRelative("m_TitleStyle");
|
||||
SerializedProperty m_Datas = prop.FindPropertyRelative("m_Data");
|
||||
|
||||
int index = InitToggle(prop);
|
||||
@@ -82,87 +93,155 @@ namespace XCharts
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, name);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, stack);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
if (serieType == SerieType.Radar)
|
||||
{
|
||||
EditorGUI.PropertyField(drawRect, m_RadarIndex);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
else
|
||||
{
|
||||
EditorGUI.PropertyField(drawRect, m_AxisIndex);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
EditorGUI.PropertyField(drawRect, m_MinShow);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_MaxShow);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_MaxCache);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
if (m_MinShow.intValue < 0) m_MinShow.intValue = 0;
|
||||
if (m_MinShow.intValue < 0) m_MinShow.intValue = 0;
|
||||
if (m_MaxCache.intValue < 0) m_MaxCache.intValue = 0;
|
||||
if (serieType == SerieType.Line)
|
||||
{
|
||||
EditorGUI.PropertyField(drawRect, m_LineType);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_SampleDist);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_SampleType);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_SampleAverage);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
if (serieType == SerieType.Line
|
||||
|| serieType == SerieType.Scatter
|
||||
|| serieType == SerieType.EffectScatter
|
||||
|| serieType == SerieType.Radar)
|
||||
{
|
||||
EditorGUI.PropertyField(drawRect, m_Symbol);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Symbol);
|
||||
}
|
||||
if (serieType == SerieType.Bar)
|
||||
{
|
||||
EditorGUI.PropertyField(drawRect, m_BarType);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_BarPercentStack);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_BarWidth);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_BarGap);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_BarZebraWidth);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_BarZebraGap);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
if (serieType == SerieType.Pie)
|
||||
{
|
||||
EditorGUI.PropertyField(drawRect, m_RoseType);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Space);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
|
||||
ChartEditorHelper.MakeTwoField(ref drawRect, pos.width, m_Center, "Center");
|
||||
ChartEditorHelper.MakeTwoField(ref drawRect, pos.width, m_Radius, "Radius");
|
||||
}
|
||||
|
||||
EditorGUI.PropertyField(drawRect, m_LineStyle);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_LineStyle);
|
||||
if (serieType == SerieType.Line)
|
||||
switch (serieType)
|
||||
{
|
||||
EditorGUI.PropertyField(drawRect, m_LineArrow);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_LineArrow);
|
||||
case SerieType.Line:
|
||||
EditorGUI.PropertyField(drawRect, stack);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_AxisIndex);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_MinShow);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_MaxShow);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_MaxCache);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
if (m_MinShow.intValue < 0) m_MinShow.intValue = 0;
|
||||
if (m_MinShow.intValue < 0) m_MinShow.intValue = 0;
|
||||
if (m_MaxCache.intValue < 0) m_MaxCache.intValue = 0;
|
||||
EditorGUI.PropertyField(drawRect, m_LineType);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_SampleDist);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_SampleType);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_SampleAverage);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Symbol);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Symbol);
|
||||
EditorGUI.PropertyField(drawRect, m_LineStyle);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_LineStyle);
|
||||
EditorGUI.PropertyField(drawRect, m_LineArrow);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_LineArrow);
|
||||
EditorGUI.PropertyField(drawRect, m_ItemStyle);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_ItemStyle);
|
||||
EditorGUI.PropertyField(drawRect, m_AreaStyle);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_AreaStyle);
|
||||
EditorGUI.PropertyField(drawRect, m_Label);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Label);
|
||||
EditorGUI.PropertyField(drawRect, m_Emphasis);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Emphasis);
|
||||
break;
|
||||
case SerieType.Bar:
|
||||
EditorGUI.PropertyField(drawRect, stack);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_AxisIndex);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_MinShow);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_MaxShow);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_MaxCache);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
if (m_MinShow.intValue < 0) m_MinShow.intValue = 0;
|
||||
if (m_MinShow.intValue < 0) m_MinShow.intValue = 0;
|
||||
if (m_MaxCache.intValue < 0) m_MaxCache.intValue = 0;
|
||||
EditorGUI.PropertyField(drawRect, m_BarType);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_BarPercentStack);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_BarWidth);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_BarGap);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_BarZebraWidth);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_BarZebraGap);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Symbol);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Symbol);
|
||||
EditorGUI.PropertyField(drawRect, m_ItemStyle);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_ItemStyle);
|
||||
EditorGUI.PropertyField(drawRect, m_AreaStyle);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_AreaStyle);
|
||||
EditorGUI.PropertyField(drawRect, m_Label);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Label);
|
||||
EditorGUI.PropertyField(drawRect, m_Emphasis);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Emphasis);
|
||||
break;
|
||||
case SerieType.Pie:
|
||||
EditorGUI.PropertyField(drawRect, m_RoseType);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Space);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
ChartEditorHelper.MakeTwoField(ref drawRect, pos.width, m_Center, "Center");
|
||||
ChartEditorHelper.MakeTwoField(ref drawRect, pos.width, m_Radius, "Radius");
|
||||
EditorGUI.PropertyField(drawRect, m_ArcShaped);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Label);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Label);
|
||||
EditorGUI.PropertyField(drawRect, m_Emphasis);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Emphasis);
|
||||
break;
|
||||
case SerieType.Radar:
|
||||
EditorGUI.PropertyField(drawRect, m_RadarIndex);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Symbol);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Symbol);
|
||||
break;
|
||||
case SerieType.Scatter:
|
||||
case SerieType.EffectScatter:
|
||||
EditorGUI.PropertyField(drawRect, m_Symbol);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Symbol);
|
||||
EditorGUI.PropertyField(drawRect, m_Label);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Label);
|
||||
EditorGUI.PropertyField(drawRect, m_Emphasis);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Emphasis);
|
||||
break;
|
||||
case SerieType.Heatmap:
|
||||
EditorGUI.PropertyField(drawRect, m_Label);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Label);
|
||||
EditorGUI.PropertyField(drawRect, m_Emphasis);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Emphasis);
|
||||
break;
|
||||
case SerieType.Gauge:
|
||||
EditorGUI.PropertyField(drawRect, m_GaugeType);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
ChartEditorHelper.MakeTwoField(ref drawRect, pos.width, m_Center, "Center");
|
||||
//ChartEditorHelper.MakeTwoField(ref drawRect, pos.width, m_Radius, "Radius");
|
||||
EditorGUI.PropertyField(drawRect, m_Radius.GetArrayElementAtIndex(0), new GUIContent("Radius"));
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Min);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Max);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_StartAngle);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_EndAngle);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_SplitNumber);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
if (m_SplitNumber.intValue > 36)
|
||||
{
|
||||
m_SplitNumber.intValue = 36;
|
||||
}
|
||||
EditorGUI.PropertyField(drawRect, m_ArcShaped);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_TitleStyle);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_TitleStyle);
|
||||
EditorGUI.PropertyField(drawRect, m_GaugeAxis);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_GaugeAxis);
|
||||
EditorGUI.PropertyField(drawRect, m_GaugePointer);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_GaugePointer);
|
||||
EditorGUI.PropertyField(drawRect, m_ItemStyle);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_ItemStyle);
|
||||
EditorGUI.PropertyField(drawRect, m_Label);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Label);
|
||||
EditorGUI.PropertyField(drawRect, m_Emphasis);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Emphasis);
|
||||
break;
|
||||
}
|
||||
EditorGUI.PropertyField(drawRect, m_ItemStyle);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_ItemStyle);
|
||||
EditorGUI.PropertyField(drawRect, m_AreaStyle);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_AreaStyle);
|
||||
EditorGUI.PropertyField(drawRect, m_Label);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Label);
|
||||
EditorGUI.PropertyField(drawRect, m_Emphasis);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Emphasis);
|
||||
EditorGUI.PropertyField(drawRect, m_Animation);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Animation);
|
||||
drawRect.width = EditorGUIUtility.labelWidth + 10;
|
||||
@@ -268,7 +347,6 @@ namespace XCharts
|
||||
else
|
||||
{
|
||||
EditorGUI.LabelField(drawRect, "Element " + index);
|
||||
Debug.LogError("Element " + index);
|
||||
var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * 15;
|
||||
var dataWidTotal = (currentWidth - (startX + 20.5f + 1));
|
||||
var dataWid = dataWidTotal / fieldCount;
|
||||
@@ -301,8 +379,20 @@ namespace XCharts
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
var m_Icon = serieData.FindPropertyRelative("m_IconStyle");
|
||||
var m_EnableLabel = serieData.FindPropertyRelative("m_EnableLabel");
|
||||
var m_Label = serieData.FindPropertyRelative("m_Label");
|
||||
EditorGUI.PropertyField(drawRect, m_Icon);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Icon);
|
||||
EditorGUI.PropertyField(drawRect, m_EnableLabel);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
if (m_EnableLabel.boolValue)
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUI.PropertyField(drawRect, m_Label);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Label);
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
}
|
||||
@@ -317,35 +407,67 @@ namespace XCharts
|
||||
}
|
||||
else
|
||||
{
|
||||
height += 9 * EditorGUIUtility.singleLineHeight + 8 * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_LineStyle"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_ItemStyle"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_AreaStyle"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Label"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Emphasis"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Animation"));
|
||||
|
||||
SerializedProperty type = prop.FindPropertyRelative("m_Type");
|
||||
var serieType = (SerieType)type.enumValueIndex;
|
||||
if (serieType == SerieType.Line
|
||||
|| serieType == SerieType.Scatter
|
||||
|| serieType == SerieType.EffectScatter
|
||||
|| serieType == SerieType.Radar)
|
||||
{
|
||||
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Symbol"));
|
||||
}
|
||||
if (serieType == SerieType.Pie)
|
||||
|
||||
switch (serieType)
|
||||
{
|
||||
height += 5 * EditorGUIUtility.singleLineHeight + 4 * EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
if (serieType == SerieType.Line)
|
||||
{
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_LineArrow"));
|
||||
height += 4 * EditorGUIUtility.singleLineHeight + 3 * EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
if (serieType == SerieType.Bar)
|
||||
{
|
||||
height += 6 * EditorGUIUtility.singleLineHeight + 5 * EditorGUIUtility.standardVerticalSpacing;
|
||||
case SerieType.Line:
|
||||
height += 13 * EditorGUIUtility.singleLineHeight + 12 * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Symbol"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_LineStyle"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_LineArrow"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_ItemStyle"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_AreaStyle"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Label"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Emphasis"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Animation"));
|
||||
break;
|
||||
case SerieType.Bar:
|
||||
height += 16 * EditorGUIUtility.singleLineHeight + 15 * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_ItemStyle"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_AreaStyle"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Label"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Emphasis"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Animation"));
|
||||
break;
|
||||
case SerieType.Pie:
|
||||
height += 9 * EditorGUIUtility.singleLineHeight + 8 * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Label"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Emphasis"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Animation"));
|
||||
break;
|
||||
case SerieType.Radar:
|
||||
height += 5 * EditorGUIUtility.singleLineHeight + 4 * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Emphasis"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Animation"));
|
||||
break;
|
||||
case SerieType.Scatter:
|
||||
case SerieType.EffectScatter:
|
||||
height += 4 * EditorGUIUtility.singleLineHeight + 3 * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Symbol"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Label"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Emphasis"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Animation"));
|
||||
break;
|
||||
case SerieType.Heatmap:
|
||||
height += 4 * EditorGUIUtility.singleLineHeight + 3 * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Label"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Emphasis"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Animation"));
|
||||
break;
|
||||
case SerieType.Gauge:
|
||||
height += 13 * EditorGUIUtility.singleLineHeight + 12 * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_TitleStyle"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_GaugeAxis"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_GaugePointer"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_ItemStyle"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Label"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Emphasis"));
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Animation"));
|
||||
break;
|
||||
}
|
||||
if (m_DataFoldout[index])
|
||||
{
|
||||
@@ -366,7 +488,10 @@ namespace XCharts
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
var item = m_Data.GetArrayElementAtIndex(i);
|
||||
height += 1 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUI.GetPropertyHeight(item.FindPropertyRelative("m_IconStyle"));
|
||||
if (item.FindPropertyRelative("m_EnableLabel").boolValue)
|
||||
height += EditorGUI.GetPropertyHeight(item.FindPropertyRelative("m_Label"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ namespace XCharts
|
||||
SerializedProperty m_Position = prop.FindPropertyRelative("m_Position");
|
||||
SerializedProperty m_Formatter = prop.FindPropertyRelative("m_Formatter");
|
||||
SerializedProperty m_Offset = prop.FindPropertyRelative("m_Offset");
|
||||
SerializedProperty m_Margin = prop.FindPropertyRelative("m_Margin");
|
||||
SerializedProperty m_Rotate = prop.FindPropertyRelative("m_Rotate");
|
||||
SerializedProperty m_PaddingLeftRight = prop.FindPropertyRelative("m_PaddingLeftRight");
|
||||
SerializedProperty m_PaddingTopBottom = prop.FindPropertyRelative("m_PaddingTopBottom");
|
||||
@@ -62,6 +63,8 @@ namespace XCharts
|
||||
m_Offset.vector3Value = new Vector3(x, y);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
|
||||
EditorGUI.PropertyField(drawRect, m_Margin);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Formatter);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
|
||||
@@ -112,7 +115,7 @@ namespace XCharts
|
||||
float height = 0;
|
||||
if (ChartEditorHelper.IsToggle(m_SerieLabelToggle, prop))
|
||||
{
|
||||
height += 23 * EditorGUIUtility.singleLineHeight + 22 * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += 24 * EditorGUIUtility.singleLineHeight + 23 * EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
51
Assets/XCharts/Editor/PropertyDrawers/TitleStyleDrawer.cs
Normal file
51
Assets/XCharts/Editor/PropertyDrawers/TitleStyleDrawer.cs
Normal file
@@ -0,0 +1,51 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
[CustomPropertyDrawer(typeof(TitleStyle), true)]
|
||||
public class TitleStyleDrawer : PropertyDrawer
|
||||
{
|
||||
private Dictionary<string, bool> m_TitleStyleToggle = new Dictionary<string, bool>();
|
||||
|
||||
public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
Rect drawRect = pos;
|
||||
drawRect.height = EditorGUIUtility.singleLineHeight;
|
||||
SerializedProperty show = prop.FindPropertyRelative("m_Show");
|
||||
SerializedProperty m_textStyle = prop.FindPropertyRelative("m_textStyle");
|
||||
ChartEditorHelper.MakeFoldout(ref drawRect, ref m_TitleStyleToggle, prop, "Title Style", show, false);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
if (ChartEditorHelper.IsToggle(m_TitleStyleToggle, prop))
|
||||
{
|
||||
++EditorGUI.indentLevel;
|
||||
EditorGUI.PropertyField(drawRect, m_textStyle);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_textStyle);
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
}
|
||||
|
||||
public override float GetPropertyHeight(SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
float height = 0;
|
||||
if (ChartEditorHelper.IsToggle(m_TitleStyleToggle, prop))
|
||||
{
|
||||
height += 1 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_textStyle"));
|
||||
}
|
||||
else
|
||||
{
|
||||
height += 1 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
return height;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e451ee4c9f65a414784fd5fd9cad6ec1
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -98,5 +98,11 @@ namespace XCharts
|
||||
{
|
||||
AddChart<HeatmapChart>("HeatmapChart");
|
||||
}
|
||||
|
||||
[MenuItem("GameObject/XCharts/GaugeChart", priority = 50)]
|
||||
public static void AddGaugeChart()
|
||||
{
|
||||
AddChart<GaugeChart>("GaugeChart");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,12 +2,12 @@
|
||||
|
||||
A powerful, easy-to-use, configurable charting and data visualization library for Unity.
|
||||
|
||||
一款基于`UGUI`的功能强大、易用、参数可配置的数据可视化图表插件。支持折线图、柱状图、饼图、雷达图、散点图、热力图等常见图表。
|
||||
一款基于`UGUI`的功能强大、易用、参数可配置的数据可视化图表插件。支持折线图、柱状图、饼图、雷达图、散点图、热力图、仪表盘等常见图表。
|
||||
|
||||
## 特性
|
||||
|
||||
* 内置丰富示例和模板,参数可视化配置,效果实时预览,纯代码绘制。
|
||||
* 支持折线图、柱状图、饼图、雷达图、散点图、热力图等常见图表。
|
||||
* 支持折线图、柱状图、饼图、雷达图、散点图、热力图、仪表盘等常见图表。
|
||||
* 支持直线图、曲线图、面积图、阶梯线图等折线图。
|
||||
* 支持并列柱图、堆叠柱图、堆积百分比柱图、斑马柱图等柱状图。
|
||||
* 支持环形图、玫瑰图等饼图。
|
||||
|
||||
@@ -208,12 +208,52 @@ namespace XCharts
|
||||
/// the current minimun value.
|
||||
/// 当前最小值。
|
||||
/// </summary>
|
||||
public float runtimeMinValue { get; internal set; }
|
||||
public float runtimeMinValue
|
||||
{
|
||||
get { return m_RuntimeMinValue; }
|
||||
internal set
|
||||
{
|
||||
if (value != m_RuntimeMinValue)
|
||||
{
|
||||
if (m_RuntimeMinValueFirstChanged)
|
||||
{
|
||||
m_RuntimeMinValueFirstChanged = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_RuntimeLastMinValue = m_RuntimeMinValue;
|
||||
m_RuntimeMinValueChanged = true;
|
||||
m_RuntimeMinValueUpdateTime = Time.time;
|
||||
}
|
||||
m_RuntimeMinValue = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// the current maximum value.
|
||||
/// 当前最大值。
|
||||
/// </summary>
|
||||
public float runtimeMaxValue { get; internal set; }
|
||||
public float runtimeMaxValue
|
||||
{
|
||||
get { return m_RuntimeMaxValue; }
|
||||
internal set
|
||||
{
|
||||
if (value != m_RuntimeMaxValue)
|
||||
{
|
||||
if (m_RuntimeMaxValueFirstChanged)
|
||||
{
|
||||
m_RuntimeMaxValueFirstChanged = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_RuntimeLastMaxValue = m_RuntimeMaxValue;
|
||||
m_RuntimeMaxValueChanged = true;
|
||||
m_RuntimeMaxValueUpdateTime = Time.time;
|
||||
}
|
||||
m_RuntimeMaxValue = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// the x offset of zero position.
|
||||
/// 坐标轴原点在X轴的偏移。
|
||||
@@ -232,6 +272,16 @@ namespace XCharts
|
||||
private GameObject m_TooltipLabel;
|
||||
private Text m_TooltipLabelText;
|
||||
private RectTransform m_TooltipLabelRect;
|
||||
private float m_RuntimeMinValue;
|
||||
private float m_RuntimeLastMinValue;
|
||||
private bool m_RuntimeMinValueChanged;
|
||||
private float m_RuntimeMinValueUpdateTime;
|
||||
private float m_RuntimeMaxValue;
|
||||
private float m_RuntimeLastMaxValue;
|
||||
private bool m_RuntimeMaxValueChanged;
|
||||
private float m_RuntimeMaxValueUpdateTime;
|
||||
private bool m_RuntimeMinValueFirstChanged = true;
|
||||
private bool m_RuntimeMaxValueFirstChanged = true;
|
||||
|
||||
public void Copy(Axis other)
|
||||
{
|
||||
@@ -528,13 +578,15 @@ namespace XCharts
|
||||
/// 更新刻度标签文字
|
||||
/// </summary>
|
||||
/// <param name="dataZoom"></param>
|
||||
internal void UpdateLabelText(float coordinateWidth, DataZoom dataZoom, bool forcePercent)
|
||||
internal void UpdateLabelText(float coordinateWidth, DataZoom dataZoom, bool forcePercent, float duration)
|
||||
{
|
||||
var minValue = GetCurrMinValue(duration);
|
||||
var maxValue = GetCurrMaxValue(duration);
|
||||
for (int i = 0; i < axisLabelTextList.Count; i++)
|
||||
{
|
||||
if (axisLabelTextList[i] != null)
|
||||
{
|
||||
axisLabelTextList[i].text = GetLabelName(coordinateWidth, i, runtimeMinValue, runtimeMaxValue, dataZoom, forcePercent);
|
||||
axisLabelTextList[i].text = GetLabelName(coordinateWidth, i, minValue, maxValue, dataZoom, forcePercent);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -591,7 +643,7 @@ namespace XCharts
|
||||
/// </summary>
|
||||
/// <param name="minValue"></param>
|
||||
/// <param name="maxValue"></param>
|
||||
internal void AdjustMinMaxValue(ref float minValue, ref float maxValue)
|
||||
internal void AdjustMinMaxValue(ref float minValue, ref float maxValue, bool needFormat)
|
||||
{
|
||||
if (minMaxType == Axis.AxisMinMaxType.Custom)
|
||||
{
|
||||
@@ -609,28 +661,74 @@ namespace XCharts
|
||||
if (minValue > 0 && maxValue > 0)
|
||||
{
|
||||
minValue = 0;
|
||||
maxValue = ChartHelper.GetMaxDivisibleValue(maxValue);
|
||||
maxValue = needFormat ? ChartHelper.GetMaxDivisibleValue(maxValue) : maxValue;
|
||||
}
|
||||
else if (minValue < 0 && maxValue < 0)
|
||||
{
|
||||
minValue = ChartHelper.GetMinDivisibleValue(minValue);
|
||||
minValue = needFormat ? ChartHelper.GetMinDivisibleValue(minValue) : minValue;
|
||||
maxValue = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
minValue = ChartHelper.GetMinDivisibleValue(minValue);
|
||||
maxValue = ChartHelper.GetMaxDivisibleValue(maxValue);
|
||||
minValue = needFormat ? ChartHelper.GetMinDivisibleValue(minValue) : minValue;
|
||||
maxValue = needFormat ? ChartHelper.GetMaxDivisibleValue(maxValue) : maxValue;
|
||||
}
|
||||
break;
|
||||
case Axis.AxisMinMaxType.MinMax:
|
||||
minValue = ChartHelper.GetMinDivisibleValue(minValue);
|
||||
maxValue = ChartHelper.GetMaxDivisibleValue(maxValue);
|
||||
minValue = needFormat ? ChartHelper.GetMinDivisibleValue(minValue) : minValue;
|
||||
maxValue = needFormat ? ChartHelper.GetMaxDivisibleValue(maxValue) : maxValue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
m_ValueRange = maxValue - minValue;
|
||||
}
|
||||
|
||||
internal float GetCurrMinValue(float duration)
|
||||
{
|
||||
if (!m_RuntimeMinValueChanged) return m_RuntimeMinValue;
|
||||
var time = Time.time - m_RuntimeMinValueUpdateTime;
|
||||
var total = duration / 1000;
|
||||
if (duration > 0 && time <= total)
|
||||
{
|
||||
var curr = Mathf.Lerp(m_RuntimeLastMinValue, m_RuntimeMinValue, time / total);
|
||||
return curr;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_RuntimeMinValueChanged = false;
|
||||
return m_RuntimeMinValue;
|
||||
}
|
||||
}
|
||||
|
||||
internal float GetCurrMaxValue(float duration)
|
||||
{
|
||||
if (!m_RuntimeMaxValueChanged) return m_RuntimeMaxValue;
|
||||
var time = Time.time - m_RuntimeMaxValueUpdateTime;
|
||||
var total = duration / 1000;
|
||||
if (duration > 0 && time <= total)
|
||||
{
|
||||
var curr = Mathf.Lerp(m_RuntimeLastMaxValue, m_RuntimeMaxValue, time / total);
|
||||
return curr;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_RuntimeMaxValueChanged = false;
|
||||
return m_RuntimeMaxValue;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsValueChanging(float duration)
|
||||
{
|
||||
if (GetCurrMinValue(duration) != m_RuntimeMinValue || GetCurrMaxValue(duration) != m_RuntimeMaxValue)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
if (ReferenceEquals(null, obj))
|
||||
|
||||
@@ -48,6 +48,10 @@ namespace XCharts
|
||||
/// 热力图。主要通过颜色去表现数值的大小,必须要配合 visualMap 组件使用。
|
||||
/// </summary>
|
||||
Heatmap,
|
||||
/// <summary>
|
||||
/// 仪表盘。
|
||||
/// </summary>
|
||||
Gauge,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -142,6 +146,21 @@ namespace XCharts
|
||||
Capsule
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 仪表盘类型
|
||||
/// </summary>
|
||||
public enum GaugeType
|
||||
{
|
||||
/// <summary>
|
||||
/// 指针型
|
||||
/// </summary>
|
||||
Pointer,
|
||||
/// <summary>
|
||||
/// 进度条型
|
||||
/// </summary>
|
||||
ProgressBar
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 采样类型
|
||||
/// </summary>
|
||||
@@ -202,6 +221,16 @@ namespace XCharts
|
||||
[SerializeField] private float m_BarZebraWidth = 4f;
|
||||
[SerializeField] private float m_BarZebraGap = 2f;
|
||||
|
||||
[SerializeField] private float m_Min;
|
||||
[SerializeField] private float m_Max;
|
||||
[SerializeField] private float m_StartAngle;
|
||||
[SerializeField] private float m_EndAngle;
|
||||
[SerializeField] private bool m_Clockwise;
|
||||
[SerializeField] private bool m_ArcShaped;
|
||||
[SerializeField] private int m_SplitNumber;
|
||||
[SerializeField] private GaugeType m_GaugeType = GaugeType.Pointer;
|
||||
[SerializeField] private GaugeAxis m_GaugeAxis = new GaugeAxis();
|
||||
[SerializeField] private GaugePointer m_GaugePointer = new GaugePointer();
|
||||
|
||||
[SerializeField] private bool m_ClickOffset = true;
|
||||
[SerializeField] private RoseType m_RoseType = RoseType.None;
|
||||
@@ -213,6 +242,7 @@ namespace XCharts
|
||||
[SerializeField] private LineArrow m_LineArrow = new LineArrow();
|
||||
[SerializeField] private ItemStyle m_ItemStyle = new ItemStyle();
|
||||
[SerializeField] private Emphasis m_Emphasis = new Emphasis();
|
||||
[SerializeField] private TitleStyle m_TitleStyle = new TitleStyle();
|
||||
[SerializeField] [Range(1, 10)] private int m_ShowDataDimension;
|
||||
[SerializeField] private bool m_ShowDataName;
|
||||
[SerializeField] private bool m_ShowDataIcon;
|
||||
@@ -383,15 +413,59 @@ namespace XCharts
|
||||
/// </summary>
|
||||
public float pieSpace { get { return m_Space; } set { m_Space = value; } }
|
||||
/// <summary>
|
||||
/// the center of pie chart.
|
||||
/// 饼图的中心点。
|
||||
/// the center of chart.
|
||||
/// 中心点。
|
||||
/// </summary>
|
||||
public float[] pieCenter { get { return m_Center; } set { m_Center = value; } }
|
||||
public float[] center { get { return m_Center; } set { m_Center = value; } }
|
||||
/// <summary>
|
||||
/// the radius of pie chart.
|
||||
/// 饼图的半径。radius[0]表示内径,radius[1]表示外径。
|
||||
/// the radius of chart.
|
||||
/// 半径。radius[0]表示内径,radius[1]表示外径。
|
||||
/// </summary>
|
||||
public float[] pieRadius { get { return m_Radius; } set { m_Radius = value; } }
|
||||
public float[] radius { get { return m_Radius; } set { m_Radius = value; } }
|
||||
[Obsolete("Use Serie.center instead.", true)]
|
||||
public float[] pieCenter { get { return center; } set { center = value; } }
|
||||
[Obsolete("Use Serie.radius instead.", true)]
|
||||
public float[] pieRadius { get { return radius; } set { radius = value; } }
|
||||
/// <summary>
|
||||
/// 最小值,映射到 startAngle。
|
||||
/// </summary>
|
||||
public float min { get { return m_Min; } set { m_Min = value; } }
|
||||
/// <summary>
|
||||
/// 最大值,映射到 endAngle。
|
||||
/// </summary>
|
||||
public float max { get { return m_Max; } set { m_Max = value; } }
|
||||
/// <summary>
|
||||
/// 起始角度。和时钟一样,12点钟位置是0度,顺时针到360度。
|
||||
/// </summary>
|
||||
public float startAngle { get { return m_StartAngle; } set { m_StartAngle = value; } }
|
||||
/// <summary>
|
||||
/// 结束角度。和时钟一样,12点钟位置是0度,顺时针到360度。
|
||||
/// </summary>
|
||||
public float endAngle { get { return m_EndAngle; } set { m_EndAngle = value; } }
|
||||
/// <summary>
|
||||
/// 是否顺时针。
|
||||
/// </summary>
|
||||
public bool clockwise { get { return m_Clockwise; } set { m_Clockwise = value; } }
|
||||
/// <summary>
|
||||
/// 刻度分割段数。
|
||||
/// </summary>
|
||||
public int splitNumber { get { return m_SplitNumber; } set { m_SplitNumber = value > 36 ? 36 : value; } }
|
||||
/// <summary>
|
||||
/// 是否开启圆弧形边角。
|
||||
/// </summary>
|
||||
public bool arcShaped { get { return m_ArcShaped; } set { m_ArcShaped = value; } }
|
||||
/// <summary>
|
||||
/// 仪表盘轴线。
|
||||
/// </summary>
|
||||
public GaugeAxis gaugeAxis { get { return m_GaugeAxis; } set { m_GaugeAxis = value; } }
|
||||
/// <summary>
|
||||
/// 仪表盘指针。
|
||||
/// </summary>
|
||||
public GaugePointer gaugePointer { get { return m_GaugePointer; } set { m_GaugePointer = value; } }
|
||||
/// <summary>
|
||||
/// 仪表盘类型。
|
||||
/// </summary>
|
||||
public GaugeType gaugeType { get { return m_GaugeType; } set { m_GaugeType = value; } }
|
||||
/// <summary>
|
||||
/// Text label of graphic element,to explain some data information about graphic item like value, name and so on.
|
||||
/// 图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。
|
||||
@@ -416,6 +490,10 @@ namespace XCharts
|
||||
/// 高亮的图形样式和文本标签样式。
|
||||
/// </summary>
|
||||
public Emphasis emphasis { get { return m_Emphasis; } set { m_Emphasis = value; } }
|
||||
/// <summary>
|
||||
/// 标题样式。
|
||||
/// </summary>
|
||||
public TitleStyle titleStyle { get { return m_TitleStyle; } set { m_TitleStyle = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// 系列中的数据内容数组。SerieData可以设置1到n维数据。
|
||||
@@ -444,15 +522,15 @@ namespace XCharts
|
||||
/// <summary>
|
||||
/// 饼图的中心点位置。
|
||||
/// </summary>
|
||||
public Vector3 runtimePieCenterPos { get; internal set; }
|
||||
public Vector3 runtimeCenterPos { get; internal set; }
|
||||
/// <summary>
|
||||
/// 饼图的内径
|
||||
/// </summary>
|
||||
public float runtimePieInsideRadius { get; internal set; }
|
||||
public float runtimeInsideRadius { get; internal set; }
|
||||
/// <summary>
|
||||
/// 饼图的外径
|
||||
/// </summary>
|
||||
public float runtimePieOutsideRadius { get; internal set; }
|
||||
public float runtimeOutsideRadius { get; internal set; }
|
||||
/// <summary>
|
||||
/// 饼图的数据项最大值
|
||||
/// </summary>
|
||||
@@ -732,6 +810,17 @@ namespace XCharts
|
||||
return 0;
|
||||
}
|
||||
|
||||
public float GetYCurrData(int index, DataZoom dataZoom = null)
|
||||
{
|
||||
if (index < 0) return 0;
|
||||
var serieData = GetDataList(dataZoom);
|
||||
if (index < serieData.Count)
|
||||
{
|
||||
return serieData[index].GetCurrData(1, animation.GetUpdateAnimationDuration());
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获得维度Y索引对应的数据和数据名
|
||||
/// </summary>
|
||||
@@ -768,6 +857,24 @@ namespace XCharts
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获得指定索引的数据项的Label
|
||||
/// </summary>
|
||||
/// <param name="index"></param>
|
||||
/// <param name="dataZoom"></param>
|
||||
/// <returns></returns>
|
||||
public SerieLabel GetSerieLabel(int index, DataZoom dataZoom = null)
|
||||
{
|
||||
var data = GetDataList(dataZoom);
|
||||
if (index >= 0 && index <= data.Count - 1)
|
||||
{
|
||||
var serieData = data[index];
|
||||
if (serieData.enableLabel) return serieData.label;
|
||||
else return label;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获得指定索引的维度X和维度Y的数据
|
||||
/// </summary>
|
||||
@@ -896,9 +1003,9 @@ namespace XCharts
|
||||
public void UpdateData(int index, int dimension, float value)
|
||||
{
|
||||
if (index < 0) return;
|
||||
if (index < m_Data.Count && dimension < m_Data[index].data.Count)
|
||||
if (index < m_Data.Count)
|
||||
{
|
||||
m_Data[index].data[dimension] = value;
|
||||
m_Data[index].UpdateData(dimension, value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1083,6 +1190,22 @@ namespace XCharts
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新运行时中心点和半径
|
||||
/// </summary>
|
||||
/// <param name="chartWidth"></param>
|
||||
/// <param name="chartHeight"></param>
|
||||
internal void UpdateCenter(float chartWidth, float chartHeight)
|
||||
{
|
||||
if (center.Length < 2) return;
|
||||
var centerX = center[0] <= 1 ? chartWidth * center[0] : center[0];
|
||||
var centerY = center[1] <= 1 ? chartHeight * center[1] : center[1];
|
||||
runtimeCenterPos = new Vector2(centerX, centerY);
|
||||
var minWidth = Mathf.Min(chartWidth, chartHeight);
|
||||
runtimeInsideRadius = radius[0] <= 1 ? minWidth * radius[0] : radius[0];
|
||||
runtimeOutsideRadius = radius[1] <= 1 ? minWidth * radius[1] : radius[1];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定index的数据图标的尺寸
|
||||
/// </summary>
|
||||
|
||||
@@ -81,6 +81,18 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
public float GetCurrData(int serieIndex, int dataIndex)
|
||||
{
|
||||
if (serieIndex >= 0 && serieIndex < Count)
|
||||
{
|
||||
return m_Series[serieIndex].GetYCurrData(dataIndex);
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获得指定系列名的第一个系列
|
||||
/// </summary>
|
||||
@@ -167,6 +179,18 @@ namespace XCharts
|
||||
return false;
|
||||
}
|
||||
|
||||
internal bool IsAnyUpdateAnimationSerie()
|
||||
{
|
||||
foreach (var serie in m_Series)
|
||||
{
|
||||
if (serie.animation.enable && serie.animation.updateAnimation)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获得上一个同堆叠且显示的serie。
|
||||
/// </summary>
|
||||
@@ -603,8 +627,9 @@ namespace XCharts
|
||||
{
|
||||
if (yValue)
|
||||
{
|
||||
if (data.data[1] > max) max = data.data[1];
|
||||
if (data.data[1] < min) min = data.data[1];
|
||||
var currData = data.GetData(1);
|
||||
if (currData > max) max = currData;
|
||||
if (currData < min) min = currData;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -641,7 +666,7 @@ namespace XCharts
|
||||
if (!_serieTotalValueForMinMax.ContainsKey(j))
|
||||
_serieTotalValueForMinMax[j] = 0;
|
||||
_serieTotalValueForMinMax[j] = _serieTotalValueForMinMax[j] +
|
||||
(yValue ? showData[j].data[1] : showData[i].data[0]);
|
||||
(yValue ? showData[j].GetData(1) : showData[i].data[0]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -668,7 +693,9 @@ namespace XCharts
|
||||
{
|
||||
minVaule = Mathf.FloorToInt(min);
|
||||
maxValue = Mathf.CeilToInt(max);
|
||||
}else{
|
||||
}
|
||||
else
|
||||
{
|
||||
minVaule = min;
|
||||
maxValue = max;
|
||||
}
|
||||
|
||||
305
Assets/XCharts/Runtime/Component/Sub/GaugeAxis.cs
Normal file
305
Assets/XCharts/Runtime/Component/Sub/GaugeAxis.cs
Normal file
@@ -0,0 +1,305 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Settings related to gauge axis line.
|
||||
/// 仪表盘轴线相关设置。
|
||||
/// </summary>
|
||||
[System.Serializable]
|
||||
public class GaugeAxis : SubComponent
|
||||
{
|
||||
[System.Serializable]
|
||||
public class AxisLine
|
||||
{
|
||||
[System.Serializable]
|
||||
public class StageColor
|
||||
{
|
||||
[SerializeField] private float m_Percent;
|
||||
[SerializeField] private Color m_Color;
|
||||
/// <summary>
|
||||
/// 结束位置百分比。
|
||||
/// </summary>
|
||||
public float percent { get { return m_Percent; } set { m_Percent = value; } }
|
||||
/// <summary>
|
||||
/// 颜色。
|
||||
/// </summary>
|
||||
public Color color { get { return m_Color; } set { m_Color = value; } }
|
||||
|
||||
public StageColor(float percent, Color color)
|
||||
{
|
||||
m_Percent = percent;
|
||||
m_Color = color;
|
||||
}
|
||||
}
|
||||
[SerializeField] private bool m_Show = true;
|
||||
[SerializeField] private float m_Width = 15f;
|
||||
[SerializeField] private float m_Opacity = 1f;
|
||||
[SerializeField] private Color m_BarColor;
|
||||
[SerializeField] private Color m_BarBackgroundColor = new Color32(200, 200, 200, 255);
|
||||
[SerializeField]
|
||||
private List<StageColor> m_StageColor = new List<StageColor>()
|
||||
{
|
||||
new StageColor(0.2f,new Color32(145,199,174,255)),
|
||||
new StageColor(0.8f,new Color32(99,134,158,255)),
|
||||
new StageColor(1.0f,new Color32(194,53,49,255)),
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Set this to false to prevent the axis line from showing.
|
||||
/// 是否显示坐标轴轴线。
|
||||
/// </summary>
|
||||
public bool show { get { return m_Show; } set { m_Show = value; } }
|
||||
/// <summary>
|
||||
/// line style line width.
|
||||
/// 坐标轴线线宽。
|
||||
/// </summary>
|
||||
public float width { get { return m_Width; } set { m_Width = value; } }
|
||||
/// <summary>
|
||||
/// The opacity of axis line.
|
||||
/// 透明度。
|
||||
/// </summary>
|
||||
public float opacity { get { return m_Opacity; } set { m_Opacity = value; } }
|
||||
/// <summary>
|
||||
/// 进度条颜色。
|
||||
/// </summary>
|
||||
public Color barColor { get { return m_BarColor; } set { m_BarColor = value; } }
|
||||
/// <summary>
|
||||
/// 进度条背景颜色。
|
||||
/// </summary>
|
||||
public Color barBackgroundColor { get { return m_BarBackgroundColor; } set { m_BarBackgroundColor = value; } }
|
||||
/// <summary>
|
||||
/// 阶段颜色。
|
||||
/// </summary>
|
||||
public List<StageColor> stageColor { get { return m_StageColor; } set { m_StageColor = value; } }
|
||||
}
|
||||
/// <summary>
|
||||
/// 分割线
|
||||
/// </summary>
|
||||
[System.Serializable]
|
||||
public class SplitLine
|
||||
{
|
||||
[SerializeField] private bool m_Show = true;
|
||||
[SerializeField] private float m_Length = 15;
|
||||
[SerializeField]
|
||||
private LineStyle m_LineStyle = new LineStyle()
|
||||
{
|
||||
width = 1.5f,
|
||||
type = LineStyle.Type.Solid,
|
||||
color = new Color32(238, 238, 238, 255)
|
||||
};
|
||||
/// <summary>
|
||||
/// 是否显示分割线。
|
||||
/// </summary>
|
||||
public bool show { get { return m_Show; } set { m_Show = value; } }
|
||||
/// <summary>
|
||||
/// 分割线长度。
|
||||
/// </summary>
|
||||
public float length { get { return m_Length; } set { m_Length = value; } }
|
||||
/// <summary>
|
||||
/// 分割线样式。
|
||||
/// </summary>
|
||||
public LineStyle lineStyle { get { return m_LineStyle; } set { m_LineStyle = value; } }
|
||||
}
|
||||
/// <summary>
|
||||
/// 刻度
|
||||
/// </summary>
|
||||
[System.Serializable]
|
||||
public class AxisTick
|
||||
{
|
||||
[SerializeField] private bool m_Show = true;
|
||||
[SerializeField] private float m_Length = 5;
|
||||
[SerializeField] private float m_SplitNumber = 5;
|
||||
[SerializeField]
|
||||
private LineStyle m_LineStyle = new LineStyle()
|
||||
{
|
||||
width = 1f,
|
||||
type = LineStyle.Type.Solid,
|
||||
color = new Color32(238, 238, 238, 255)
|
||||
};
|
||||
/// <summary>
|
||||
/// 是否显示刻度。
|
||||
/// </summary>
|
||||
public bool show { get { return m_Show; } set { m_Show = value; } }
|
||||
/// <summary>
|
||||
/// 刻度长度。当为0-1的浮点数时表示半径的百分比。
|
||||
/// </summary>
|
||||
public float length { get { return m_Length; } set { m_Length = value; } }
|
||||
/// <summary>
|
||||
/// 分割线之间的分割段数。
|
||||
/// </summary>
|
||||
public float splitNumber { get { return m_SplitNumber; } set { m_SplitNumber = value; } }
|
||||
/// <summary>
|
||||
/// 刻度线样式。
|
||||
/// </summary>
|
||||
public LineStyle lineStyle { get { return m_LineStyle; } set { m_LineStyle = value; } }
|
||||
}
|
||||
[SerializeField] private bool m_Show = true;
|
||||
[SerializeField] private AxisLine m_AxisLine = new AxisLine();
|
||||
[SerializeField] private SplitLine m_SplitLine = new SplitLine();
|
||||
[SerializeField] private AxisTick m_AxisTick = new AxisTick();
|
||||
[SerializeField] private SerieLabel m_AxisLabel = new SerieLabel();
|
||||
[SerializeField] private List<string> m_AxisLabelText = new List<string>();
|
||||
|
||||
public bool show { get { return m_Show; } set { m_Show = value; } }
|
||||
/// <summary>
|
||||
/// 仪表盘轴线。
|
||||
/// </summary>
|
||||
public AxisLine axisLine { get { return m_AxisLine; } set { m_AxisLine = value; } }
|
||||
/// <summary>
|
||||
/// 分割线。
|
||||
/// </summary>
|
||||
public SplitLine splitLine { get { return m_SplitLine; } set { m_SplitLine = value; } }
|
||||
/// <summary>
|
||||
/// 刻度。
|
||||
/// </summary>
|
||||
public AxisTick axisTick { get { return m_AxisTick; } set { m_AxisTick = value; } }
|
||||
/// <summary>
|
||||
/// 文本标签。
|
||||
/// </summary>
|
||||
public SerieLabel axisLabel { get { return m_AxisLabel; } set { m_AxisLabel = value; } }
|
||||
/// <summary>
|
||||
/// 自定义Label的内容。
|
||||
/// </summary>
|
||||
public List<string> axisLabelText { get { return m_AxisLabelText; } set { m_AxisLabelText = value; } }
|
||||
|
||||
public List<float> runtimeStageAngle = new List<float>();
|
||||
public List<Vector3> runtimeLabelPosition = new List<Vector3>();
|
||||
private List<LabelObject> m_RuntimeLabelList = new List<LabelObject>();
|
||||
|
||||
internal Color GetAxisLineColor(ThemeInfo theme, int index)
|
||||
{
|
||||
var color = axisLine.barColor != Color.clear ? axisLine.barColor : (Color)theme.GetColor(index);
|
||||
color.a *= axisLine.opacity;
|
||||
return color;
|
||||
}
|
||||
|
||||
internal Color GetAxisLineBackgroundColor(ThemeInfo theme, int index)
|
||||
{
|
||||
var color = axisLine.barBackgroundColor != Color.clear ? axisLine.barBackgroundColor : Color.grey;
|
||||
color.a *= axisLine.opacity;
|
||||
return color;
|
||||
}
|
||||
|
||||
internal Color GetSplitLineColor(ThemeInfo theme, int serieIndex, float angle)
|
||||
{
|
||||
Color color;
|
||||
if (splitLine.lineStyle.color != Color.clear)
|
||||
{
|
||||
color = splitLine.lineStyle.color;
|
||||
color.a *= splitLine.lineStyle.opacity;
|
||||
return color;
|
||||
}
|
||||
for (int i = 0; i < runtimeStageAngle.Count; i++)
|
||||
{
|
||||
if (angle < runtimeStageAngle[i])
|
||||
{
|
||||
color = axisLine.stageColor[i].color;
|
||||
color.a *= splitLine.lineStyle.opacity;
|
||||
return color;
|
||||
}
|
||||
}
|
||||
color = theme.GetColor(serieIndex);
|
||||
color.a *= splitLine.lineStyle.opacity;
|
||||
return color;
|
||||
}
|
||||
|
||||
internal Color GetAxisTickColor(ThemeInfo theme, int serieIndex, float angle)
|
||||
{
|
||||
Color color;
|
||||
if (axisTick.lineStyle.color != Color.clear)
|
||||
{
|
||||
color = axisTick.lineStyle.color;
|
||||
color.a *= axisTick.lineStyle.opacity;
|
||||
return color;
|
||||
}
|
||||
for (int i = 0; i < runtimeStageAngle.Count; i++)
|
||||
{
|
||||
if (angle < runtimeStageAngle[i])
|
||||
{
|
||||
color = axisLine.stageColor[i].color;
|
||||
color.a *= axisTick.lineStyle.opacity;
|
||||
return color;
|
||||
}
|
||||
}
|
||||
color = theme.GetColor(serieIndex);
|
||||
color.a *= axisTick.lineStyle.opacity;
|
||||
return color;
|
||||
}
|
||||
|
||||
internal Color GetPointerColor(ThemeInfo theme, int serieIndex, float angle, ItemStyle itemStyle)
|
||||
{
|
||||
Color color;
|
||||
if (itemStyle.color != Color.clear)
|
||||
{
|
||||
color = itemStyle.color;
|
||||
color.a *= itemStyle.opacity;
|
||||
return color;
|
||||
}
|
||||
for (int i = 0; i < runtimeStageAngle.Count; i++)
|
||||
{
|
||||
if (angle < runtimeStageAngle[i])
|
||||
{
|
||||
color = axisLine.stageColor[i].color;
|
||||
color.a *= itemStyle.opacity;
|
||||
return color;
|
||||
}
|
||||
}
|
||||
color = theme.GetColor(serieIndex);
|
||||
color.a *= itemStyle.opacity;
|
||||
return color;
|
||||
}
|
||||
|
||||
public void ClearLabelObject()
|
||||
{
|
||||
m_RuntimeLabelList.Clear();
|
||||
}
|
||||
|
||||
public void AddLabelObject(LabelObject label)
|
||||
{
|
||||
m_RuntimeLabelList.Add(label);
|
||||
}
|
||||
|
||||
public LabelObject GetLabelObject(int index)
|
||||
{
|
||||
if (index >= 0 && index < m_RuntimeLabelList.Count)
|
||||
{
|
||||
return m_RuntimeLabelList[index];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void SetLabelObjectPosition(int index, Vector3 pos)
|
||||
{
|
||||
if (index >= 0 && index < m_RuntimeLabelList.Count)
|
||||
{
|
||||
m_RuntimeLabelList[index].SetPosition(pos);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetLabelObjectText(int index, string text)
|
||||
{
|
||||
if (index >= 0 && index < m_RuntimeLabelList.Count)
|
||||
{
|
||||
m_RuntimeLabelList[index].SetText(text);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetLabelObjectActive(bool flag)
|
||||
{
|
||||
foreach (var label in m_RuntimeLabelList)
|
||||
{
|
||||
label.SetActive(flag);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/XCharts/Runtime/Component/Sub/GaugeAxis.cs.meta
Normal file
11
Assets/XCharts/Runtime/Component/Sub/GaugeAxis.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 67cba46d89b9b478fa6dcf067e7b49b7
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
40
Assets/XCharts/Runtime/Component/Sub/GaugePointer.cs
Normal file
40
Assets/XCharts/Runtime/Component/Sub/GaugePointer.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Settings related to gauge pointer.
|
||||
/// 仪表盘指针相关设置。
|
||||
/// </summary>
|
||||
[System.Serializable]
|
||||
public class GaugePointer : SubComponent
|
||||
{
|
||||
[SerializeField] private bool m_Show = true;
|
||||
[SerializeField] private float m_Length = 0.8f;
|
||||
[SerializeField] private float m_Width = 15;
|
||||
|
||||
/// <summary>
|
||||
/// 是否显示指针。
|
||||
/// </summary>
|
||||
public bool show { get { return m_Show; } set { m_Show = value; } }
|
||||
/// <summary>
|
||||
/// 指针长度。可以是绝对值,也可以是相对于半径的百分比(0-1的浮点数)
|
||||
/// </summary>
|
||||
/// <value></value>
|
||||
public float length { get { return m_Length; } set { m_Length = value; } }
|
||||
/// <summary>
|
||||
/// 指针宽度。
|
||||
/// </summary>
|
||||
/// <value></value>
|
||||
public float width { get { return m_Width; } set { m_Width = value; } }
|
||||
}
|
||||
}
|
||||
11
Assets/XCharts/Runtime/Component/Sub/GaugePointer.cs.meta
Normal file
11
Assets/XCharts/Runtime/Component/Sub/GaugePointer.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 55e453b57f6514da09e98571439d4dcc
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -23,10 +23,12 @@ namespace XCharts
|
||||
}
|
||||
[SerializeField] private bool m_Enable = true;
|
||||
[SerializeField] private Easing m_Easting;
|
||||
[SerializeField] private int m_Duration = 1000;
|
||||
[SerializeField] private float m_Duration = 1000;
|
||||
[SerializeField] private int m_Threshold = 2000;
|
||||
[SerializeField] private int m_Delay = 0;
|
||||
[SerializeField] private int m_ActualDuration;
|
||||
[SerializeField] private float m_Delay = 0;
|
||||
[SerializeField] private bool m_UpdateAnimation = false;
|
||||
[SerializeField] private float m_UpdateDuration = 500;
|
||||
[SerializeField] private float m_ActualDuration;
|
||||
|
||||
/// <summary>
|
||||
/// Whether to enable animation.
|
||||
@@ -42,12 +44,12 @@ namespace XCharts
|
||||
/// The milliseconds duration of the first animation.
|
||||
/// 设定的动画时长(毫秒)。
|
||||
/// </summary>
|
||||
public int duration { get { return m_Duration; } set { m_Duration = value; } }
|
||||
public float duration { get { return m_Duration; } set { m_Duration = value < 0 ? 0 : value; } }
|
||||
/// <summary>
|
||||
/// The milliseconds actual duration of the first animation.
|
||||
/// 实际的动画时长(毫秒)。
|
||||
/// </summary>
|
||||
public int actualDuration { get { return m_ActualDuration; } }
|
||||
public float actualDuration { get { return m_ActualDuration; } }
|
||||
/// <summary>
|
||||
/// Whether to set graphic number threshold to animation. Animation will be disabled when graphic number is larger than threshold.
|
||||
/// 是否开启动画的阈值,当单个系列显示的图形数量大于这个阈值时会关闭动画。
|
||||
@@ -57,7 +59,16 @@ namespace XCharts
|
||||
/// The milliseconds delay before updating the first animation.
|
||||
/// 动画延时(毫秒)。
|
||||
/// </summary>
|
||||
public int delay { get { return m_Delay; } set { m_Delay = value; if (m_Delay < 0) m_Delay = 0; } }
|
||||
public float delay { get { return m_Delay; } set { m_Delay = value < 0 ? 0 : value; } }
|
||||
/// <summary>
|
||||
/// 是否开启数据变更动画。
|
||||
/// </summary>
|
||||
public bool updateAnimation { get { return m_UpdateAnimation; } set { m_UpdateAnimation = value; } }
|
||||
/// <summary>
|
||||
/// The milliseconds duration of the first animation.
|
||||
/// 数据变更的动画时长(毫秒)。
|
||||
/// </summary>
|
||||
public float updateDuration { get { return m_UpdateDuration; } set { m_UpdateDuration = value < 0 ? 0 : value; } }
|
||||
|
||||
private Dictionary<int, float> m_DataAnimationState = new Dictionary<int, float>();
|
||||
private bool m_IsStart = false;
|
||||
@@ -232,5 +243,11 @@ namespace XCharts
|
||||
{
|
||||
return m_CurrDataProgress;
|
||||
}
|
||||
|
||||
public float GetUpdateAnimationDuration()
|
||||
{
|
||||
if (m_Enable && m_UpdateAnimation && IsFinish()) return m_UpdateDuration;
|
||||
else return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,8 @@ namespace XCharts
|
||||
[SerializeField] private bool m_Selected;
|
||||
[SerializeField] private float m_Radius;
|
||||
[SerializeField] private IconStyle m_IconStyle = new IconStyle();
|
||||
[SerializeField] private bool m_EnableLabel = false;
|
||||
[SerializeField] private SerieLabel m_Label = new SerieLabel();
|
||||
[SerializeField] private List<float> m_Data = new List<float>();
|
||||
|
||||
private bool m_Show = true;
|
||||
@@ -58,6 +60,14 @@ namespace XCharts
|
||||
/// </summary>
|
||||
public IconStyle iconStyle { get { return m_IconStyle; } set { m_IconStyle = value; } }
|
||||
/// <summary>
|
||||
/// 是否启用单个数据项的标签设置。
|
||||
/// </summary>
|
||||
public bool enableLabel { get { return m_EnableLabel; } set { m_EnableLabel = value; } }
|
||||
/// <summary>
|
||||
/// 单个数据项的标签设置。
|
||||
/// </summary>
|
||||
public SerieLabel label { get { return m_Label; } set { m_Label = value; } }
|
||||
/// <summary>
|
||||
/// An arbitrary dimension data list of data item.
|
||||
/// 可指定任意维数的数值列表。
|
||||
/// </summary>
|
||||
@@ -143,12 +153,67 @@ namespace XCharts
|
||||
public float runtimePieOffsetRadius { get; internal set; }
|
||||
public Vector3 runtiemPieOffsetCenter { get; internal set; }
|
||||
|
||||
private bool m_DataChanged;
|
||||
private float m_LastData;
|
||||
private float m_DataUpdateTime;
|
||||
|
||||
public float GetData(int index)
|
||||
{
|
||||
if (index >= 0 && index < m_Data.Count) return m_Data[index];
|
||||
if (index >= 0 && index < m_Data.Count)
|
||||
{
|
||||
return m_Data[index];
|
||||
}
|
||||
else return 0;
|
||||
}
|
||||
|
||||
public float GetCurrData(int index, float animationDuration = 500f)
|
||||
{
|
||||
if (index == 1 && m_DataChanged)
|
||||
{
|
||||
var time = Time.time - m_DataUpdateTime;
|
||||
var total = animationDuration / 1000;
|
||||
if (animationDuration > 0 && time <= total)
|
||||
{
|
||||
var curr = Mathf.Lerp(m_LastData, GetData(index), time / total);
|
||||
return curr;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_DataChanged = false;
|
||||
return GetData(index);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return GetData(index);
|
||||
}
|
||||
}
|
||||
|
||||
public float GetLastData(int index)
|
||||
{
|
||||
if (index == 1 && m_DataChanged) return m_LastData;
|
||||
else return GetData(index);
|
||||
}
|
||||
|
||||
public void UpdateData(int dimension, float value)
|
||||
{
|
||||
if (dimension >= 0 && dimension < data.Count)
|
||||
{
|
||||
if (dimension == 1)
|
||||
{
|
||||
m_LastData = data[dimension];
|
||||
m_DataUpdateTime = Time.time;
|
||||
m_DataChanged = true;
|
||||
}
|
||||
data[dimension] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsDataChanged()
|
||||
{
|
||||
return m_DataChanged;
|
||||
}
|
||||
|
||||
public void InitLabel(GameObject labelObj, bool autoSize, float paddingLeftRight, float paddingTopBottom)
|
||||
{
|
||||
gameObject = labelObj;
|
||||
@@ -169,7 +234,7 @@ namespace XCharts
|
||||
|
||||
public bool SetLabelText(string text)
|
||||
{
|
||||
if (labelText)
|
||||
if (labelText && !labelText.text.Equals(text))
|
||||
{
|
||||
labelText.text = text;
|
||||
if (m_LabelAutoSize)
|
||||
@@ -185,6 +250,14 @@ namespace XCharts
|
||||
return false;
|
||||
}
|
||||
|
||||
public void SetLabelColor(Color color)
|
||||
{
|
||||
if (labelText)
|
||||
{
|
||||
labelText.color = color;
|
||||
}
|
||||
}
|
||||
|
||||
public float GetLabelWidth()
|
||||
{
|
||||
if (labelRect) return labelRect.sizeDelta.x;
|
||||
@@ -224,5 +297,16 @@ namespace XCharts
|
||||
if (iconStyle == null) return;
|
||||
iconStyle.UpdateIcon();
|
||||
}
|
||||
|
||||
public bool IsInitLabel()
|
||||
{
|
||||
return labelText != null;
|
||||
}
|
||||
|
||||
public SerieLabel GetSerieLabel(SerieLabel parentLabel)
|
||||
{
|
||||
if (enableLabel) return label;
|
||||
else return parentLabel;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,6 +80,7 @@ namespace XCharts
|
||||
[SerializeField] private bool m_Show = false;
|
||||
[SerializeField] Position m_Position;
|
||||
[SerializeField] private Vector3 m_Offset;
|
||||
[SerializeField] private float m_Margin;
|
||||
[SerializeField] private string m_Formatter;
|
||||
[SerializeField] private float m_Rotate = 0;
|
||||
[SerializeField] private float m_PaddingLeftRight = 2f;
|
||||
@@ -130,6 +131,10 @@ namespace XCharts
|
||||
/// </summary>
|
||||
public Vector3 offset { get { return m_Offset; } set { m_Offset = value; } }
|
||||
/// <summary>
|
||||
/// 距离轴线的距离。
|
||||
/// </summary>
|
||||
public float margin { get { return m_Margin; } set { m_Margin = value; } }
|
||||
/// <summary>
|
||||
/// Text color,If set as default ,the color will assigned as series color.
|
||||
/// 自定义文字颜色,默认和系列的颜色一致。
|
||||
/// </summary>
|
||||
|
||||
109
Assets/XCharts/Runtime/Component/Sub/TitleStyle.cs
Normal file
109
Assets/XCharts/Runtime/Component/Sub/TitleStyle.cs
Normal file
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
/// <summary>
|
||||
/// the title of serie.
|
||||
/// 标题相关设置。
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class TitleStyle : SubComponent, IEquatable<TitleStyle>
|
||||
{
|
||||
[SerializeField] private bool m_Show;
|
||||
[SerializeField] private TextStyle m_textStyle = new TextStyle(18);
|
||||
|
||||
/// <summary>
|
||||
/// Whether to show title.
|
||||
/// 是否显示标题。
|
||||
/// </summary>
|
||||
public bool show { get { return m_Show; } set { m_Show = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// the color of text.
|
||||
/// 文本的颜色。
|
||||
/// </summary>
|
||||
public TextStyle textStyle { get { return m_textStyle; } set { m_textStyle = value; } }
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public Text runtimeText { get; set; }
|
||||
|
||||
public TitleStyle Clone()
|
||||
{
|
||||
var title = new TitleStyle();
|
||||
title.show = show;
|
||||
title.textStyle = textStyle.Clone();
|
||||
return title;
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
if (ReferenceEquals(null, obj))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else if (obj is TitleStyle)
|
||||
{
|
||||
return Equals((TitleStyle)obj);
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public bool Equals(TitleStyle other)
|
||||
{
|
||||
if (ReferenceEquals(null, other))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return textStyle.Equals(other.textStyle);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return base.GetHashCode();
|
||||
}
|
||||
|
||||
public bool IsInited()
|
||||
{
|
||||
return runtimeText != null;
|
||||
}
|
||||
|
||||
public void SetActive(bool active)
|
||||
{
|
||||
if (runtimeText)
|
||||
{
|
||||
ChartHelper.SetActive(runtimeText, active);
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdatePosition(Vector3 pos)
|
||||
{
|
||||
if (runtimeText)
|
||||
{
|
||||
runtimeText.transform.localPosition = pos + new Vector3(m_textStyle.offset.x, m_textStyle.offset.y);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetText(string text)
|
||||
{
|
||||
if (runtimeText)
|
||||
{
|
||||
if (textStyle.color != Color.clear) runtimeText.color = textStyle.color;
|
||||
runtimeText.text = text;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/XCharts/Runtime/Component/Sub/TitleStyle.cs.meta
Normal file
11
Assets/XCharts/Runtime/Component/Sub/TitleStyle.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0f3865dea73ae403581fe83cfeca13f0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
432
Assets/XCharts/Runtime/GaugeChart.cs
Normal file
432
Assets/XCharts/Runtime/GaugeChart.cs
Normal file
@@ -0,0 +1,432 @@
|
||||
using System;
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
[AddComponentMenu("XCharts/GaugeChart", 19)]
|
||||
[ExecuteInEditMode]
|
||||
[RequireComponent(typeof(RectTransform))]
|
||||
[DisallowMultipleComponent]
|
||||
public class GaugeChart : BaseChart
|
||||
{
|
||||
private static readonly string s_AxisLabelObjectName = "axis_label";
|
||||
private bool m_UpdateTitleText = false;
|
||||
private bool m_UpdateLabelText = false;
|
||||
|
||||
protected override void Awake()
|
||||
{
|
||||
base.Awake();
|
||||
InitAxisLabel();
|
||||
}
|
||||
|
||||
protected override void Start()
|
||||
{
|
||||
base.Start();
|
||||
foreach (var serie in m_Series.list)
|
||||
{
|
||||
UpdateTitle(serie);
|
||||
UpdateLabel(serie);
|
||||
}
|
||||
UpdateTitleAndLabelText();
|
||||
}
|
||||
|
||||
protected override void Update()
|
||||
{
|
||||
base.Update();
|
||||
if (m_UpdateLabelText || m_UpdateTitleText)
|
||||
{
|
||||
m_UpdateTitleText = false;
|
||||
m_UpdateLabelText = false;
|
||||
UpdateTitleAndLabelText();
|
||||
}
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
protected override void Reset()
|
||||
{
|
||||
base.Reset();
|
||||
RemoveData();
|
||||
m_Title.text = "GuageChart";
|
||||
var serie = AddSerie(SerieType.Gauge, "serie1");
|
||||
serie.min = 0;
|
||||
serie.max = 100;
|
||||
serie.startAngle = -125;
|
||||
serie.endAngle = 125;
|
||||
serie.center[0] = 0.5f;
|
||||
serie.center[1] = 0.5f;
|
||||
serie.radius[0] = 80;
|
||||
serie.splitNumber = 5;
|
||||
serie.animation.updateAnimation = true;
|
||||
serie.titleStyle.show = true;
|
||||
serie.titleStyle.textStyle.offset = new Vector2(0, 20);
|
||||
serie.label.show = true;
|
||||
serie.label.offset = new Vector3(0, -30);
|
||||
serie.itemStyle.show = true;
|
||||
serie.gaugeAxis.axisLabel.show = true;
|
||||
serie.gaugeAxis.axisLabel.margin = 18;
|
||||
AddData(0, UnityEngine.Random.Range(10, 90), "title");
|
||||
InitAxisLabel();
|
||||
}
|
||||
#endif
|
||||
|
||||
private void InitAxisLabel()
|
||||
{
|
||||
Debug.LogError("InitAxisLabel");
|
||||
var labelObject = ChartHelper.AddObject(s_AxisLabelObjectName, transform, Vector2.zero,
|
||||
Vector2.zero, Vector2.zero, new Vector2(chartWidth, chartHeight));
|
||||
SerieLabelPool.ReleaseAll(labelObject.transform);
|
||||
for (int i = 0; i < m_Series.Count; i++)
|
||||
{
|
||||
var serie = m_Series.list[i];
|
||||
|
||||
var serieLabel = serie.gaugeAxis.axisLabel;
|
||||
serie.gaugeAxis.ClearLabelObject();
|
||||
var count = serie.splitNumber > 36 ? 36 : (serie.splitNumber + 1);
|
||||
var startAngle = serie.startAngle;
|
||||
Debug.LogError("InitAxisLabel:"+serie.name+","+count);
|
||||
for (int j = 0; j < count; j++)
|
||||
{
|
||||
var textName = ChartCached.GetSerieLabelName(s_SerieLabelObjectName, i, j);
|
||||
var color = Color.grey;
|
||||
var labelObj = SerieLabelPool.Get(textName, labelObject.transform, serieLabel, m_ThemeInfo.font, color, 100, 100);
|
||||
var iconImage = labelObj.transform.Find("Icon").GetComponent<Image>();
|
||||
var isAutoSize = serieLabel.backgroundWidth == 0 || serieLabel.backgroundHeight == 0;
|
||||
var item = new LabelObject();
|
||||
item.SetLabel(labelObj, isAutoSize, serieLabel.paddingLeftRight, serieLabel.paddingTopBottom);
|
||||
item.SetIcon(iconImage);
|
||||
item.SetIconActive(false);
|
||||
serie.gaugeAxis.AddLabelObject(item);
|
||||
}
|
||||
UpdateAxisLabel(serie);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void DrawChart(VertexHelper vh)
|
||||
{
|
||||
base.DrawChart(vh);
|
||||
DrawData(vh);
|
||||
}
|
||||
|
||||
protected override void OnThemeChanged()
|
||||
{
|
||||
base.OnThemeChanged();
|
||||
}
|
||||
|
||||
private void DrawData(VertexHelper vh)
|
||||
{
|
||||
for (int i = 0; i < m_Series.Count; i++)
|
||||
{
|
||||
var serie = m_Series.list[i];
|
||||
if (serie.type != SerieType.Gauge) continue;
|
||||
DrawGauge(vh, serie);
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawGauge(VertexHelper vh, Serie serie)
|
||||
{
|
||||
serie.UpdateCenter(chartWidth, chartHeight);
|
||||
var destAngle = GetCurrAngle(serie, true);
|
||||
serie.animation.InitProgress(0, serie.startAngle, destAngle);
|
||||
var currAngle = serie.animation.IsFinish() ? GetCurrAngle(serie, false) : serie.animation.GetCurrDetail();
|
||||
|
||||
DrawProgressBar(vh, serie, currAngle);
|
||||
DrawStageColor(vh, serie);
|
||||
DrawSplitLine(vh, serie);
|
||||
DrawAxisTick(vh, serie);
|
||||
DrawPointer(vh, serie, currAngle);
|
||||
UpdateTitle(serie);
|
||||
// UpdateAxisLabel(serie);
|
||||
UpdateLabel(serie);
|
||||
|
||||
CheckAnimation(serie);
|
||||
if (!serie.animation.IsFinish())
|
||||
{
|
||||
float duration = serie.animation.duration > 0 ? (float)serie.animation.duration / 1000 : 1;
|
||||
float speed = (destAngle - serie.startAngle) / duration;
|
||||
serie.animation.CheckProgress(Time.deltaTime * speed);
|
||||
RefreshChart();
|
||||
}
|
||||
else if (NeedRefresh(serie))
|
||||
{
|
||||
RefreshChart();
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawProgressBar(VertexHelper vh, Serie serie, float currAngle)
|
||||
{
|
||||
if (serie.gaugeType != GaugeType.ProgressBar) return;
|
||||
if (!serie.gaugeAxis.show || !serie.gaugeAxis.axisLine.show) return;
|
||||
var color = serie.gaugeAxis.GetAxisLineColor(m_ThemeInfo, serie.index);
|
||||
var backgroundColor = serie.gaugeAxis.GetAxisLineBackgroundColor(m_ThemeInfo, serie.index);
|
||||
var outsideRadius = serie.runtimeInsideRadius + serie.gaugeAxis.axisLine.width;
|
||||
ChartDrawer.DrawDoughnut(vh, serie.runtimeCenterPos, serie.runtimeInsideRadius, outsideRadius,
|
||||
backgroundColor, m_ThemeInfo.backgroundColor, m_Settings.cicleSmoothness, serie.startAngle, serie.endAngle);
|
||||
if (serie.arcShaped)
|
||||
{
|
||||
DrawArcShape(vh, serie, serie.startAngle, backgroundColor, true);
|
||||
DrawArcShape(vh, serie, serie.endAngle, backgroundColor);
|
||||
}
|
||||
ChartDrawer.DrawDoughnut(vh, serie.runtimeCenterPos, serie.runtimeInsideRadius, outsideRadius,
|
||||
color, m_ThemeInfo.backgroundColor, m_Settings.cicleSmoothness, serie.startAngle, currAngle);
|
||||
if (serie.arcShaped && currAngle != serie.startAngle)
|
||||
{
|
||||
DrawArcShape(vh, serie, currAngle, color);
|
||||
DrawArcShape(vh, serie, serie.startAngle, color, true);
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawStageColor(VertexHelper vh, Serie serie)
|
||||
{
|
||||
if (serie.gaugeType != GaugeType.Pointer) return;
|
||||
if (!serie.gaugeAxis.show || !serie.gaugeAxis.axisLine.show) return;
|
||||
var totalAngle = serie.endAngle - serie.startAngle;
|
||||
var tempStartAngle = serie.startAngle;
|
||||
var tempEndAngle = serie.startAngle;
|
||||
var outsideRadius = serie.runtimeInsideRadius + serie.gaugeAxis.axisLine.width;
|
||||
serie.gaugeAxis.runtimeStageAngle.Clear();
|
||||
for (int i = 0; i < serie.gaugeAxis.axisLine.stageColor.Count; i++)
|
||||
{
|
||||
var stageColor = serie.gaugeAxis.axisLine.stageColor[i];
|
||||
tempEndAngle = serie.startAngle + totalAngle * stageColor.percent;
|
||||
serie.gaugeAxis.runtimeStageAngle.Add(tempEndAngle);
|
||||
ChartDrawer.DrawDoughnut(vh, serie.runtimeCenterPos, serie.runtimeInsideRadius, outsideRadius,
|
||||
stageColor.color, m_ThemeInfo.backgroundColor, m_Settings.cicleSmoothness, tempStartAngle, tempEndAngle);
|
||||
tempStartAngle = tempEndAngle;
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawPointer(VertexHelper vh, Serie serie, float currAngle)
|
||||
{
|
||||
if (!serie.gaugePointer.show) return;
|
||||
var pointerColor = serie.gaugeAxis.GetPointerColor(m_ThemeInfo, serie.index, currAngle, serie.itemStyle);
|
||||
var len = serie.gaugePointer.length < 1 && serie.gaugePointer.length > -1 ?
|
||||
serie.runtimeInsideRadius * serie.gaugePointer.length :
|
||||
serie.gaugePointer.length;
|
||||
var p1 = ChartHelper.GetPosition(serie.runtimeCenterPos, currAngle, len);
|
||||
var p2 = ChartHelper.GetPosition(serie.runtimeCenterPos, currAngle + 180, serie.gaugePointer.width);
|
||||
var p3 = ChartHelper.GetPosition(serie.runtimeCenterPos, currAngle - 90, serie.gaugePointer.width / 2);
|
||||
var p4 = ChartHelper.GetPosition(serie.runtimeCenterPos, currAngle + 90, serie.gaugePointer.width / 2);
|
||||
ChartDrawer.DrawPolygon(vh, p1, p3, p2, p4, pointerColor);
|
||||
}
|
||||
|
||||
private void DrawSplitLine(VertexHelper vh, Serie serie)
|
||||
{
|
||||
if (serie.gaugeType != GaugeType.Pointer) return;
|
||||
if (!serie.gaugeAxis.show || !serie.gaugeAxis.splitLine.show) return;
|
||||
if (serie.splitNumber <= 0) return;
|
||||
var splitLine = serie.gaugeAxis.splitLine;
|
||||
var totalAngle = serie.endAngle - serie.startAngle;
|
||||
var diffAngle = totalAngle / serie.splitNumber;
|
||||
var outsideRadius = serie.runtimeInsideRadius + serie.gaugeAxis.axisLine.width;
|
||||
var insideRadius = outsideRadius - splitLine.length;
|
||||
var lineWidth = splitLine.lineStyle.width;
|
||||
for (int i = 0; i < serie.splitNumber + 1; i++)
|
||||
{
|
||||
var angle = serie.startAngle + i * diffAngle;
|
||||
var lineColor = serie.gaugeAxis.GetSplitLineColor(m_ThemeInfo, serie.index, angle);
|
||||
var p1 = ChartHelper.GetPosition(serie.runtimeCenterPos, angle, insideRadius);
|
||||
var p2 = ChartHelper.GetPosition(serie.runtimeCenterPos, angle, outsideRadius);
|
||||
ChartDrawer.DrawLine(vh, p1, p2, lineWidth, lineColor);
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawAxisTick(VertexHelper vh, Serie serie)
|
||||
{
|
||||
if (serie.gaugeType != GaugeType.Pointer) return;
|
||||
if (!serie.gaugeAxis.show || !serie.gaugeAxis.axisTick.show) return;
|
||||
if (serie.splitNumber <= 0) return;
|
||||
var axisTick = serie.gaugeAxis.axisTick;
|
||||
var totalAngle = serie.endAngle - serie.startAngle;
|
||||
var diffAngle = totalAngle / serie.splitNumber;
|
||||
var outsideRadius = serie.runtimeInsideRadius + serie.gaugeAxis.axisLine.width;
|
||||
var insideRadius = outsideRadius - (axisTick.length < 1 ? serie.gaugeAxis.axisLine.width * axisTick.length : axisTick.length);
|
||||
var lineWidth = axisTick.lineStyle.width;
|
||||
for (int i = 0; i < serie.splitNumber; i++)
|
||||
{
|
||||
for (int j = 1; j < axisTick.splitNumber; j++)
|
||||
{
|
||||
var angle = serie.startAngle + i * diffAngle + j * (diffAngle / axisTick.splitNumber);
|
||||
var lineColor = serie.gaugeAxis.GetSplitLineColor(m_ThemeInfo, serie.index, angle);
|
||||
var p1 = ChartHelper.GetPosition(serie.runtimeCenterPos, angle, insideRadius);
|
||||
var p2 = ChartHelper.GetPosition(serie.runtimeCenterPos, angle, outsideRadius);
|
||||
ChartDrawer.DrawLine(vh, p1, p2, lineWidth, lineColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private bool NeedRefresh(Serie serie)
|
||||
{
|
||||
if (serie.type == SerieType.Gauge)
|
||||
{
|
||||
var serieData = serie.GetSerieData(0);
|
||||
if (serieData != null)
|
||||
{
|
||||
var destValue = serieData.GetData(1);
|
||||
var currValue = serieData.GetCurrData(1, serie.animation.GetUpdateAnimationDuration());
|
||||
return destValue != currValue;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void DrawArcShape(VertexHelper vh, Serie serie, float angle, Color color, bool invert = false)
|
||||
{
|
||||
var radius = serie.gaugeAxis.axisLine.width / 2;
|
||||
var len = serie.runtimeInsideRadius + radius;
|
||||
var pos = ChartHelper.GetPosition(serie.runtimeCenterPos, angle, len);
|
||||
var startAngle = invert ? angle + 180 : angle;
|
||||
var endAngle = invert ? angle + 360 : angle + 180;
|
||||
ChartDrawer.DrawSector(vh, pos, radius, color, startAngle, endAngle);
|
||||
}
|
||||
|
||||
private void CheckAnimation(Serie serie)
|
||||
{
|
||||
var serieData = serie.GetSerieData(0);
|
||||
if (serieData != null)
|
||||
{
|
||||
var value = serieData.GetCurrData(1, serie.animation.GetUpdateAnimationDuration());
|
||||
var data = serieData.GetData(1);
|
||||
if (value != data) m_RefreshChart = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateTitle(Serie serie)
|
||||
{
|
||||
if (serie.titleStyle.show)
|
||||
{
|
||||
if (serie.titleStyle.IsInited())
|
||||
{
|
||||
serie.titleStyle.SetActive(true);
|
||||
serie.titleStyle.UpdatePosition(serie.runtimeCenterPos);
|
||||
m_UpdateTitleText = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ReinitTitle = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
serie.titleStyle.SetActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateAxisLabel(Serie serie)
|
||||
{
|
||||
var show = serie.gaugeAxis.show && serie.gaugeAxis.axisLabel.show;
|
||||
serie.gaugeAxis.SetLabelObjectActive(show);
|
||||
if (!show)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var count = serie.splitNumber > 36 ? 36 : serie.splitNumber;
|
||||
var startAngle = serie.startAngle;
|
||||
var totalAngle = serie.endAngle - serie.startAngle;
|
||||
var totalValue = serie.max - serie.min;
|
||||
var diffAngle = totalAngle / count;
|
||||
var diffValue = totalValue / count;
|
||||
var radius = serie.runtimeInsideRadius - serie.gaugeAxis.axisLabel.margin;
|
||||
var serieData = serie.GetSerieData(0);
|
||||
var dataName = serieData != null ? serieData.name : null;
|
||||
var customLabelText = serie.gaugeAxis.axisLabelText;
|
||||
for (int j = 0; j <= count; j++)
|
||||
{
|
||||
var angle = serie.startAngle + j * diffAngle;
|
||||
var value = serie.min + j * diffValue;
|
||||
var pos = ChartHelper.GetPosition(serie.runtimeCenterPos, angle, radius);
|
||||
var text = customLabelText != null && j < customLabelText.Count ? customLabelText[j] :
|
||||
serie.gaugeAxis.axisLabel.GetFormatterContent(serie.name, dataName, value, totalValue);
|
||||
serie.gaugeAxis.SetLabelObjectText(j, text);
|
||||
serie.gaugeAxis.SetLabelObjectPosition(j, pos);
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateLabel(Serie serie)
|
||||
{
|
||||
var serieData = serie.GetSerieData(0);
|
||||
if (serieData != null)
|
||||
{
|
||||
if (serie.label.show)
|
||||
{
|
||||
if (serieData.IsInitLabel())
|
||||
{
|
||||
serieData.SetLabelActive(true);
|
||||
serieData.SetLabelPosition(serie.runtimeCenterPos + serie.label.offset);
|
||||
m_UpdateLabelText = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ReinitLabel = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
serieData.SetLabelActive(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateTitleAndLabelText()
|
||||
{
|
||||
foreach (var serie in m_Series.list)
|
||||
{
|
||||
if (serie.type == SerieType.Gauge)
|
||||
{
|
||||
var serieData = serie.GetSerieData(0);
|
||||
if (serieData != null)
|
||||
{
|
||||
if (serie.label.show && serieData.IsInitLabel())
|
||||
{
|
||||
var value = serieData.GetData(1);
|
||||
var total = serie.max;
|
||||
var content = serie.label.GetFormatterContent(serie.name, serieData.name, value, total);
|
||||
serieData.SetLabelText(content);
|
||||
if (serie.label.color != Color.clear)
|
||||
{
|
||||
serieData.SetLabelColor(serie.label.color);
|
||||
}
|
||||
}
|
||||
if (serie.titleStyle.show && serie.titleStyle.IsInited())
|
||||
{
|
||||
serie.titleStyle.SetText(serieData.name);
|
||||
}
|
||||
}
|
||||
UpdateAxisLabel(serie);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private float GetCurrAngle(Serie serie, bool dest)
|
||||
{
|
||||
float rangeValue = serie.max - serie.min;
|
||||
float rangeAngle = serie.endAngle - serie.startAngle;
|
||||
float value = 0;
|
||||
float angle = serie.startAngle;
|
||||
if (serie.dataCount > 0)
|
||||
{
|
||||
var serieData = serie.data[0];
|
||||
value = dest ? serieData.GetData(1) : serieData.GetCurrData(1, serie.animation.GetUpdateAnimationDuration());
|
||||
value = Mathf.Clamp(value, serie.min, serie.max);
|
||||
}
|
||||
if (rangeValue > 0)
|
||||
{
|
||||
angle += rangeAngle * value / rangeValue;
|
||||
}
|
||||
return angle;
|
||||
}
|
||||
|
||||
protected override void OnRefreshLabel()
|
||||
{
|
||||
//TODO:
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/XCharts/Runtime/GaugeChart.cs.meta
Normal file
11
Assets/XCharts/Runtime/GaugeChart.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2c7cdc3b6d7f9473289a599c00a2569c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -34,9 +34,10 @@ namespace XCharts
|
||||
IPointerEnterHandler, IPointerExitHandler, IBeginDragHandler,
|
||||
IDragHandler, IEndDragHandler, IScrollHandler
|
||||
{
|
||||
private static readonly string s_TitleObjectName = "title";
|
||||
private static readonly string s_LegendObjectName = "legend";
|
||||
private static readonly string s_SerieLabelObjectName = "label";
|
||||
protected static readonly string s_TitleObjectName = "title";
|
||||
protected static readonly string s_LegendObjectName = "legend";
|
||||
protected static readonly string s_SerieLabelObjectName = "label";
|
||||
protected static readonly string s_SerieTitleObjectName = "serie";
|
||||
|
||||
[SerializeField] protected float m_ChartWidth;
|
||||
[SerializeField] protected float m_ChartHeight;
|
||||
@@ -62,7 +63,9 @@ namespace XCharts
|
||||
[NonSerialized] protected bool m_RefreshChart = false;
|
||||
[NonSerialized] protected bool m_RefreshLabel = false;
|
||||
[NonSerialized] protected bool m_ReinitLabel = false;
|
||||
[NonSerialized] protected bool m_ReinitTitle = false;
|
||||
[NonSerialized] protected bool m_CheckAnimation = false;
|
||||
[NonSerialized] protected bool m_IsPlayingStartAnimation = false;
|
||||
[NonSerialized] protected List<string> m_LegendRealShowName = new List<string>();
|
||||
|
||||
protected Vector2 chartAnchorMax { get { return rectTransform.anchorMax; } }
|
||||
@@ -87,6 +90,7 @@ namespace XCharts
|
||||
InitTitle();
|
||||
InitLegend();
|
||||
InitSerieLabel();
|
||||
InitSerieTitle();
|
||||
InitTooltip();
|
||||
m_Series.AnimationStop();
|
||||
m_Series.AnimationStart();
|
||||
@@ -300,33 +304,64 @@ namespace XCharts
|
||||
for (int j = 0; j < serie.data.Count; j++)
|
||||
{
|
||||
var serieData = serie.data[j];
|
||||
if (!serie.label.show && j > 100) continue;
|
||||
var serieLabel = serieData.GetSerieLabel(serie.label);
|
||||
if (!serieLabel.show && j > 100) continue;
|
||||
var textName = ChartCached.GetSerieLabelName(s_SerieLabelObjectName, i, j);
|
||||
var color = Color.grey;
|
||||
if (serie.type == SerieType.Pie)
|
||||
{
|
||||
color = (serie.label.position == SerieLabel.Position.Inside) ? Color.white :
|
||||
color = (serieLabel.position == SerieLabel.Position.Inside) ? Color.white :
|
||||
(Color)m_ThemeInfo.GetColor(count);
|
||||
}
|
||||
else
|
||||
{
|
||||
color = serie.label.color != Color.clear ? serie.label.color :
|
||||
color = serieLabel.color != Color.clear ? serieLabel.color :
|
||||
(Color)m_ThemeInfo.GetColor(i);
|
||||
}
|
||||
var labelObj = SerieLabelPool.Get(textName, labelObject.transform, serie.label, m_ThemeInfo.font, color, serieData);
|
||||
var labelObj = SerieLabelPool.Get(textName, labelObject.transform, serieLabel, m_ThemeInfo.font, color,
|
||||
serieData.iconStyle.width, serieData.iconStyle.height);
|
||||
var iconImage = labelObj.transform.Find("Icon").GetComponent<Image>();
|
||||
serieData.SetIconImage(iconImage);
|
||||
|
||||
var isAutoSize = serie.label.backgroundWidth == 0 || serie.label.backgroundHeight == 0;
|
||||
serieData.InitLabel(labelObj, isAutoSize, serie.label.paddingLeftRight, serie.label.paddingTopBottom);
|
||||
var isAutoSize = serieLabel.backgroundWidth == 0 || serieLabel.backgroundHeight == 0;
|
||||
serieData.InitLabel(labelObj, isAutoSize, serieLabel.paddingLeftRight, serieLabel.paddingTopBottom);
|
||||
serieData.SetLabelActive(false);
|
||||
serieData.SetLabelText(serieData.name);
|
||||
|
||||
//serieData.SetLabelText(serieData.name);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void InitSerieTitle()
|
||||
{
|
||||
var titleObject = ChartHelper.AddObject(s_SerieTitleObjectName, transform, Vector2.zero,
|
||||
Vector2.zero, Vector2.zero, new Vector2(chartWidth, chartHeight));
|
||||
ChartHelper.HideAllObject(titleObject);
|
||||
for (int i = 0; i < m_Series.Count; i++)
|
||||
{
|
||||
var serie = m_Series.list[i];
|
||||
var textStyle = serie.titleStyle.textStyle;
|
||||
var color = textStyle.color == Color.clear ? m_ThemeInfo.GetColor(i) : (Color32)textStyle.color;
|
||||
var anchorMin = new Vector2(0.5f, 0.5f);
|
||||
var anchorMax = new Vector2(0.5f, 0.5f);
|
||||
var pivot = new Vector2(0.5f, 0.5f);
|
||||
var fontSize = 10;
|
||||
var sizeDelta = new Vector2(50, fontSize + 2);
|
||||
var txt = ChartHelper.AddTextObject("title_" + i, titleObject.transform, m_ThemeInfo.font, color, TextAnchor.MiddleCenter,
|
||||
anchorMin, anchorMax, pivot, sizeDelta, textStyle.fontSize, textStyle.rotate, textStyle.fontStyle);
|
||||
txt.text = "";
|
||||
txt.transform.localPosition = new Vector2(0, 0);
|
||||
txt.transform.localEulerAngles = Vector2.zero;
|
||||
ChartHelper.SetActive(txt, false);
|
||||
serie.titleStyle.runtimeText = txt;
|
||||
var serieData = serie.GetSerieData(0);
|
||||
if (serieData != null)
|
||||
{
|
||||
txt.text = serieData.name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void InitTooltip()
|
||||
{
|
||||
@@ -507,6 +542,11 @@ namespace XCharts
|
||||
m_LegendRealShowName = m_Series.GetSerieNameList();
|
||||
InitSerieLabel();
|
||||
}
|
||||
if (m_ReinitTitle)
|
||||
{
|
||||
m_ReinitTitle = false;
|
||||
InitSerieTitle();
|
||||
}
|
||||
if (m_RefreshLabel)
|
||||
{
|
||||
m_RefreshLabel = false;
|
||||
@@ -717,25 +757,26 @@ namespace XCharts
|
||||
{
|
||||
var labelHalfWid = serieData.GetLabelWidth() / 2;
|
||||
var labelHalfHig = serieData.GetLabelHeight() / 2;
|
||||
var centerPos = serieData.labelPosition + serie.label.offset;
|
||||
var serieLabel = serieData.GetSerieLabel(serie.label);
|
||||
var centerPos = serieData.labelPosition + serieLabel.offset;
|
||||
var p1 = new Vector3(centerPos.x - labelHalfWid, centerPos.y + labelHalfHig);
|
||||
var p2 = new Vector3(centerPos.x + labelHalfWid, centerPos.y + labelHalfHig);
|
||||
var p3 = new Vector3(centerPos.x + labelHalfWid, centerPos.y - labelHalfHig);
|
||||
var p4 = new Vector3(centerPos.x - labelHalfWid, centerPos.y - labelHalfHig);
|
||||
|
||||
if (serie.label.rotate > 0)
|
||||
if (serieLabel.rotate > 0)
|
||||
{
|
||||
p1 = ChartHelper.RotateRound(p1, centerPos, Vector3.forward, serie.label.rotate);
|
||||
p2 = ChartHelper.RotateRound(p2, centerPos, Vector3.forward, serie.label.rotate);
|
||||
p3 = ChartHelper.RotateRound(p3, centerPos, Vector3.forward, serie.label.rotate);
|
||||
p4 = ChartHelper.RotateRound(p4, centerPos, Vector3.forward, serie.label.rotate);
|
||||
p1 = ChartHelper.RotateRound(p1, centerPos, Vector3.forward, serieLabel.rotate);
|
||||
p2 = ChartHelper.RotateRound(p2, centerPos, Vector3.forward, serieLabel.rotate);
|
||||
p3 = ChartHelper.RotateRound(p3, centerPos, Vector3.forward, serieLabel.rotate);
|
||||
p4 = ChartHelper.RotateRound(p4, centerPos, Vector3.forward, serieLabel.rotate);
|
||||
}
|
||||
|
||||
ChartDrawer.DrawPolygon(vh, p1, p2, p3, p4, serie.label.backgroundColor);
|
||||
ChartDrawer.DrawPolygon(vh, p1, p2, p3, p4, serieLabel.backgroundColor);
|
||||
|
||||
if (serie.label.border)
|
||||
if (serieLabel.border)
|
||||
{
|
||||
var borderWid = serie.label.borderWidth;
|
||||
var borderWid = serieLabel.borderWidth;
|
||||
p1 = new Vector3(centerPos.x - labelHalfWid, centerPos.y + labelHalfHig + borderWid);
|
||||
p2 = new Vector3(centerPos.x + labelHalfWid + 2 * borderWid, centerPos.y + labelHalfHig + borderWid);
|
||||
p3 = new Vector3(centerPos.x + labelHalfWid + borderWid, centerPos.y + labelHalfHig);
|
||||
@@ -744,21 +785,21 @@ namespace XCharts
|
||||
var p6 = new Vector3(centerPos.x - labelHalfWid - 2 * borderWid, centerPos.y - labelHalfHig - borderWid);
|
||||
var p7 = new Vector3(centerPos.x - labelHalfWid - borderWid, centerPos.y - labelHalfHig);
|
||||
var p8 = new Vector3(centerPos.x - labelHalfWid - borderWid, centerPos.y + labelHalfHig + 2 * borderWid);
|
||||
if (serie.label.rotate > 0)
|
||||
if (serieLabel.rotate > 0)
|
||||
{
|
||||
p1 = ChartHelper.RotateRound(p1, centerPos, Vector3.forward, serie.label.rotate);
|
||||
p2 = ChartHelper.RotateRound(p2, centerPos, Vector3.forward, serie.label.rotate);
|
||||
p3 = ChartHelper.RotateRound(p3, centerPos, Vector3.forward, serie.label.rotate);
|
||||
p4 = ChartHelper.RotateRound(p4, centerPos, Vector3.forward, serie.label.rotate);
|
||||
p5 = ChartHelper.RotateRound(p5, centerPos, Vector3.forward, serie.label.rotate);
|
||||
p6 = ChartHelper.RotateRound(p6, centerPos, Vector3.forward, serie.label.rotate);
|
||||
p7 = ChartHelper.RotateRound(p7, centerPos, Vector3.forward, serie.label.rotate);
|
||||
p8 = ChartHelper.RotateRound(p8, centerPos, Vector3.forward, serie.label.rotate);
|
||||
p1 = ChartHelper.RotateRound(p1, centerPos, Vector3.forward, serieLabel.rotate);
|
||||
p2 = ChartHelper.RotateRound(p2, centerPos, Vector3.forward, serieLabel.rotate);
|
||||
p3 = ChartHelper.RotateRound(p3, centerPos, Vector3.forward, serieLabel.rotate);
|
||||
p4 = ChartHelper.RotateRound(p4, centerPos, Vector3.forward, serieLabel.rotate);
|
||||
p5 = ChartHelper.RotateRound(p5, centerPos, Vector3.forward, serieLabel.rotate);
|
||||
p6 = ChartHelper.RotateRound(p6, centerPos, Vector3.forward, serieLabel.rotate);
|
||||
p7 = ChartHelper.RotateRound(p7, centerPos, Vector3.forward, serieLabel.rotate);
|
||||
p8 = ChartHelper.RotateRound(p8, centerPos, Vector3.forward, serieLabel.rotate);
|
||||
}
|
||||
ChartDrawer.DrawLine(vh, p1, p2, borderWid, serie.label.borderColor);
|
||||
ChartDrawer.DrawLine(vh, p3, p4, borderWid, serie.label.borderColor);
|
||||
ChartDrawer.DrawLine(vh, p5, p6, borderWid, serie.label.borderColor);
|
||||
ChartDrawer.DrawLine(vh, p7, p8, borderWid, serie.label.borderColor);
|
||||
ChartDrawer.DrawLine(vh, p1, p2, borderWid, serieLabel.borderColor);
|
||||
ChartDrawer.DrawLine(vh, p3, p4, borderWid, serieLabel.borderColor);
|
||||
ChartDrawer.DrawLine(vh, p5, p6, borderWid, serieLabel.borderColor);
|
||||
ChartDrawer.DrawLine(vh, p7, p8, borderWid, serieLabel.borderColor);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -90,6 +90,7 @@ namespace XCharts
|
||||
{
|
||||
base.DrawChart(vh);
|
||||
if (!m_CheckMinMaxValue) return;
|
||||
m_IsPlayingStartAnimation = false;
|
||||
bool yCategory = m_YAxises[0].IsCategory() || m_YAxises[1].IsCategory();
|
||||
m_Series.GetStackSeries(ref m_StackSeries);
|
||||
int seriesCount = m_StackSeries.Count;
|
||||
@@ -787,7 +788,7 @@ namespace XCharts
|
||||
{
|
||||
m_Series.GetYMinMaxValue(m_DataZoom, axisIndex, false, out tempMinValue, out tempMaxValue);
|
||||
}
|
||||
axis.AdjustMinMaxValue(ref tempMinValue, ref tempMaxValue);
|
||||
axis.AdjustMinMaxValue(ref tempMinValue, ref tempMaxValue, true);
|
||||
if (tempMinValue != axis.runtimeMinValue || tempMaxValue != axis.runtimeMaxValue)
|
||||
{
|
||||
m_CheckMinMaxValue = true;
|
||||
@@ -814,10 +815,17 @@ namespace XCharts
|
||||
{
|
||||
float coordinateWidth = axis is XAxis ? this.coordinateWidth : coordinateHeight;
|
||||
var isPercentStack = m_Series.IsPercentStack(SerieType.Bar);
|
||||
axis.UpdateLabelText(coordinateWidth, m_DataZoom, isPercentStack);
|
||||
axis.UpdateLabelText(coordinateWidth, m_DataZoom, isPercentStack, 500);
|
||||
RefreshChart();
|
||||
}
|
||||
}
|
||||
if (axis.IsValueChanging(500) && !m_IsPlayingStartAnimation)
|
||||
{
|
||||
float coordinateWidth = axis is XAxis ? this.coordinateWidth : coordinateHeight;
|
||||
var isPercentStack = m_Series.IsPercentStack(SerieType.Bar);
|
||||
axis.UpdateLabelText(coordinateWidth, m_DataZoom, isPercentStack, 500);
|
||||
RefreshChart();
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void OnCoordinateChanged()
|
||||
@@ -1044,7 +1052,7 @@ namespace XCharts
|
||||
float minValue = 0;
|
||||
float maxValue = 0;
|
||||
m_Series.GetYMinMaxValue(null, 0, IsValue(), out minValue, out maxValue);
|
||||
axis.AdjustMinMaxValue(ref minValue, ref maxValue);
|
||||
axis.AdjustMinMaxValue(ref minValue, ref maxValue, true);
|
||||
|
||||
int rate = 1;
|
||||
var sampleDist = serie.sampleDist < 2 ? 2 : serie.sampleDist;
|
||||
@@ -1053,10 +1061,11 @@ namespace XCharts
|
||||
if (rate < 1) rate = 1;
|
||||
var totalAverage = serie.sampleAverage > 0 ? serie.sampleAverage :
|
||||
DataAverage(ref showData, serie.sampleType, serie.minShow, maxCount, rate);
|
||||
|
||||
var dataChanging = false;
|
||||
for (int i = 0; i < maxCount; i += rate)
|
||||
{
|
||||
float value = SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i);
|
||||
float value = SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i,
|
||||
serie.animation.GetUpdateAnimationDuration(), ref dataChanging);
|
||||
float pX = coordinateX + i * scaleWid;
|
||||
float dataHig = (axis.runtimeMaxValue - axis.runtimeMinValue) == 0 ? 0 :
|
||||
(value - axis.runtimeMinValue) / (axis.runtimeMaxValue - axis.runtimeMinValue) * hig;
|
||||
@@ -1074,6 +1083,10 @@ namespace XCharts
|
||||
}
|
||||
lp = np;
|
||||
}
|
||||
if (dataChanging)
|
||||
{
|
||||
RefreshChart();
|
||||
}
|
||||
}
|
||||
switch (m_DataZoom.rangeMode)
|
||||
{
|
||||
@@ -1373,7 +1386,7 @@ namespace XCharts
|
||||
if (j >= serie.dataPoints.Count) break;
|
||||
var serieData = serie.data[j];
|
||||
var pos = serie.dataPoints[j];
|
||||
|
||||
|
||||
serieData.SetGameObjectPosition(serieData.labelPosition);
|
||||
serieData.UpdateIcon();
|
||||
if (serie.show && serie.label.show && serieData.canShowLabel)
|
||||
|
||||
@@ -123,6 +123,7 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
RefreshChart();
|
||||
m_IsPlayingStartAnimation = true;
|
||||
}
|
||||
return currHig;
|
||||
}
|
||||
@@ -155,15 +156,16 @@ namespace XCharts
|
||||
}
|
||||
|
||||
var isPercentStack = m_Series.IsPercentStack(serie.stack, SerieType.Bar);
|
||||
float updateDuration = serie.animation.GetUpdateAnimationDuration();
|
||||
bool dataChanging = false;
|
||||
for (int i = serie.minShow; i < maxCount; i++)
|
||||
{
|
||||
if (i >= seriesHig.Count)
|
||||
{
|
||||
seriesHig.Add(0);
|
||||
}
|
||||
var serieData = showData[i];
|
||||
serieData.canShowLabel = true;
|
||||
float value = showData[i].data[1];
|
||||
float value = showData[i].GetCurrData(1, updateDuration);
|
||||
if (showData[i].IsDataChanged()) dataChanging = true;
|
||||
float pX = coordinateX + i * categoryWidth;
|
||||
float zeroY = coordinateY + yAxis.runtimeZeroYOffset;
|
||||
if (!xAxis.boundaryGap) pX -= categoryWidth / 2;
|
||||
@@ -213,6 +215,10 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
}
|
||||
if (dataChanging)
|
||||
{
|
||||
RefreshChart();
|
||||
}
|
||||
if (!m_Series.IsStack(serie.stack, SerieType.Bar))
|
||||
{
|
||||
m_BarLastOffset += barGapWidth;
|
||||
|
||||
@@ -183,6 +183,7 @@ namespace XCharts
|
||||
float duration = serie.animation.duration > 0 ? (float)serie.animation.duration / 1000 : 1;
|
||||
float speed = xCount / duration;
|
||||
serie.animation.CheckProgress(Time.deltaTime * speed);
|
||||
m_IsPlayingStartAnimation = true;
|
||||
RefreshChart();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,6 +111,8 @@ namespace XCharts
|
||||
var includeLastData = false;
|
||||
var totalAverage = serie.sampleAverage > 0 ? serie.sampleAverage :
|
||||
DataAverage(ref showData, serie.sampleType, serie.minShow, maxCount, rate);
|
||||
var dataChanging = false;
|
||||
var updateDuration = serie.animation.GetUpdateAnimationDuration();
|
||||
for (i = serie.minShow; i < maxCount; i += rate)
|
||||
{
|
||||
if (i == maxCount - 1) includeLastData = true;
|
||||
@@ -118,16 +120,23 @@ namespace XCharts
|
||||
{
|
||||
for (int j = 0; j < rate; j++) seriesHig.Add(0);
|
||||
}
|
||||
float yValue = SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i);
|
||||
seriesHig[i] += GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, seriesHig[i], ref np);
|
||||
float yValue = SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage,
|
||||
i, updateDuration, ref dataChanging);
|
||||
seriesHig[i] += GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, seriesHig[i], ref np,
|
||||
updateDuration);
|
||||
serie.dataPoints.Add(np);
|
||||
}
|
||||
if (dataChanging)
|
||||
{
|
||||
RefreshChart();
|
||||
}
|
||||
if (!includeLastData)
|
||||
{
|
||||
i = maxCount - 1;
|
||||
seriesHig.Add(0);
|
||||
float yValue = showData[i].data[1];
|
||||
seriesHig[i] += GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, seriesHig[i], ref np);
|
||||
float yValue = showData[i].GetCurrData(1, updateDuration);
|
||||
seriesHig[i] += GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, seriesHig[i], ref np,
|
||||
updateDuration);
|
||||
serie.dataPoints.Add(np);
|
||||
}
|
||||
if (serie.dataPoints.Count <= 0)
|
||||
@@ -144,8 +153,8 @@ namespace XCharts
|
||||
if (serie.minShow > 0 && serie.minShow < showData.Count)
|
||||
{
|
||||
i = serie.minShow - 1;
|
||||
float yValue = showData[i].data[1];
|
||||
GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, 0, ref firstLastPos);
|
||||
float yValue = showData[i].GetCurrData(1, updateDuration);
|
||||
GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, 0, ref firstLastPos, updateDuration);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -154,14 +163,13 @@ namespace XCharts
|
||||
if (serie.maxShow > 0 && serie.maxShow < showData.Count)
|
||||
{
|
||||
i = serie.maxShow;
|
||||
float yValue = showData[i].data[1];
|
||||
GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, 0, ref lastNextPos);
|
||||
float yValue = showData[i].GetCurrData(1, updateDuration);
|
||||
GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, 0, ref lastNextPos, updateDuration);
|
||||
}
|
||||
else
|
||||
{
|
||||
lastNextPos = serie.dataPoints[serie.dataPoints.Count - 1];
|
||||
}
|
||||
|
||||
for (i = 1; i < serie.dataPoints.Count; i++)
|
||||
{
|
||||
np = serie.dataPoints[i];
|
||||
@@ -216,6 +224,7 @@ namespace XCharts
|
||||
float symbolSpeed = serie.symbol.size / duration;
|
||||
serie.animation.CheckProgress(Time.deltaTime * speed);
|
||||
serie.animation.CheckSymbol(Time.deltaTime * symbolSpeed, serie.symbol.size);
|
||||
m_IsPlayingStartAnimation = true;
|
||||
RefreshChart();
|
||||
}
|
||||
}
|
||||
@@ -236,9 +245,13 @@ namespace XCharts
|
||||
}
|
||||
|
||||
private float SampleValue(ref List<SerieData> showData, SampleType sampleType, int rate,
|
||||
int minCount, int maxCount, float totalAverage, int index)
|
||||
int minCount, int maxCount, float totalAverage, int index, float updateDuration, ref bool dataChanging)
|
||||
{
|
||||
if (rate <= 1 || index == minCount) return showData[index].data[1];
|
||||
if (rate <= 1 || index == minCount)
|
||||
{
|
||||
if (showData[index].IsDataChanged()) dataChanging = true;
|
||||
return showData[index].GetCurrData(1, updateDuration);
|
||||
}
|
||||
switch (sampleType)
|
||||
{
|
||||
case SampleType.Sum:
|
||||
@@ -246,7 +259,8 @@ namespace XCharts
|
||||
float total = 0;
|
||||
for (int i = index; i > index - rate; i--)
|
||||
{
|
||||
total += showData[i].data[1];
|
||||
total += showData[i].GetCurrData(1, updateDuration);
|
||||
if (showData[i].IsDataChanged()) dataChanging = true;
|
||||
}
|
||||
if (sampleType == SampleType.Average) return total / rate;
|
||||
else return total;
|
||||
@@ -254,16 +268,18 @@ namespace XCharts
|
||||
float max = float.MinValue;
|
||||
for (int i = index; i > index - rate; i--)
|
||||
{
|
||||
var value = showData[i].data[1];
|
||||
var value = showData[i].GetCurrData(1, updateDuration);
|
||||
if (value > max) max = value;
|
||||
if (showData[i].IsDataChanged()) dataChanging = true;
|
||||
}
|
||||
return max;
|
||||
case SampleType.Min:
|
||||
float min = float.MaxValue;
|
||||
for (int i = index; i > index - rate; i--)
|
||||
{
|
||||
var value = showData[i].data[1];
|
||||
var value = showData[i].GetCurrData(1, updateDuration);
|
||||
if (value < min) min = value;
|
||||
if (showData[i].IsDataChanged()) dataChanging = true;
|
||||
}
|
||||
return min;
|
||||
case SampleType.Peak:
|
||||
@@ -272,40 +288,45 @@ namespace XCharts
|
||||
total = 0;
|
||||
for (int i = index; i > index - rate; i--)
|
||||
{
|
||||
var value = showData[i].data[1];
|
||||
var value = showData[i].GetCurrData(1, updateDuration);
|
||||
total += value;
|
||||
if (value < min) min = value;
|
||||
if (value > max) max = value;
|
||||
if (showData[i].IsDataChanged()) dataChanging = true;
|
||||
}
|
||||
var average = total / rate;
|
||||
if (average >= totalAverage) return max;
|
||||
else return min;
|
||||
|
||||
}
|
||||
return showData[index].data[1];
|
||||
if (showData[index].IsDataChanged()) dataChanging = true;
|
||||
return showData[index].GetCurrData(1, updateDuration);
|
||||
}
|
||||
|
||||
private float GetDataPoint(Axis xAxis, Axis yAxis, List<SerieData> showData, float yValue, float startX, int i,
|
||||
float scaleWid, float serieHig, ref Vector3 np)
|
||||
float scaleWid, float serieHig, ref Vector3 np, float duration)
|
||||
{
|
||||
float xDataHig, yDataHig;
|
||||
float xMinValue = xAxis.GetCurrMinValue(duration);
|
||||
float xMaxValue = xAxis.GetCurrMaxValue(duration);
|
||||
float yMinValue = yAxis.GetCurrMinValue(duration);
|
||||
float yMaxValue = yAxis.GetCurrMaxValue(duration);
|
||||
if (xAxis.IsValue())
|
||||
{
|
||||
float xValue = i > showData.Count - 1 ? 0 : showData[i].data[0];
|
||||
float pX = coordinateX + xAxis.axisLine.width;
|
||||
float pY = serieHig + coordinateY + xAxis.axisLine.width;
|
||||
if ((xAxis.runtimeMaxValue - xAxis.runtimeMinValue) <= 0) xDataHig = 0;
|
||||
else xDataHig = (xValue - xAxis.runtimeMinValue) / (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) * coordinateWidth;
|
||||
if ((yAxis.runtimeMaxValue - yAxis.runtimeMinValue) <= 0) yDataHig = 0;
|
||||
else yDataHig = (yValue - yAxis.runtimeMinValue) / (yAxis.runtimeMaxValue - yAxis.runtimeMinValue) * coordinateHeight;
|
||||
if ((xMaxValue - xMinValue) <= 0) xDataHig = 0;
|
||||
else xDataHig = (xValue - xMinValue) / (xMaxValue - xMinValue) * coordinateWidth;
|
||||
if ((yMaxValue - yMinValue) <= 0) yDataHig = 0;
|
||||
else yDataHig = (yValue - yMinValue) / (yMaxValue - yMinValue) * coordinateHeight;
|
||||
np = new Vector3(pX + xDataHig, pY + yDataHig);
|
||||
}
|
||||
else
|
||||
{
|
||||
float pX = startX + i * scaleWid;
|
||||
float pY = serieHig + coordinateY + yAxis.axisLine.width;
|
||||
if ((yAxis.runtimeMaxValue - yAxis.runtimeMinValue) <= 0) yDataHig = 0;
|
||||
else yDataHig = (yValue - yAxis.runtimeMinValue) / (yAxis.runtimeMaxValue - yAxis.runtimeMinValue) * coordinateHeight;
|
||||
if ((yMaxValue - yMinValue) <= 0) yDataHig = 0;
|
||||
else yDataHig = (yValue - yMinValue) / (yMaxValue - yMinValue) * coordinateHeight;
|
||||
np = new Vector3(pX, pY + yDataHig);
|
||||
}
|
||||
return yDataHig;
|
||||
@@ -442,6 +463,7 @@ namespace XCharts
|
||||
float symbolSpeed = serie.symbol.size / duration;
|
||||
serie.animation.CheckProgress(Time.deltaTime * speed);
|
||||
serie.animation.CheckSymbol(Time.deltaTime * symbolSpeed, serie.symbol.size);
|
||||
m_IsPlayingStartAnimation = true;
|
||||
RefreshChart();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,6 +66,7 @@ namespace XCharts
|
||||
float duration = serie.animation.duration > 0 ? (float)serie.animation.duration / 1000 : 1;
|
||||
float speed = 1 / duration;
|
||||
serie.animation.CheckProgress(Time.deltaTime * speed);
|
||||
m_IsPlayingStartAnimation = true;
|
||||
RefreshChart();
|
||||
}
|
||||
}
|
||||
|
||||
96
Assets/XCharts/Runtime/Internal/LabelObject.cs
Normal file
96
Assets/XCharts/Runtime/Internal/LabelObject.cs
Normal file
@@ -0,0 +1,96 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
public class LabelObject
|
||||
{
|
||||
private GameObject m_GameObject;
|
||||
private bool m_LabelAutoSize = true;
|
||||
private float m_LabelPaddingLeftRight = 3f;
|
||||
private float m_LabelPaddingTopBottom = 3f;
|
||||
private Text m_LabelText;
|
||||
private RectTransform m_LabelRect;
|
||||
private Image m_IconImage;
|
||||
private RectTransform m_IconRect;
|
||||
|
||||
public Image icon { get { return m_IconImage; } }
|
||||
public Text label { get { return m_LabelText; } }
|
||||
|
||||
public LabelObject()
|
||||
{
|
||||
}
|
||||
|
||||
public void SetLabel(GameObject labelObj, bool autoSize, float paddingLeftRight, float paddingTopBottom)
|
||||
{
|
||||
m_GameObject = labelObj;
|
||||
m_LabelAutoSize = autoSize;
|
||||
m_LabelPaddingLeftRight = paddingLeftRight;
|
||||
m_LabelPaddingTopBottom = paddingTopBottom;
|
||||
m_LabelText = labelObj.GetComponentInChildren<Text>();
|
||||
m_LabelRect = m_LabelText.GetComponent<RectTransform>();
|
||||
}
|
||||
|
||||
public void SetIcon(Image image)
|
||||
{
|
||||
m_IconImage = image;
|
||||
if (image != null)
|
||||
{
|
||||
m_IconRect = m_IconImage.GetComponent<RectTransform>();
|
||||
}
|
||||
}
|
||||
|
||||
public void SetIconSprite(Sprite sprite)
|
||||
{
|
||||
if (m_IconImage != null) m_IconImage.sprite = sprite;
|
||||
}
|
||||
|
||||
public void SetIconSize(float width, float height)
|
||||
{
|
||||
if (m_LabelRect != null) m_LabelRect.sizeDelta = new Vector3(width, height);
|
||||
}
|
||||
|
||||
public void SetIconActive(bool flag)
|
||||
{
|
||||
ChartHelper.SetActive(m_IconImage, flag);
|
||||
}
|
||||
|
||||
public void SetPosition(Vector3 position)
|
||||
{
|
||||
if (m_GameObject != null)
|
||||
{
|
||||
m_GameObject.transform.localPosition = position;
|
||||
}
|
||||
}
|
||||
|
||||
public void SetActive(bool flag)
|
||||
{
|
||||
ChartHelper.SetActive(m_GameObject, flag);
|
||||
}
|
||||
|
||||
public bool SetText(string text)
|
||||
{
|
||||
if (m_LabelText && !m_LabelText.text.Equals(text))
|
||||
{
|
||||
m_LabelText.text = text;
|
||||
if (m_LabelAutoSize)
|
||||
{
|
||||
var newSize = string.IsNullOrEmpty(text) ? Vector2.zero :
|
||||
new Vector2(m_LabelText.preferredWidth + m_LabelPaddingLeftRight * 2,
|
||||
m_LabelText.preferredHeight + m_LabelPaddingTopBottom * 2);
|
||||
var sizeChange = newSize.x != m_LabelRect.sizeDelta.x || newSize.y != m_LabelRect.sizeDelta.y;
|
||||
if (sizeChange) m_LabelRect.sizeDelta = newSize;
|
||||
return sizeChange;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/XCharts/Runtime/Internal/LabelObject.cs.meta
Normal file
11
Assets/XCharts/Runtime/Internal/LabelObject.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f4e7ef04b9a0e4526b49bf63967cfef4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -15,7 +15,7 @@ namespace XCharts
|
||||
{
|
||||
private static readonly Stack<GameObject> m_Stack = new Stack<GameObject>(200);
|
||||
|
||||
public static GameObject Get(string name, Transform parent, SerieLabel label, Font font, Color color, SerieData serieData)
|
||||
public static GameObject Get(string name, Transform parent, SerieLabel label, Font font, Color color, float iconWidth, float iconHeight)
|
||||
{
|
||||
GameObject element;
|
||||
if (m_Stack.Count == 0 || !Application.isPlaying)
|
||||
@@ -23,7 +23,7 @@ namespace XCharts
|
||||
element = ChartHelper.AddSerieLabel(name, parent, font,
|
||||
color, label.backgroundColor, label.fontSize, label.fontStyle, label.rotate,
|
||||
label.backgroundWidth, label.backgroundHeight);
|
||||
ChartHelper.AddIcon("Icon", element.transform, serieData.iconStyle.width, serieData.iconStyle.height);
|
||||
ChartHelper.AddIcon("Icon", element.transform, iconWidth, iconHeight);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -34,7 +34,7 @@ namespace XCharts
|
||||
var text = element.GetComponentInChildren<Text>();
|
||||
text.color = color;
|
||||
text.font = font;
|
||||
text.fontSize =label.fontSize;
|
||||
text.fontSize = label.fontSize;
|
||||
text.fontStyle = label.fontStyle;
|
||||
ChartHelper.SetActive(element, true);
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ namespace XCharts
|
||||
if (serie.pieClickOffset) isClickOffset = true;
|
||||
serie.runtimePieDataMax = serie.yMax;
|
||||
serie.runtimePieDataTotal = serie.yTotal;
|
||||
UpdatePieCenter(serie);
|
||||
serie.UpdateCenter(chartWidth, chartHeight);
|
||||
|
||||
float totalDegree = 360;
|
||||
float startDegree = 0;
|
||||
@@ -97,8 +97,8 @@ namespace XCharts
|
||||
serieData.runtimePieToAngle = startDegree + degree;
|
||||
|
||||
serieData.runtimePieOutsideRadius = serie.pieRoseType > 0 ?
|
||||
serie.runtimePieInsideRadius + (serie.runtimePieOutsideRadius - serie.runtimePieInsideRadius) * value / serie.runtimePieDataMax :
|
||||
serie.runtimePieOutsideRadius;
|
||||
serie.runtimeInsideRadius + (serie.runtimeOutsideRadius - serie.runtimeInsideRadius) * value / serie.runtimePieDataMax :
|
||||
serie.runtimeOutsideRadius;
|
||||
if (serieData.highlighted)
|
||||
{
|
||||
isDataHighlight = true;
|
||||
@@ -115,11 +115,11 @@ namespace XCharts
|
||||
float currRad = serieData.runtimePieHalfAngle * Mathf.Deg2Rad;
|
||||
float currSin = Mathf.Sin(currRad);
|
||||
float currCos = Mathf.Cos(currRad);
|
||||
var center = serie.runtimePieCenterPos;
|
||||
var center = serie.runtimeCenterPos;
|
||||
|
||||
serieData.runtimePieCurrAngle = serieData.runtimePieToAngle;
|
||||
serieData.runtiemPieOffsetCenter = center;
|
||||
serieData.runtimePieInsideRadius = serie.runtimePieInsideRadius;
|
||||
serieData.runtimePieInsideRadius = serie.runtimeInsideRadius;
|
||||
if (serie.animation.CheckDetailBreak(n, serieData.runtimePieToAngle))
|
||||
{
|
||||
isFinish = false;
|
||||
@@ -139,14 +139,19 @@ namespace XCharts
|
||||
|
||||
serieData.runtiemPieOffsetCenter = new Vector3(center.x + serieData.runtimePieOffsetRadius * currSin,
|
||||
center.y + serieData.runtimePieOffsetRadius * currCos);
|
||||
|
||||
var drawStartDegree = startDegree + serie.pieSpace;
|
||||
var drawEndDegree = serieData.runtimePieCurrAngle - serie.pieSpace;
|
||||
DrawArcShape(vh, serie, serieData, serieData.runtiemPieOffsetCenter, color, ref drawStartDegree, ref drawEndDegree);
|
||||
ChartDrawer.DrawDoughnut(vh, serieData.runtiemPieOffsetCenter, serieData.runtimePieInsideRadius, serieData.runtimePieOutsideRadius,
|
||||
color, m_ThemeInfo.backgroundColor, m_Settings.cicleSmoothness, startDegree, serieData.runtimePieCurrAngle);
|
||||
color, m_ThemeInfo.backgroundColor, m_Settings.cicleSmoothness, drawStartDegree, drawEndDegree);
|
||||
}
|
||||
else
|
||||
{
|
||||
var drawStartDegree = startDegree + serie.pieSpace;
|
||||
var drawEndDegree = serieData.runtimePieCurrAngle - serie.pieSpace;
|
||||
DrawArcShape(vh, serie, serieData, center, color, ref drawStartDegree, ref drawEndDegree);
|
||||
ChartDrawer.DrawDoughnut(vh, center, serieData.runtimePieInsideRadius, serieData.runtimePieOutsideRadius,
|
||||
color, m_ThemeInfo.backgroundColor, m_Settings.cicleSmoothness, startDegree, serieData.runtimePieCurrAngle);
|
||||
color, m_ThemeInfo.backgroundColor, m_Settings.cicleSmoothness, drawStartDegree, drawEndDegree);
|
||||
}
|
||||
serieData.canShowLabel = serieData.runtimePieCurrAngle >= serieData.runtimePieHalfAngle;
|
||||
isDrawPie = true;
|
||||
@@ -169,15 +174,38 @@ namespace XCharts
|
||||
raycastTarget = isClickOffset && isDataHighlight;
|
||||
}
|
||||
|
||||
private void DrawArcShape(VertexHelper vh, Serie serie, SerieData serieData, Vector3 centerPos,
|
||||
Color color, ref float drawStartDegree, ref float drawEndDegree)
|
||||
{
|
||||
if (serie.arcShaped)
|
||||
{
|
||||
var width = (serieData.runtimePieOutsideRadius - serieData.runtimePieInsideRadius) / 2;
|
||||
var radius = serieData.runtimePieInsideRadius + width;
|
||||
var diffDegree = Mathf.Asin(width / radius) * Mathf.Rad2Deg;
|
||||
drawStartDegree += diffDegree;
|
||||
drawEndDegree -= diffDegree;
|
||||
|
||||
var px = Mathf.Sin(drawStartDegree * Mathf.Deg2Rad) * radius;
|
||||
var py = Mathf.Cos(drawStartDegree * Mathf.Deg2Rad) * radius;
|
||||
var pos = new Vector3(px, py) + centerPos;
|
||||
ChartDrawer.DrawSector(vh, pos, width, color, drawStartDegree + 180, drawStartDegree + 360);
|
||||
px = Mathf.Sin(drawEndDegree * Mathf.Deg2Rad) * radius;
|
||||
py = Mathf.Cos(drawEndDegree * Mathf.Deg2Rad) * radius;
|
||||
pos = new Vector3(px, py) + centerPos;
|
||||
ChartDrawer.DrawSector(vh, pos, width, color, drawEndDegree, drawEndDegree + 180);
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawLabelLine(VertexHelper vh)
|
||||
{
|
||||
foreach (var serie in m_Series.list)
|
||||
{
|
||||
if (serie.type == SerieType.Pie && serie.label.show)
|
||||
if (serie.type == SerieType.Pie)
|
||||
{
|
||||
foreach (var serieData in serie.data)
|
||||
{
|
||||
if (serieData.canShowLabel)
|
||||
var serieLabel = serieData.GetSerieLabel(serie.label);
|
||||
if (serieLabel.show && serieData.canShowLabel)
|
||||
{
|
||||
int colorIndex = m_LegendRealShowName.IndexOf(serieData.name);
|
||||
Color color = m_ThemeInfo.GetColor(colorIndex);
|
||||
@@ -192,11 +220,12 @@ namespace XCharts
|
||||
{
|
||||
foreach (var serie in m_Series.list)
|
||||
{
|
||||
if (serie.type == SerieType.Pie && serie.label.show)
|
||||
if (serie.type == SerieType.Pie)
|
||||
{
|
||||
foreach (var serieData in serie.data)
|
||||
{
|
||||
if (serieData.canShowLabel)
|
||||
var serieLabel = serieData.GetSerieLabel(serie.label);
|
||||
if (serieLabel.show && serieData.canShowLabel)
|
||||
{
|
||||
UpdateLabelPostion(serie, serieData);
|
||||
DrawLabelBackground(vh, serie, serieData);
|
||||
@@ -208,88 +237,89 @@ namespace XCharts
|
||||
|
||||
private void DrawLabelLine(VertexHelper vh, Serie serie, SerieData serieData, Color color)
|
||||
{
|
||||
if (serie.label.show
|
||||
&& serie.label.position == SerieLabel.Position.Outside
|
||||
&& serie.label.line)
|
||||
var serieLabel = serieData.GetSerieLabel(serie.label);
|
||||
if (serieLabel.show
|
||||
&& serieLabel.position == SerieLabel.Position.Outside
|
||||
&& serieLabel.line)
|
||||
{
|
||||
var insideRadius = serieData.runtimePieInsideRadius;
|
||||
var outSideRadius = serieData.runtimePieOutsideRadius;
|
||||
var center = serie.runtimePieCenterPos;
|
||||
var center = serie.runtimeCenterPos;
|
||||
var currAngle = serieData.runtimePieHalfAngle;
|
||||
if (serie.label.lineColor != Color.clear) color = serie.label.lineColor;
|
||||
else if (serie.label.lineType == SerieLabel.LineType.HorizontalLine) color *= color;
|
||||
if (serieLabel.lineColor != Color.clear) color = serieLabel.lineColor;
|
||||
else if (serieLabel.lineType == SerieLabel.LineType.HorizontalLine) color *= color;
|
||||
float currSin = Mathf.Sin(currAngle * Mathf.Deg2Rad);
|
||||
float currCos = Mathf.Cos(currAngle * Mathf.Deg2Rad);
|
||||
var radius1 = serie.label.lineType == SerieLabel.LineType.HorizontalLine ?
|
||||
serie.runtimePieOutsideRadius : outSideRadius;
|
||||
var radius2 = serie.runtimePieOutsideRadius + serie.label.lineLength1;
|
||||
var radius1 = serieLabel.lineType == SerieLabel.LineType.HorizontalLine ?
|
||||
serie.runtimeOutsideRadius : outSideRadius;
|
||||
var radius2 = serie.runtimeOutsideRadius + serieLabel.lineLength1;
|
||||
var radius3 = insideRadius + (outSideRadius - insideRadius) / 2;
|
||||
if (radius1 < serie.runtimePieInsideRadius) radius1 = serie.runtimePieInsideRadius;
|
||||
if (radius1 < serie.runtimeInsideRadius) radius1 = serie.runtimeInsideRadius;
|
||||
radius1 -= 0.1f;
|
||||
var pos0 = new Vector3(center.x + radius3 * currSin, center.y + radius3 * currCos);
|
||||
var pos1 = new Vector3(center.x + radius1 * currSin, center.y + radius1 * currCos);
|
||||
var pos2 = new Vector3(center.x + radius2 * currSin, center.y + radius2 * currCos);
|
||||
float tx, ty;
|
||||
Vector3 pos3, pos4, pos6;
|
||||
var horizontalLineCircleRadius = serie.label.lineWidth * 4f;
|
||||
var horizontalLineCircleRadius = serieLabel.lineWidth * 4f;
|
||||
var lineCircleDiff = horizontalLineCircleRadius - 0.3f;
|
||||
if (currAngle < 90)
|
||||
{
|
||||
ty = serie.label.lineWidth * Mathf.Cos((90 - currAngle) * Mathf.Deg2Rad);
|
||||
tx = serie.label.lineWidth * Mathf.Sin((90 - currAngle) * Mathf.Deg2Rad);
|
||||
pos3 = new Vector3(pos2.x - tx, pos2.y + ty - serie.label.lineWidth);
|
||||
ty = serieLabel.lineWidth * Mathf.Cos((90 - currAngle) * Mathf.Deg2Rad);
|
||||
tx = serieLabel.lineWidth * Mathf.Sin((90 - currAngle) * Mathf.Deg2Rad);
|
||||
pos3 = new Vector3(pos2.x - tx, pos2.y + ty - serieLabel.lineWidth);
|
||||
var r4 = Mathf.Sqrt(radius1 * radius1 - Mathf.Pow(currCos * radius3, 2)) - currSin * radius3;
|
||||
r4 += serie.label.lineLength1 - lineCircleDiff;
|
||||
r4 += serieLabel.lineLength1 - lineCircleDiff;
|
||||
pos6 = pos0 + Vector3.right * lineCircleDiff;
|
||||
pos4 = pos6 + Vector3.right * r4;
|
||||
}
|
||||
else if (currAngle < 180)
|
||||
{
|
||||
ty = serie.label.lineWidth * Mathf.Sin((180 - currAngle) * Mathf.Deg2Rad);
|
||||
tx = serie.label.lineWidth * Mathf.Cos((180 - currAngle) * Mathf.Deg2Rad);
|
||||
pos3 = new Vector3(pos2.x - tx, pos2.y - ty + serie.label.lineWidth);
|
||||
ty = serieLabel.lineWidth * Mathf.Sin((180 - currAngle) * Mathf.Deg2Rad);
|
||||
tx = serieLabel.lineWidth * Mathf.Cos((180 - currAngle) * Mathf.Deg2Rad);
|
||||
pos3 = new Vector3(pos2.x - tx, pos2.y - ty + serieLabel.lineWidth);
|
||||
var r4 = Mathf.Sqrt(radius1 * radius1 - Mathf.Pow(currCos * radius3, 2)) - currSin * radius3;
|
||||
r4 += serie.label.lineLength1 - lineCircleDiff;
|
||||
r4 += serieLabel.lineLength1 - lineCircleDiff;
|
||||
pos6 = pos0 + Vector3.right * lineCircleDiff;
|
||||
pos4 = pos6 + Vector3.right * r4;
|
||||
}
|
||||
else if (currAngle < 270)
|
||||
{
|
||||
ty = serie.label.lineWidth * Mathf.Sin((180 + currAngle) * Mathf.Deg2Rad);
|
||||
tx = serie.label.lineWidth * Mathf.Cos((180 + currAngle) * Mathf.Deg2Rad);
|
||||
ty = serieLabel.lineWidth * Mathf.Sin((180 + currAngle) * Mathf.Deg2Rad);
|
||||
tx = serieLabel.lineWidth * Mathf.Cos((180 + currAngle) * Mathf.Deg2Rad);
|
||||
var currSin1 = Mathf.Sin((360 - currAngle) * Mathf.Deg2Rad);
|
||||
var currCos1 = Mathf.Cos((360 - currAngle) * Mathf.Deg2Rad);
|
||||
pos3 = new Vector3(pos2.x + tx, pos2.y - ty + serie.label.lineWidth);
|
||||
pos3 = new Vector3(pos2.x + tx, pos2.y - ty + serieLabel.lineWidth);
|
||||
var r4 = Mathf.Sqrt(radius1 * radius1 - Mathf.Pow(currCos1 * radius3, 2)) - currSin1 * radius3;
|
||||
r4 += serie.label.lineLength1 - lineCircleDiff;
|
||||
r4 += serieLabel.lineLength1 - lineCircleDiff;
|
||||
pos6 = pos0 + Vector3.left * lineCircleDiff;
|
||||
pos4 = pos6 + Vector3.left * r4;
|
||||
}
|
||||
else
|
||||
{
|
||||
ty = serie.label.lineWidth * Mathf.Cos((90 + currAngle) * Mathf.Deg2Rad);
|
||||
tx = serie.label.lineWidth * Mathf.Sin((90 + currAngle) * Mathf.Deg2Rad);
|
||||
pos3 = new Vector3(pos2.x + tx, pos2.y + ty - serie.label.lineWidth);
|
||||
ty = serieLabel.lineWidth * Mathf.Cos((90 + currAngle) * Mathf.Deg2Rad);
|
||||
tx = serieLabel.lineWidth * Mathf.Sin((90 + currAngle) * Mathf.Deg2Rad);
|
||||
pos3 = new Vector3(pos2.x + tx, pos2.y + ty - serieLabel.lineWidth);
|
||||
var currSin1 = Mathf.Sin((360 - currAngle) * Mathf.Deg2Rad);
|
||||
var currCos1 = Mathf.Cos((360 - currAngle) * Mathf.Deg2Rad);
|
||||
var r4 = Mathf.Sqrt(radius1 * radius1 - Mathf.Pow(currCos1 * radius3, 2)) - currSin1 * radius3;
|
||||
r4 += serie.label.lineLength1 - lineCircleDiff;
|
||||
r4 += serieLabel.lineLength1 - lineCircleDiff;
|
||||
pos6 = pos0 + Vector3.left * lineCircleDiff;
|
||||
pos4 = pos6 + Vector3.left * r4;
|
||||
}
|
||||
var pos5 = new Vector3(currAngle > 180 ? pos3.x - serie.label.lineLength2 : pos3.x + serie.label.lineLength2, pos3.y);
|
||||
switch (serie.label.lineType)
|
||||
var pos5 = new Vector3(currAngle > 180 ? pos3.x - serieLabel.lineLength2 : pos3.x + serieLabel.lineLength2, pos3.y);
|
||||
switch (serieLabel.lineType)
|
||||
{
|
||||
case SerieLabel.LineType.BrokenLine:
|
||||
ChartDrawer.DrawLine(vh, pos1, pos2, serie.label.lineWidth, color);
|
||||
ChartDrawer.DrawLine(vh, pos3, pos5, serie.label.lineWidth, color);
|
||||
ChartDrawer.DrawLine(vh, pos1, pos2, serieLabel.lineWidth, color);
|
||||
ChartDrawer.DrawLine(vh, pos3, pos5, serieLabel.lineWidth, color);
|
||||
break;
|
||||
case SerieLabel.LineType.Curves:
|
||||
ChartDrawer.DrawCurves(vh, pos1, pos5, pos1, pos2, serie.label.lineWidth, color, m_Settings.lineSmoothness);
|
||||
ChartDrawer.DrawCurves(vh, pos1, pos5, pos1, pos2, serieLabel.lineWidth, color, m_Settings.lineSmoothness);
|
||||
break;
|
||||
case SerieLabel.LineType.HorizontalLine:
|
||||
ChartDrawer.DrawCricle(vh, pos0, horizontalLineCircleRadius, color);
|
||||
ChartDrawer.DrawLine(vh, pos6, pos4, serie.label.lineWidth, color);
|
||||
ChartDrawer.DrawLine(vh, pos6, pos4, serieLabel.lineWidth, color);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -335,13 +365,14 @@ namespace XCharts
|
||||
if (serieData.labelText == null) return;
|
||||
var currAngle = serieData.runtimePieHalfAngle;
|
||||
var isHighlight = (serieData.highlighted && serie.emphasis.label.show);
|
||||
var showLabel = ((serie.label.show || isHighlight) && serieData.canShowLabel);
|
||||
var serieLabel = serieData.GetSerieLabel(serie.label);
|
||||
var showLabel = ((serieLabel.show || isHighlight) && serieData.canShowLabel);
|
||||
if (showLabel || serieData.iconStyle.show)
|
||||
{
|
||||
serieData.SetLabelActive(showLabel);
|
||||
float rotate = 0;
|
||||
bool isInsidePosition = serie.label.position == SerieLabel.Position.Inside;
|
||||
if (serie.label.rotate > 0 && isInsidePosition)
|
||||
bool isInsidePosition = serieLabel.position == SerieLabel.Position.Inside;
|
||||
if (serieLabel.rotate > 0 && isInsidePosition)
|
||||
{
|
||||
if (currAngle > 180) rotate += 270 - currAngle;
|
||||
else rotate += -(currAngle - 90);
|
||||
@@ -351,16 +382,16 @@ namespace XCharts
|
||||
{
|
||||
if (serie.emphasis.label.color != Color.clear) color = serie.emphasis.label.color;
|
||||
}
|
||||
else if (serie.label.color != Color.clear)
|
||||
else if (serieLabel.color != Color.clear)
|
||||
{
|
||||
color = serie.label.color;
|
||||
color = serieLabel.color;
|
||||
}
|
||||
else
|
||||
{
|
||||
color = isInsidePosition ? Color.white : serieColor;
|
||||
}
|
||||
var fontSize = isHighlight ? serie.emphasis.label.fontSize : serie.label.fontSize;
|
||||
var fontStyle = isHighlight ? serie.emphasis.label.fontStyle : serie.label.fontStyle;
|
||||
var fontSize = isHighlight ? serie.emphasis.label.fontSize : serieLabel.fontSize;
|
||||
var fontStyle = isHighlight ? serie.emphasis.label.fontStyle : serieLabel.fontStyle;
|
||||
|
||||
serieData.labelText.color = color;
|
||||
serieData.labelText.fontSize = fontSize;
|
||||
@@ -369,15 +400,20 @@ namespace XCharts
|
||||
serieData.labelRect.transform.localEulerAngles = new Vector3(0, 0, rotate);
|
||||
|
||||
UpdateLabelPostion(serie, serieData);
|
||||
if (!string.IsNullOrEmpty(serie.label.formatter))
|
||||
if (!string.IsNullOrEmpty(serieLabel.formatter))
|
||||
{
|
||||
var value = serieData.data[1];
|
||||
var total = serie.yTotal;
|
||||
var content = serie.label.GetFormatterContent(serie.name, serieData.name, value, total);
|
||||
var content = serieLabel.GetFormatterContent(serie.name, serieData.name, value, total);
|
||||
if (serieData.SetLabelText(content)) RefreshChart();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (serieData.SetLabelText(serieData.name)) RefreshChart();
|
||||
}
|
||||
serieData.SetGameObjectPosition(serieData.labelPosition);
|
||||
if (showLabel) serieData.SetLabelPosition(serie.label.offset);
|
||||
if (showLabel) serieData.SetLabelPosition(serieLabel.offset);
|
||||
else serieData.SetLabelActive(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -394,48 +430,49 @@ namespace XCharts
|
||||
var offsetRadius = serieData.runtimePieOffsetRadius;
|
||||
var insideRadius = serieData.runtimePieInsideRadius;
|
||||
var outsideRadius = serieData.runtimePieOutsideRadius;
|
||||
switch (serie.label.position)
|
||||
var serieLabel = serieData.GetSerieLabel(serie.label);
|
||||
switch (serieLabel.position)
|
||||
{
|
||||
case SerieLabel.Position.Center:
|
||||
serieData.labelPosition = serie.runtimePieCenterPos;
|
||||
serieData.labelPosition = serie.runtimeCenterPos;
|
||||
break;
|
||||
case SerieLabel.Position.Inside:
|
||||
var labelRadius = offsetRadius + insideRadius + (outsideRadius - insideRadius) / 2;
|
||||
var labelCenter = new Vector2(serie.runtimePieCenterPos.x + labelRadius * Mathf.Sin(currRad),
|
||||
serie.runtimePieCenterPos.y + labelRadius * Mathf.Cos(currRad));
|
||||
var labelCenter = new Vector2(serie.runtimeCenterPos.x + labelRadius * Mathf.Sin(currRad),
|
||||
serie.runtimeCenterPos.y + labelRadius * Mathf.Cos(currRad));
|
||||
serieData.labelPosition = labelCenter;
|
||||
break;
|
||||
case SerieLabel.Position.Outside:
|
||||
if (serie.label.lineType == SerieLabel.LineType.HorizontalLine)
|
||||
if (serieLabel.lineType == SerieLabel.LineType.HorizontalLine)
|
||||
{
|
||||
var radius1 = serie.runtimePieOutsideRadius;
|
||||
var radius1 = serie.runtimeOutsideRadius;
|
||||
var radius3 = insideRadius + (outsideRadius - insideRadius) / 2;
|
||||
var currSin = Mathf.Sin(currRad);
|
||||
var currCos = Mathf.Cos(currRad);
|
||||
var pos0 = new Vector3(serie.runtimePieCenterPos.x + radius3 * currSin, serie.runtimePieCenterPos.y + radius3 * currCos);
|
||||
var pos0 = new Vector3(serie.runtimeCenterPos.x + radius3 * currSin, serie.runtimeCenterPos.y + radius3 * currCos);
|
||||
if (currAngle > 180)
|
||||
{
|
||||
currSin = Mathf.Sin((360 - currAngle) * Mathf.Deg2Rad);
|
||||
currCos = Mathf.Cos((360 - currAngle) * Mathf.Deg2Rad);
|
||||
}
|
||||
var r4 = Mathf.Sqrt(radius1 * radius1 - Mathf.Pow(currCos * radius3, 2)) - currSin * radius3;
|
||||
r4 += serie.label.lineLength1 + serie.label.lineWidth * 4;
|
||||
r4 += serieLabel.lineLength1 + serieLabel.lineWidth * 4;
|
||||
r4 += serieData.labelText.preferredWidth / 2;
|
||||
serieData.labelPosition = pos0 + (currAngle > 180 ? Vector3.left : Vector3.right) * r4;
|
||||
}
|
||||
else
|
||||
{
|
||||
labelRadius = serie.runtimePieOutsideRadius + serie.label.lineLength1;
|
||||
labelCenter = new Vector2(serie.runtimePieCenterPos.x + labelRadius * Mathf.Sin(currRad),
|
||||
serie.runtimePieCenterPos.y + labelRadius * Mathf.Cos(currRad));
|
||||
labelRadius = serie.runtimeOutsideRadius + serieLabel.lineLength1;
|
||||
labelCenter = new Vector2(serie.runtimeCenterPos.x + labelRadius * Mathf.Sin(currRad),
|
||||
serie.runtimeCenterPos.y + labelRadius * Mathf.Cos(currRad));
|
||||
float labelWidth = serieData.labelText.preferredWidth;
|
||||
if (currAngle > 180)
|
||||
{
|
||||
serieData.labelPosition = new Vector2(labelCenter.x - serie.label.lineLength2 - 5 - labelWidth / 2, labelCenter.y);
|
||||
serieData.labelPosition = new Vector2(labelCenter.x - serieLabel.lineLength2 - 5 - labelWidth / 2, labelCenter.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
serieData.labelPosition = new Vector2(labelCenter.x + serie.label.lineLength2 + 5 + labelWidth / 2, labelCenter.y);
|
||||
serieData.labelPosition = new Vector2(labelCenter.x + serieLabel.lineLength2 + 5 + labelWidth / 2, labelCenter.y);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -464,17 +501,6 @@ namespace XCharts
|
||||
RefreshChart();
|
||||
}
|
||||
|
||||
private void UpdatePieCenter(Serie serie)
|
||||
{
|
||||
if (serie.pieCenter.Length < 2) return;
|
||||
var centerX = serie.pieCenter[0] <= 1 ? chartWidth * serie.pieCenter[0] : serie.pieCenter[0];
|
||||
var centerY = serie.pieCenter[1] <= 1 ? chartHeight * serie.pieCenter[1] : serie.pieCenter[1];
|
||||
serie.runtimePieCenterPos = new Vector2(centerX, centerY);
|
||||
var minWidth = Mathf.Min(chartWidth, chartHeight);
|
||||
serie.runtimePieInsideRadius = serie.pieRadius[0] <= 1 ? minWidth * serie.pieRadius[0] : serie.pieRadius[0];
|
||||
serie.runtimePieOutsideRadius = serie.pieRadius[1] <= 1 ? minWidth * serie.pieRadius[1] : serie.pieRadius[1];
|
||||
}
|
||||
|
||||
protected override void CheckTootipArea(Vector2 local)
|
||||
{
|
||||
if (m_IsEnterLegendButtom) return;
|
||||
@@ -510,9 +536,9 @@ namespace XCharts
|
||||
private int GetPosPieIndex(Serie serie, Vector2 local)
|
||||
{
|
||||
if (serie.type != SerieType.Pie) return -1;
|
||||
var dist = Vector2.Distance(local, serie.runtimePieCenterPos);
|
||||
if (dist < serie.runtimePieInsideRadius || dist > serie.runtimePieOutsideRadius) return -1;
|
||||
Vector2 dir = local - new Vector2(serie.runtimePieCenterPos.x, serie.runtimePieCenterPos.y);
|
||||
var dist = Vector2.Distance(local, serie.runtimeCenterPos);
|
||||
if (dist < serie.runtimeInsideRadius || dist > serie.runtimeOutsideRadius) return -1;
|
||||
Vector2 dir = local - new Vector2(serie.runtimeCenterPos.x, serie.runtimeCenterPos.y);
|
||||
float angle = VectorAngle(Vector2.up, dir);
|
||||
for (int i = 0; i < serie.data.Count; i++)
|
||||
{
|
||||
|
||||
@@ -41,6 +41,18 @@ namespace XCharts
|
||||
SetActive(gameObject.transform, active);
|
||||
}
|
||||
|
||||
public static void SetActive(Image image, bool active)
|
||||
{
|
||||
if (image == null) return;
|
||||
SetActive(image.gameObject, active);
|
||||
}
|
||||
|
||||
public static void SetActive(Text text, bool active)
|
||||
{
|
||||
if (text == null) return;
|
||||
SetActive(text.gameObject, active);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 通过设置scale实现是否显示,优化性能,减少GC
|
||||
/// </summary>
|
||||
@@ -357,6 +369,16 @@ namespace XCharts
|
||||
color1.r == color2.r;
|
||||
}
|
||||
|
||||
public static bool IsValueEqualsVector2(Vector2 v1, Vector2 v2)
|
||||
{
|
||||
return v1.x == v2.x && v1.y == v2.y;
|
||||
}
|
||||
|
||||
public static bool IsValueEqualsVector3(Vector3 v1, Vector3 v2)
|
||||
{
|
||||
return v1.x == v2.x && v1.y == v2.y && v1.z == v2.z;
|
||||
}
|
||||
|
||||
public static bool IsValueEqualsList<T>(List<T> list1, List<T> list2)
|
||||
{
|
||||
if (list1 == null || list2 == null) return false;
|
||||
@@ -586,5 +608,13 @@ namespace XCharts
|
||||
Vector3 resultVec3 = center + point;
|
||||
return resultVec3;
|
||||
}
|
||||
|
||||
public static Vector3 GetPosition(Vector3 center, float angle, float radius)
|
||||
{
|
||||
var rad = angle * Mathf.Deg2Rad;
|
||||
var px = Mathf.Sin(rad) * radius;
|
||||
var py = Mathf.Cos(rad) * radius;
|
||||
return center + new Vector3(px, py);
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user