mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-18 22:40:10 +00:00
Merge branch 'master' of ssh://github.com/monitor1394/unity-ugui-XCharts
This commit is contained in:
16
CHANGELOG.md
16
CHANGELOG.md
@@ -1,6 +1,22 @@
|
||||
|
||||
# 更新日志
|
||||
|
||||
* (2019.11.12) 修复`2018.3`以下版本打开项目报错的问题
|
||||
* (2019.11.12) 增加`IconStyle`子组件,优化`SerieData`的图标配置
|
||||
* (2019.11.11) 修复`Serie`的图标显示在上层遮挡`Label`的问题
|
||||
* (2019.11.11) 修复饼图当数据过小时视觉引导线会穿透的的问题
|
||||
* (2019.11.09) 修复饼图添加数据时`Label`异常的问题
|
||||
* (2019.11.09) 优化结构,分离为`XCharts`和`XChartsDemo`两部分
|
||||
* (2019.11.05) 发布`v1.0.4`版本
|
||||
* (2019.11.05) 增加`Radar`雷达组件文本样式参数配置支持
|
||||
* (2019.11.04) 修复`Unity2018.3`以下版本代码不兼容的问题
|
||||
* (2019.11.04) 优化`SerieLabel`过多时引起的性能问题
|
||||
* (2019.11.03) 发布`v1.0.3`版本
|
||||
* (2019.11.03) 增加`Editor`快捷添加图表:`Hierarchy`试图下右键`XCharts->LineChart`
|
||||
* (2019.11.02) 优化非配置参数变量命名和访问权限,简化`API`
|
||||
* (2019.10.31) 发布`v1.0.2`版本
|
||||
* (2019.10.31) 修复`prefab`预设制作报错的问题
|
||||
* (2019.10.31) 增加访问主题组件API:`BaseChart.themeInfo`
|
||||
* (2019.10.26) 发布`v1.0.1`版本
|
||||
* (2019.10.26) 修复版本检查功能在非运行时异常的问题
|
||||
* (2019.10.26) 增加科学计数法显示数值的支持(查阅`forceENotation`参数)
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5e6b0fb015bc6524d8bab146b6f2ba3a
|
||||
folderAsset: yes
|
||||
timeCreated: 1553641866
|
||||
licenseType: Free
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 05b7d15b7a92f4c1eb56dbf47522bf6c
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,45 +0,0 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
[CustomPropertyDrawer(typeof(ChartModule), true)]
|
||||
public class ChartModuleDrawer : PropertyDrawer
|
||||
{
|
||||
public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
Rect drawRect = pos;
|
||||
drawRect.height = EditorGUIUtility.singleLineHeight;
|
||||
var lastX = drawRect.x;
|
||||
var lastWid = drawRect.width;
|
||||
SerializedProperty m_Name = prop.FindPropertyRelative("m_Name");
|
||||
SerializedProperty m_Title = prop.FindPropertyRelative("m_Title");
|
||||
SerializedProperty m_Selected = prop.FindPropertyRelative("m_Selected");
|
||||
SerializedProperty m_Panel = prop.FindPropertyRelative("m_Panel");
|
||||
var fieldWid = EditorGUIUtility.currentViewWidth - 30 - 5 - 50 - 90;
|
||||
drawRect.width = 15;
|
||||
EditorGUI.PropertyField(drawRect,m_Selected,GUIContent.none);
|
||||
drawRect.x += 15;
|
||||
drawRect.width = 50;
|
||||
EditorGUI.PropertyField(drawRect,m_Name,GUIContent.none);
|
||||
drawRect.x += 52;
|
||||
drawRect.width = fieldWid;
|
||||
EditorGUI.PropertyField(drawRect,m_Title,GUIContent.none);
|
||||
drawRect.x += fieldWid + 2;
|
||||
drawRect.width = 90;
|
||||
EditorGUI.PropertyField(drawRect,m_Panel,GUIContent.none);
|
||||
}
|
||||
|
||||
public override float GetPropertyHeight(SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
return 1 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using UnityEditor;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
/// <summary>
|
||||
/// Editor class used to edit UI BaseChart.
|
||||
/// </summary>
|
||||
|
||||
[CustomEditor(typeof(Demo), false)]
|
||||
public class DemoEditor : Editor
|
||||
{
|
||||
protected Demo m_Target;
|
||||
protected SerializedProperty m_Script;
|
||||
protected SerializedProperty m_ButtonNormalColor;
|
||||
protected SerializedProperty m_ButtonSelectedColor;
|
||||
protected SerializedProperty m_ButtonHighlightColor;
|
||||
protected SerializedProperty m_ChartModule;
|
||||
protected virtual void OnEnable()
|
||||
{
|
||||
m_Target = (Demo)target;
|
||||
m_Script = serializedObject.FindProperty("m_Script");
|
||||
m_ButtonNormalColor = serializedObject.FindProperty("m_ButtonNormalColor");
|
||||
m_ButtonSelectedColor = serializedObject.FindProperty("m_ButtonSelectedColor");
|
||||
m_ButtonHighlightColor = serializedObject.FindProperty("m_ButtonHighlightColor");
|
||||
m_ChartModule = serializedObject.FindProperty("m_ChartModule");
|
||||
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
if (m_Target == null && target == null)
|
||||
{
|
||||
base.OnInspectorGUI();
|
||||
return;
|
||||
}
|
||||
serializedObject.Update();
|
||||
EditorGUILayout.PropertyField(m_ButtonNormalColor);
|
||||
EditorGUILayout.PropertyField(m_ButtonSelectedColor);
|
||||
EditorGUILayout.PropertyField(m_ButtonHighlightColor);
|
||||
|
||||
var size = m_ChartModule.arraySize;
|
||||
size = EditorGUILayout.IntField("Chart Module Size", size);
|
||||
if (size != m_ChartModule.arraySize)
|
||||
{
|
||||
while (size > m_ChartModule.arraySize)
|
||||
m_ChartModule.InsertArrayElementAtIndex(m_ChartModule.arraySize);
|
||||
while (size < m_ChartModule.arraySize)
|
||||
m_ChartModule.DeleteArrayElementAtIndex(m_ChartModule.arraySize - 1);
|
||||
}
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
EditorGUILayout.PropertyField(m_ChartModule.GetArrayElementAtIndex(i));
|
||||
}
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"name": "XCharts.Editor.Demo",
|
||||
"references": [
|
||||
"XCharts.Demo.Runtime",
|
||||
"XCharts.Runtime"
|
||||
],
|
||||
"optionalUnityReferences": [],
|
||||
"includePlatforms": [
|
||||
"Editor"
|
||||
],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": []
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2d3606aaaf73f468984f4615b496f408
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,197 +0,0 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
[System.Serializable]
|
||||
public class ChartModule
|
||||
{
|
||||
[SerializeField] private string m_Name;
|
||||
[SerializeField] private string m_Title;
|
||||
[SerializeField] private bool m_Selected;
|
||||
[SerializeField] private GameObject m_Panel;
|
||||
|
||||
public string name { get { return m_Name; } set { m_Name = value; } }
|
||||
public string title { get { return m_Title; } set { m_Title = value; } }
|
||||
public bool select { get { return m_Selected; } set { m_Selected = value; } }
|
||||
public GameObject panel { get { return m_Panel; } set { m_Panel = value; } }
|
||||
public Button button { get; set; }
|
||||
}
|
||||
|
||||
[DisallowMultipleComponent]
|
||||
[ExecuteInEditMode]
|
||||
public class Demo : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private Color m_ButtonNormalColor;
|
||||
[SerializeField] private Color m_ButtonSelectedColor;
|
||||
[SerializeField] private Color m_ButtonHighlightColor;
|
||||
[SerializeField] private List<ChartModule> m_ChartModule;
|
||||
|
||||
private GameObject m_BtnClone;
|
||||
private Theme m_SelectedTheme;
|
||||
private int m_LastSelectedModuleIndex;
|
||||
|
||||
private Button m_DefaultThemeButton;
|
||||
private Button m_LightThemeButton;
|
||||
private Button m_DarkThemeButton;
|
||||
|
||||
private Text m_Title;
|
||||
|
||||
private ScrollRect m_ScrollRect;
|
||||
private Mask m_Mark;
|
||||
|
||||
void Awake()
|
||||
{
|
||||
m_SelectedTheme = Theme.Default;
|
||||
|
||||
m_ButtonNormalColor = ChartHelper.GetColor("#293C55FF");
|
||||
m_ButtonSelectedColor = ChartHelper.GetColor("#e43c59ff");
|
||||
m_ButtonHighlightColor = ChartHelper.GetColor("#0E151FFF");
|
||||
|
||||
m_ScrollRect = transform.Find("chart_detail").GetComponent<ScrollRect>();
|
||||
m_Mark = transform.Find("chart_detail/Viewport").GetComponent<Mask>();
|
||||
m_Mark.enabled = true;
|
||||
m_Title = transform.Find("chart_title/Text").GetComponent<Text>();
|
||||
|
||||
InitThemeButton();
|
||||
InitModuleButton();
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
if (m_ChartModule.Count <= 0) return;
|
||||
int selectedModuleIndex = -1;
|
||||
for (int i = 0; i < m_ChartModule.Count; i++)
|
||||
{
|
||||
if (selectedModuleIndex >= 0 && i > selectedModuleIndex)
|
||||
{
|
||||
m_ChartModule[i].select = false;
|
||||
}
|
||||
else if (m_ChartModule[i].select)
|
||||
{
|
||||
selectedModuleIndex = i;
|
||||
}
|
||||
}
|
||||
if (selectedModuleIndex < 0) selectedModuleIndex = 0;
|
||||
if (selectedModuleIndex != m_LastSelectedModuleIndex)
|
||||
{
|
||||
InitModuleButton();
|
||||
}
|
||||
if (!Application.isPlaying) m_Mark.enabled = false;
|
||||
#endif
|
||||
}
|
||||
|
||||
void InitModuleButton()
|
||||
{
|
||||
var btnPanel = transform.Find("chart_list");
|
||||
m_BtnClone = transform.Find("btn_clone").gameObject;
|
||||
m_BtnClone.SetActive(false);
|
||||
ChartHelper.DestoryAllChilds(btnPanel);
|
||||
foreach (var module in m_ChartModule)
|
||||
{
|
||||
var btnName = "btn_" + module.name;
|
||||
GameObject btn;
|
||||
if (btnPanel.Find(btnName))
|
||||
{
|
||||
btn = btnPanel.Find(btnName).gameObject;
|
||||
btn.SetActive(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
btn = GameObject.Instantiate(m_BtnClone);
|
||||
btn.SetActive(true);
|
||||
btn.name = btnName;
|
||||
btn.transform.SetParent(btnPanel);
|
||||
btn.transform.localPosition = Vector3.zero;
|
||||
}
|
||||
btn.transform.localScale = Vector3.one;
|
||||
module.button = btn.GetComponent<Button>();
|
||||
module.button.GetComponentInChildren<Text>().text = module.name;
|
||||
|
||||
ChartHelper.AddEventListener(btn.gameObject, EventTriggerType.PointerDown, (data) =>
|
||||
{
|
||||
ClickModule(module);
|
||||
});
|
||||
}
|
||||
|
||||
for (int i = 0; i < m_ChartModule.Count; i++)
|
||||
{
|
||||
var module = m_ChartModule[i];
|
||||
if (module.select)
|
||||
{
|
||||
ClickModule(module);
|
||||
m_LastSelectedModuleIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ClickModule(ChartModule selectedModule)
|
||||
{
|
||||
foreach (var module in m_ChartModule)
|
||||
{
|
||||
if (selectedModule != module)
|
||||
{
|
||||
var block = module.button.colors;
|
||||
block.highlightedColor = m_ButtonHighlightColor;
|
||||
block.normalColor = m_ButtonNormalColor;
|
||||
module.button.colors = block;
|
||||
module.panel.SetActive(false);
|
||||
module.select = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
var block = module.button.colors;
|
||||
block.highlightedColor = m_ButtonSelectedColor;
|
||||
block.normalColor = m_ButtonSelectedColor;
|
||||
module.button.colors = block;
|
||||
module.panel.SetActive(true);
|
||||
module.select = true;
|
||||
}
|
||||
}
|
||||
m_ScrollRect.content = selectedModule.panel.GetComponent<RectTransform>();
|
||||
m_Title.text = string.IsNullOrEmpty(selectedModule.title) ?
|
||||
selectedModule.name : selectedModule.title;
|
||||
}
|
||||
|
||||
void InitThemeButton()
|
||||
{
|
||||
m_DefaultThemeButton = transform.Find("chart_theme/btn_default").GetComponent<Button>();
|
||||
m_LightThemeButton = transform.Find("chart_theme/btn_light").GetComponent<Button>();
|
||||
m_DarkThemeButton = transform.Find("chart_theme/btn_dark").GetComponent<Button>();
|
||||
|
||||
m_DefaultThemeButton.transform.Find("selected").gameObject.SetActive(m_SelectedTheme == Theme.Default);
|
||||
m_LightThemeButton.transform.Find("selected").gameObject.SetActive(m_SelectedTheme == Theme.Light);
|
||||
m_DarkThemeButton.transform.Find("selected").gameObject.SetActive(m_SelectedTheme == Theme.Dark);
|
||||
|
||||
m_DefaultThemeButton.onClick.AddListener(delegate () { SelecteTheme(Theme.Default); });
|
||||
m_LightThemeButton.onClick.AddListener(delegate () { SelecteTheme(Theme.Light); });
|
||||
m_DarkThemeButton.onClick.AddListener(delegate () { SelecteTheme(Theme.Dark); });
|
||||
|
||||
//SelecteTheme(Theme.Default);
|
||||
}
|
||||
|
||||
void SelecteTheme(Theme theme)
|
||||
{
|
||||
m_SelectedTheme = theme;
|
||||
m_DefaultThemeButton.transform.Find("selected").gameObject.SetActive(m_SelectedTheme == Theme.Default);
|
||||
m_LightThemeButton.transform.Find("selected").gameObject.SetActive(m_SelectedTheme == Theme.Light);
|
||||
m_DarkThemeButton.transform.Find("selected").gameObject.SetActive(m_SelectedTheme == Theme.Dark);
|
||||
var charts = transform.GetComponentsInChildren<BaseChart>();
|
||||
foreach (var chart in charts)
|
||||
{
|
||||
chart.UpdateTheme(theme);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
600169
Demo/demo_xchart.unity
600169
Demo/demo_xchart.unity
File diff suppressed because it is too large
Load Diff
@@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5adbd6df9174d6943b7eb8d23651ffd1
|
||||
timeCreated: 1553641950
|
||||
licenseType: Free
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
---
|
||||
|
||||
* `BaseChart.themeInfo`:主题组件`ThemeInfo`。
|
||||
* `BaseChart.title`:标题组件`Title`。
|
||||
* `BaseChart.legend`:图例组件`Legend`。
|
||||
* `BaseChart.tooltip`:提示框组件`Tooltip`。
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
* [DataZoom 区域缩放](#DataZoom)
|
||||
* [Grid 网格](#Grid)
|
||||
* [Legend 图例](#Legend)
|
||||
* [Radar 雷达](#Radar)
|
||||
* [Series 系列](#Series)
|
||||
* [Settings 设置](#Settings)
|
||||
* [Theme 主题](#Theme)
|
||||
@@ -34,6 +35,7 @@
|
||||
* [SerieData 数据项](#SerieData)
|
||||
* [SerieLabel 图形上的文本标签](#SerieLabel)
|
||||
* [SerieSymbol 图形标记](#SerieSymbol)
|
||||
* [TextStyle 文本样式](#TextStyle)
|
||||
|
||||
## `Theme`
|
||||
|
||||
@@ -115,6 +117,43 @@
|
||||
* `GetData(int index)`:获得指定索引的图例。
|
||||
* `GetIndex(string legendName)`:获得指定图例的索引。
|
||||
|
||||
## `Radar`
|
||||
|
||||
---
|
||||
|
||||
* `shape`:雷达图绘制类型。
|
||||
* `Polygon`:多边形。
|
||||
* `Circle`:圆形。
|
||||
* `positionType`:显示位置类型。
|
||||
* `Vertice`:显示在顶点处。
|
||||
* `Between`:显示在顶点之间。
|
||||
* `radius`:雷达图的半径。
|
||||
* `center`:雷达图的中心点。数组的第一项是横坐标,第二项是纵坐标。当值为0-1之间时表示百分比,设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度。
|
||||
* `lineStyle`:线条样式 [LineStyle](#LineStyle)。
|
||||
* `splitArea`:分割区域 [AxisSplitArea](#AxisSplitArea)。
|
||||
* `indicator`:是否显示指示器。
|
||||
* `indicatorGap`:指示器和雷达的间距。
|
||||
* `indicatorList`指示器列表 [Radar.Indicator](#Radar.Indicator)。
|
||||
|
||||
## `Radar.Indicator`
|
||||
|
||||
---
|
||||
|
||||
* `name`:指示器名称。
|
||||
* `max`:指示器的最大值,默认为 0 无限制。
|
||||
* `min`:指示器的最小值,默认为 0 无限制。
|
||||
* `textStyle`:文本样式 [TextStyle](#TextStyle)。
|
||||
|
||||
## `TextStyle`
|
||||
|
||||
---
|
||||
|
||||
* `rotate`:旋转。
|
||||
* `offset`:偏移。
|
||||
* `color`:颜色。
|
||||
* `fontSize`:字体大小。
|
||||
* `fontStyle`:字体风格。
|
||||
|
||||
## `Tooltip`
|
||||
|
||||
---
|
||||
|
||||
67
Editor/PropertyDrawers/IconStyleDrawer.cs
Normal file
67
Editor/PropertyDrawers/IconStyleDrawer.cs
Normal file
@@ -0,0 +1,67 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
[CustomPropertyDrawer(typeof(IconStyle), true)]
|
||||
public class IconStyleDrawer : PropertyDrawer
|
||||
{
|
||||
private Dictionary<string, bool> m_IconStyleToggle = new Dictionary<string, bool>();
|
||||
|
||||
public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
Rect drawRect = pos;
|
||||
drawRect.height = EditorGUIUtility.singleLineHeight;
|
||||
SerializedProperty m_Show = prop.FindPropertyRelative("m_Show");
|
||||
SerializedProperty m_Layer = prop.FindPropertyRelative("m_Layer");
|
||||
SerializedProperty m_Sprite = prop.FindPropertyRelative("m_Sprite");
|
||||
SerializedProperty m_Color = prop.FindPropertyRelative("m_Color");
|
||||
SerializedProperty m_Width = prop.FindPropertyRelative("m_Width");
|
||||
SerializedProperty m_Height = prop.FindPropertyRelative("m_Height");
|
||||
SerializedProperty m_Offset = prop.FindPropertyRelative("m_Offset");
|
||||
ChartEditorHelper.MakeFoldout(ref drawRect, ref m_IconStyleToggle, prop, null, m_Show, false);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
if (ChartEditorHelper.IsToggle(m_IconStyleToggle, prop))
|
||||
{
|
||||
++EditorGUI.indentLevel;
|
||||
|
||||
EditorGUI.PropertyField(drawRect, m_Layer);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Sprite);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Color);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Width);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Height);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Offset);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Offset);
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
}
|
||||
|
||||
public override float GetPropertyHeight(SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
if (ChartEditorHelper.IsToggle(m_IconStyleToggle, prop))
|
||||
{
|
||||
var hight = 6 * EditorGUIUtility.singleLineHeight + 6 * EditorGUIUtility.standardVerticalSpacing;
|
||||
hight += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Offset"));
|
||||
hight += EditorGUIUtility.standardVerticalSpacing;
|
||||
return hight;
|
||||
}
|
||||
else
|
||||
{
|
||||
return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 85bc0178fe453471fb2706bf81a09235
|
||||
guid: 9cae26ad61d224d8a97d41bdc52ec0b7
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
@@ -15,12 +15,14 @@ namespace XCharts
|
||||
public class RadarDrawer : PropertyDrawer
|
||||
{
|
||||
SerializedProperty m_Shape;
|
||||
SerializedProperty m_PositionType;
|
||||
SerializedProperty m_Radius;
|
||||
SerializedProperty m_SplitNumber;
|
||||
SerializedProperty m_Center;
|
||||
SerializedProperty m_LineStyle;
|
||||
SerializedProperty m_SplitArea;
|
||||
SerializedProperty m_Indicator;
|
||||
SerializedProperty m_IndicatorGap;
|
||||
SerializedProperty m_IndicatorList;
|
||||
|
||||
private Dictionary<string, bool> m_RadarModuleToggle = new Dictionary<string, bool>();
|
||||
@@ -33,12 +35,14 @@ namespace XCharts
|
||||
private void InitProperty(SerializedProperty prop)
|
||||
{
|
||||
m_Shape = prop.FindPropertyRelative("m_Shape");
|
||||
m_PositionType = prop.FindPropertyRelative("m_PositionType");
|
||||
m_Radius = prop.FindPropertyRelative("m_Radius");
|
||||
m_SplitNumber = prop.FindPropertyRelative("m_SplitNumber");
|
||||
m_Center = prop.FindPropertyRelative("m_Center");
|
||||
m_LineStyle = prop.FindPropertyRelative("m_LineStyle");
|
||||
m_SplitArea = prop.FindPropertyRelative("m_SplitArea");
|
||||
m_Indicator = prop.FindPropertyRelative("m_Indicator");
|
||||
m_IndicatorGap = prop.FindPropertyRelative("m_IndicatorGap");
|
||||
m_IndicatorList = prop.FindPropertyRelative("m_IndicatorList");
|
||||
}
|
||||
|
||||
@@ -50,9 +54,9 @@ namespace XCharts
|
||||
float defaultFieldWidth = EditorGUIUtility.fieldWidth;
|
||||
drawRect.height = EditorGUIUtility.singleLineHeight;
|
||||
int index = ChartEditorHelper.GetIndexFromPath(prop);
|
||||
ChartEditorHelper.MakeFoldout(ref drawRect, ref m_RadarModuleToggle, prop, "Radar " + index, null, false);
|
||||
ChartEditorHelper.MakeFoldout(ref drawRect, ref m_RadarModuleToggle, prop, "Radar " + index, null, true);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
if (ChartEditorHelper.IsToggle(m_RadarModuleToggle,prop))
|
||||
if (ChartEditorHelper.IsToggle(m_RadarModuleToggle, prop))
|
||||
{
|
||||
++EditorGUI.indentLevel;
|
||||
|
||||
@@ -60,6 +64,8 @@ namespace XCharts
|
||||
EditorGUIUtility.fieldWidth = defaultFieldWidth;
|
||||
EditorGUI.PropertyField(drawRect, m_Shape);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_PositionType);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
|
||||
EditorGUI.LabelField(drawRect, "Center");
|
||||
var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * 15;
|
||||
@@ -90,6 +96,8 @@ namespace XCharts
|
||||
drawRect.x = pos.x;
|
||||
if (ChartEditorHelper.IsToggle(m_IndicatorToggle, prop))
|
||||
{
|
||||
EditorGUI.PropertyField(drawRect, m_IndicatorGap);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
ChartEditorHelper.MakeList(ref drawRect, ref m_IndicatorSize, m_IndicatorList);
|
||||
}
|
||||
--EditorGUI.indentLevel;
|
||||
@@ -99,9 +107,9 @@ namespace XCharts
|
||||
public override float GetPropertyHeight(SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
int propNum = 1;
|
||||
if (ChartEditorHelper.IsToggle(m_RadarModuleToggle,prop))
|
||||
if (ChartEditorHelper.IsToggle(m_RadarModuleToggle, prop))
|
||||
{
|
||||
propNum += 6;
|
||||
propNum += 7;
|
||||
if (m_IndicatorJsonAreaToggle) propNum += 4;
|
||||
float height = propNum * EditorGUIUtility.singleLineHeight + (propNum - 1) * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_LineStyle"));
|
||||
@@ -110,7 +118,7 @@ namespace XCharts
|
||||
if (ChartEditorHelper.IsToggle(m_IndicatorToggle, prop))
|
||||
{
|
||||
m_IndicatorList = prop.FindPropertyRelative("m_IndicatorList");
|
||||
height += EditorGUIUtility.singleLineHeight * 2 + EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUIUtility.singleLineHeight * 3 + EditorGUIUtility.standardVerticalSpacing;
|
||||
|
||||
for (int i = 0; i < m_IndicatorList.arraySize; i++)
|
||||
{
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace XCharts
|
||||
SerializedProperty m_Name = prop.FindPropertyRelative("m_Name");
|
||||
SerializedProperty m_Max = prop.FindPropertyRelative("m_Max");
|
||||
SerializedProperty m_Min = prop.FindPropertyRelative("m_Min");
|
||||
SerializedProperty m_Color = prop.FindPropertyRelative("m_Color");
|
||||
SerializedProperty m_TextStyle = prop.FindPropertyRelative("m_TextStyle");
|
||||
Rect drawRect = pos;
|
||||
float defaultLabelWidth = EditorGUIUtility.labelWidth;
|
||||
float defaultFieldWidth = EditorGUIUtility.fieldWidth;
|
||||
@@ -30,7 +30,7 @@ namespace XCharts
|
||||
int index = ChartEditorHelper.GetIndexFromPath(prop);
|
||||
ChartEditorHelper.MakeFoldout(ref drawRect, ref m_RadarModuleToggle, prop, "Indicator " + index, m_Name, false);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
if (ChartEditorHelper.IsToggle(m_RadarModuleToggle,prop))
|
||||
if (ChartEditorHelper.IsToggle(m_RadarModuleToggle, prop))
|
||||
{
|
||||
++EditorGUI.indentLevel;
|
||||
|
||||
@@ -40,8 +40,8 @@ namespace XCharts
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Max);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Color);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_TextStyle);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_TextStyle);
|
||||
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
@@ -49,9 +49,11 @@ namespace XCharts
|
||||
|
||||
public override float GetPropertyHeight(SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
if (ChartEditorHelper.IsToggle(m_RadarModuleToggle,prop))
|
||||
if (ChartEditorHelper.IsToggle(m_RadarModuleToggle, prop))
|
||||
{
|
||||
return 5 * EditorGUIUtility.singleLineHeight + 4 * EditorGUIUtility.standardVerticalSpacing;
|
||||
var height = 4 * EditorGUIUtility.singleLineHeight + 3 * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_TextStyle"));
|
||||
return height;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -173,7 +173,7 @@ namespace XCharts
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
|
||||
float nameWid = 40;
|
||||
float nameWid = 42;
|
||||
EditorGUI.PropertyField(new Rect(drawRect.x, drawRect.y, pos.width - 2 * nameWid - 2, pos.height), m_DataDimension);
|
||||
var nameRect = new Rect(pos.width - 2 * nameWid + 14, drawRect.y, nameWid, pos.height);
|
||||
if (GUI.Button(nameRect, new GUIContent("Name")))
|
||||
@@ -181,7 +181,7 @@ namespace XCharts
|
||||
m_ShowDataName.boolValue = !m_ShowDataName.boolValue;
|
||||
}
|
||||
var iconRect = new Rect(pos.width - nameWid + 14, drawRect.y, nameWid, pos.height);
|
||||
if (GUI.Button(iconRect, new GUIContent("Icon")))
|
||||
if (GUI.Button(iconRect, new GUIContent("Other")))
|
||||
{
|
||||
m_ShowDataIcon.boolValue = !m_ShowDataIcon.boolValue;
|
||||
}
|
||||
@@ -232,7 +232,7 @@ namespace XCharts
|
||||
}
|
||||
|
||||
private void DrawDataElement(ref Rect drawRect, int dimension, SerializedProperty m_Datas, bool showName,
|
||||
bool showIconDetail, bool showSelected, int index, float currentWidth)
|
||||
bool showDetail, bool showSelected, int index, float currentWidth)
|
||||
{
|
||||
var lastX = drawRect.x;
|
||||
var lastWid = drawRect.width;
|
||||
@@ -253,7 +253,7 @@ namespace XCharts
|
||||
if (showSelected)
|
||||
{
|
||||
drawRect.width = drawRect.width - 18;
|
||||
EditorGUI.PropertyField(drawRect, element);
|
||||
EditorGUI.PropertyField(drawRect, element, new GUIContent("Element " + index));
|
||||
drawRect.x = currentWidth - 45;
|
||||
EditorGUI.PropertyField(drawRect, selected, GUIContent.none);
|
||||
drawRect.x = lastX;
|
||||
@@ -261,13 +261,14 @@ namespace XCharts
|
||||
}
|
||||
else
|
||||
{
|
||||
EditorGUI.PropertyField(drawRect, element);
|
||||
EditorGUI.PropertyField(drawRect, element, new GUIContent("Element " + index));
|
||||
}
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(element) + EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
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;
|
||||
@@ -296,36 +297,12 @@ namespace XCharts
|
||||
EditorGUIUtility.fieldWidth = lastFieldWid;
|
||||
EditorGUIUtility.labelWidth = lastLabelWid;
|
||||
}
|
||||
if (showIconDetail)
|
||||
if (showDetail)
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
var m_ShowIcon = serieData.FindPropertyRelative("m_ShowIcon");
|
||||
var m_IconImage = serieData.FindPropertyRelative("m_IconImage");
|
||||
var m_IconColor = serieData.FindPropertyRelative("m_IconColor");
|
||||
var m_IconWidth = serieData.FindPropertyRelative("m_IconWidth");
|
||||
var m_IconHeight = serieData.FindPropertyRelative("m_IconHeight");
|
||||
var m_IconOffset = serieData.FindPropertyRelative("m_IconOffset");
|
||||
EditorGUI.PropertyField(drawRect, m_ShowIcon);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_IconImage);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_IconColor);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_IconWidth);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_IconHeight);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
|
||||
EditorGUI.LabelField(drawRect, "Icon Offset");
|
||||
var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * 15;
|
||||
var tempWidth = (drawRect.width - startX + 72) / 2;
|
||||
var centerXRect = new Rect(startX, drawRect.y, tempWidth, drawRect.height);
|
||||
var centerYRect = new Rect(centerXRect.x + tempWidth - 58, drawRect.y, tempWidth, drawRect.height);
|
||||
var x = EditorGUI.FloatField(centerXRect, m_IconOffset.vector3Value.x);
|
||||
var y = EditorGUI.FloatField(centerYRect, m_IconOffset.vector3Value.y);
|
||||
m_IconOffset.vector3Value = new Vector3(x, y);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
|
||||
var m_Icon = serieData.FindPropertyRelative("m_IconStyle");
|
||||
EditorGUI.PropertyField(drawRect, m_Icon);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Icon);
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
}
|
||||
@@ -373,15 +350,25 @@ namespace XCharts
|
||||
if (m_DataFoldout[index])
|
||||
{
|
||||
SerializedProperty m_Data = prop.FindPropertyRelative("m_Data");
|
||||
int num = m_Data.arraySize + 2;
|
||||
if (num > 30) num = 15;
|
||||
height += 2 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing;
|
||||
int num = m_Data.arraySize;
|
||||
if (num > 30)
|
||||
{
|
||||
num = 11;
|
||||
height += (num + 1) * EditorGUIUtility.singleLineHeight + (num) * EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
else
|
||||
{
|
||||
height += (num) * EditorGUIUtility.singleLineHeight + (num - 1) * EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
if (prop.FindPropertyRelative("m_ShowDataIcon").boolValue)
|
||||
{
|
||||
num *= 5;
|
||||
num += 2;
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
var item = m_Data.GetArrayElementAtIndex(i);
|
||||
height += EditorGUI.GetPropertyHeight(item.FindPropertyRelative("m_IconStyle"));
|
||||
}
|
||||
}
|
||||
height += num * EditorGUIUtility.singleLineHeight + (num - 1) * EditorGUIUtility.standardVerticalSpacing;
|
||||
|
||||
}
|
||||
if (m_ShowJsonDataArea)
|
||||
{
|
||||
|
||||
63
Editor/PropertyDrawers/TextStyleDrawer.cs
Normal file
63
Editor/PropertyDrawers/TextStyleDrawer.cs
Normal file
@@ -0,0 +1,63 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
[CustomPropertyDrawer(typeof(TextStyle), true)]
|
||||
public class TextStyleDrawer : PropertyDrawer
|
||||
{
|
||||
//private Dictionary<string, bool> m_TextStyleToggle = new Dictionary<string, bool>();
|
||||
|
||||
public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
Rect drawRect = pos;
|
||||
drawRect.height = EditorGUIUtility.singleLineHeight;
|
||||
SerializedProperty m_Rotate = prop.FindPropertyRelative("m_Rotate");
|
||||
SerializedProperty m_Color = prop.FindPropertyRelative("m_Color");
|
||||
SerializedProperty m_FontSize = prop.FindPropertyRelative("m_FontSize");
|
||||
SerializedProperty m_FontStyle = prop.FindPropertyRelative("m_FontStyle");
|
||||
SerializedProperty m_Offset = prop.FindPropertyRelative("m_Offset");
|
||||
// ChartEditorHelper.MakeFoldout(ref drawRect, ref m_TextStyleToggle, prop, "Text Style");
|
||||
// drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
// if (ChartEditorHelper.IsToggle(m_TextStyleToggle, prop))
|
||||
// {
|
||||
// ++EditorGUI.indentLevel;
|
||||
EditorGUI.PropertyField(drawRect, m_Rotate);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_Offset);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(m_Offset);
|
||||
EditorGUI.PropertyField(drawRect, m_Color);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_FontSize);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(drawRect, m_FontStyle);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
// --EditorGUI.indentLevel;
|
||||
// }
|
||||
}
|
||||
|
||||
public override float GetPropertyHeight(SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
// float height = 0;
|
||||
// if (ChartEditorHelper.IsToggle(m_TextStyleToggle, prop))
|
||||
// {
|
||||
// height += 5 * EditorGUIUtility.singleLineHeight + 4 * EditorGUIUtility.standardVerticalSpacing;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// height += 1 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing;
|
||||
// }
|
||||
float height = 4 * EditorGUIUtility.singleLineHeight + 3 * EditorGUIUtility.standardVerticalSpacing;
|
||||
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Offset"));
|
||||
return height;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 90c1787bea03849c8b6d19be625b7e17
|
||||
guid: f14c425fb2bff44f2bf9ddb8d6ff1741
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
@@ -114,7 +114,7 @@ public class ChartEditorHelper
|
||||
{
|
||||
if (showProp.propertyType == SerializedPropertyType.Boolean)
|
||||
{
|
||||
drawRect.width = 60;
|
||||
drawRect.width = 80;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
102
Editor/XChartEditor.cs
Normal file
102
Editor/XChartEditor.cs
Normal file
@@ -0,0 +1,102 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
public class XChartEditor : EditorWindow
|
||||
{
|
||||
private static Transform GetParent()
|
||||
{
|
||||
GameObject selectObj = Selection.activeGameObject;
|
||||
if (selectObj == null)
|
||||
{
|
||||
var canvas = GameObject.FindObjectOfType<Canvas>();
|
||||
if (canvas != null) return canvas.transform;
|
||||
else
|
||||
{
|
||||
var canvasObject = new GameObject();
|
||||
canvasObject.name = "Canvas";
|
||||
canvas = canvasObject.AddComponent<Canvas>();
|
||||
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
|
||||
canvasObject.AddComponent<CanvasScaler>();
|
||||
canvasObject.AddComponent<GraphicRaycaster>();
|
||||
return canvas.transform;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return selectObj.transform;
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetName(Transform parent, string name)
|
||||
{
|
||||
if (parent.Find(name) == null) return name;
|
||||
for (int i = 1; i <= 10; i++)
|
||||
{
|
||||
var newName = string.Format("{0} ({1})", name, i);
|
||||
if (parent.Find(newName) == null)
|
||||
{
|
||||
return newName;
|
||||
}
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
private static void AddChart<T>(string chartName) where T : BaseChart
|
||||
{
|
||||
var parent = GetParent();
|
||||
if (parent == null) return;
|
||||
var chart = new GameObject();
|
||||
chart.name = GetName(parent, chartName);
|
||||
chart.AddComponent<T>();
|
||||
chart.transform.SetParent(parent);
|
||||
chart.transform.localScale = Vector3.one;
|
||||
chart.transform.localPosition = Vector3.zero;
|
||||
}
|
||||
|
||||
[MenuItem("GameObject/XCharts/LineChart", priority = 44)]
|
||||
public static void AddLineChart()
|
||||
{
|
||||
AddChart<LineChart>("LineChart");
|
||||
}
|
||||
|
||||
[MenuItem("GameObject/XCharts/BarChart", priority = 45)]
|
||||
public static void AddBarChart()
|
||||
{
|
||||
AddChart<BarChart>("BarChart");
|
||||
}
|
||||
|
||||
[MenuItem("GameObject/XCharts/PieChart", priority = 46)]
|
||||
public static void AddPieChart()
|
||||
{
|
||||
AddChart<PieChart>("PieChart");
|
||||
}
|
||||
|
||||
[MenuItem("GameObject/XCharts/RadarChart", priority = 47)]
|
||||
public static void AddRadarChart()
|
||||
{
|
||||
AddChart<RadarChart>("RadarChart");
|
||||
}
|
||||
|
||||
[MenuItem("GameObject/XCharts/ScatterChart", priority = 48)]
|
||||
public static void AddScatterChart()
|
||||
{
|
||||
AddChart<ScatterChart>("ScatterChart");
|
||||
}
|
||||
|
||||
[MenuItem("GameObject/XCharts/HeatmapChart", priority = 49)]
|
||||
public static void AddHeatmapChart()
|
||||
{
|
||||
AddChart<HeatmapChart>("HeatmapChart");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2fbbaed3e670f478c844c1bdfc73d433
|
||||
guid: 941beb76fdaa64a27a2df6561893157e
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
@@ -18,6 +18,10 @@ namespace XCharts
|
||||
/// </summary>
|
||||
public partial class BaseChart
|
||||
{
|
||||
/// <summary>
|
||||
/// The theme info.
|
||||
/// </summary>
|
||||
public ThemeInfo themeInfo { get { return m_ThemeInfo; } }
|
||||
/// <summary>
|
||||
/// The title setting of chart.
|
||||
/// 标题组件
|
||||
@@ -429,6 +433,17 @@ namespace XCharts
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Update chart theme info.
|
||||
/// </summary>
|
||||
/// <param name="info">info</param>
|
||||
public void UpdateThemeInfo(ThemeInfo info)
|
||||
{
|
||||
m_ThemeInfo = info;
|
||||
UpdateTheme(m_ThemeInfo.theme);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Whether series animation enabel.
|
||||
/// 启用或关闭起始动画。
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace XCharts
|
||||
/// <returns></returns>
|
||||
public string jsonData { get { return m_JsonData; } set { m_JsonData = value; ParseJsonData(value); } }
|
||||
|
||||
public void OnAfterDeserialize()
|
||||
internal void OnAfterDeserialize()
|
||||
{
|
||||
if (m_DataFromJson)
|
||||
{
|
||||
@@ -30,7 +30,7 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
public void OnBeforeSerialize()
|
||||
internal void OnBeforeSerialize()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -208,22 +208,22 @@ namespace XCharts
|
||||
/// the current minimun value.
|
||||
/// 当前最小值。
|
||||
/// </summary>
|
||||
public float minValue { get; set; }
|
||||
public float runtimeMinValue { get; internal set; }
|
||||
/// <summary>
|
||||
/// the current maximum value.
|
||||
/// 当前最大值。
|
||||
/// </summary>
|
||||
public float maxValue { get; set; }
|
||||
public float runtimeMaxValue { get; internal set; }
|
||||
/// <summary>
|
||||
/// the x offset of zero position.
|
||||
/// 坐标轴原点在X轴的偏移。
|
||||
/// </summary>
|
||||
public float zeroXOffset { get; set; }
|
||||
public float runtimeZeroXOffset { get; internal set; }
|
||||
/// <summary>
|
||||
/// the y offset of zero position.
|
||||
/// 坐标轴原点在Y轴的偏移。
|
||||
/// </summary>
|
||||
public float zeroYOffset { get; set; }
|
||||
public float runtimeZeroYOffset { get; internal set; }
|
||||
|
||||
private int filterStart;
|
||||
private int filterEnd;
|
||||
@@ -301,7 +301,7 @@ namespace XCharts
|
||||
/// <param name="index">类目数据索引</param>
|
||||
/// <param name="dataZoom">区域缩放</param>
|
||||
/// <returns></returns>
|
||||
public string GetData(int index, DataZoom dataZoom)
|
||||
internal string GetData(int index, DataZoom dataZoom)
|
||||
{
|
||||
var showData = GetDataList(dataZoom);
|
||||
if (index >= 0 && index < showData.Count)
|
||||
@@ -315,7 +315,7 @@ namespace XCharts
|
||||
/// </summary>
|
||||
/// <param name="dataZoom">区域缩放</param>
|
||||
/// <returns></returns>
|
||||
public List<string> GetDataList(DataZoom dataZoom)
|
||||
internal List<string> GetDataList(DataZoom dataZoom)
|
||||
{
|
||||
if (dataZoom != null && dataZoom.enable)
|
||||
{
|
||||
@@ -333,7 +333,7 @@ namespace XCharts
|
||||
/// 更新dataZoom对应的类目数据列表
|
||||
/// </summary>
|
||||
/// <param name="dataZoom"></param>
|
||||
public void UpdateFilterData(DataZoom dataZoom)
|
||||
internal void UpdateFilterData(DataZoom dataZoom)
|
||||
{
|
||||
if (dataZoom != null && dataZoom.enable)
|
||||
{
|
||||
@@ -366,7 +366,7 @@ namespace XCharts
|
||||
/// </summary>
|
||||
/// <param name="dataZoom"></param>
|
||||
/// <returns></returns>
|
||||
public int GetSplitNumber(float coordinateWid, DataZoom dataZoom)
|
||||
internal int GetSplitNumber(float coordinateWid, DataZoom dataZoom)
|
||||
{
|
||||
if (type == AxisType.Value)
|
||||
{
|
||||
@@ -398,7 +398,7 @@ namespace XCharts
|
||||
/// <param name="coordinateWidth"></param>
|
||||
/// <param name="dataZoom"></param>
|
||||
/// <returns></returns>
|
||||
public float GetSplitWidth(float coordinateWidth, DataZoom dataZoom)
|
||||
internal float GetSplitWidth(float coordinateWidth, DataZoom dataZoom)
|
||||
{
|
||||
int split = GetSplitNumber(coordinateWidth, dataZoom);
|
||||
int segment = (m_BoundaryGap ? split : split - 1);
|
||||
@@ -411,7 +411,7 @@ namespace XCharts
|
||||
/// </summary>
|
||||
/// <param name="dataZoom"></param>
|
||||
/// <returns></returns>
|
||||
public int GetDataNumber(DataZoom dataZoom)
|
||||
internal int GetDataNumber(DataZoom dataZoom)
|
||||
{
|
||||
return GetDataList(dataZoom).Count;
|
||||
}
|
||||
@@ -422,7 +422,7 @@ namespace XCharts
|
||||
/// <param name="coordinateWidth"></param>
|
||||
/// <param name="dataZoom"></param>
|
||||
/// <returns></returns>
|
||||
public float GetDataWidth(float coordinateWidth, int dataCount, DataZoom dataZoom)
|
||||
internal float GetDataWidth(float coordinateWidth, int dataCount, DataZoom dataZoom)
|
||||
{
|
||||
if (dataCount < 1) dataCount = 1;
|
||||
var categoryCount = GetDataNumber(dataZoom);
|
||||
@@ -439,7 +439,7 @@ namespace XCharts
|
||||
/// <param name="maxValue"></param>
|
||||
/// <param name="dataZoom"></param>
|
||||
/// <returns></returns>
|
||||
public string GetLabelName(float coordinateWidth, int index, float minValue, float maxValue,
|
||||
internal string GetLabelName(float coordinateWidth, int index, float minValue, float maxValue,
|
||||
DataZoom dataZoom, bool forcePercent)
|
||||
{
|
||||
int split = GetSplitNumber(coordinateWidth, dataZoom);
|
||||
@@ -483,7 +483,7 @@ namespace XCharts
|
||||
/// </summary>
|
||||
/// <param name="dataZoom"></param>
|
||||
/// <returns></returns>
|
||||
public int GetScaleNumber(float coordinateWidth, DataZoom dataZoom)
|
||||
internal int GetScaleNumber(float coordinateWidth, DataZoom dataZoom)
|
||||
{
|
||||
if (type == AxisType.Value)
|
||||
{
|
||||
@@ -508,7 +508,7 @@ namespace XCharts
|
||||
/// <param name="coordinateWidth"></param>
|
||||
/// <param name="dataZoom"></param>
|
||||
/// <returns></returns>
|
||||
public float GetScaleWidth(float coordinateWidth, int index, DataZoom dataZoom)
|
||||
internal float GetScaleWidth(float coordinateWidth, int index, DataZoom dataZoom)
|
||||
{
|
||||
int num = GetScaleNumber(coordinateWidth, dataZoom) - 1;
|
||||
if (num <= 0) num = 1;
|
||||
@@ -528,18 +528,18 @@ namespace XCharts
|
||||
/// 更新刻度标签文字
|
||||
/// </summary>
|
||||
/// <param name="dataZoom"></param>
|
||||
public void UpdateLabelText(float coordinateWidth, DataZoom dataZoom, bool forcePercent)
|
||||
internal void UpdateLabelText(float coordinateWidth, DataZoom dataZoom, bool forcePercent)
|
||||
{
|
||||
for (int i = 0; i < axisLabelTextList.Count; i++)
|
||||
{
|
||||
if (axisLabelTextList[i] != null)
|
||||
{
|
||||
axisLabelTextList[i].text = GetLabelName(coordinateWidth, i, minValue, maxValue, dataZoom, forcePercent);
|
||||
axisLabelTextList[i].text = GetLabelName(coordinateWidth, i, runtimeMinValue, runtimeMaxValue, dataZoom, forcePercent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void SetTooltipLabel(GameObject label)
|
||||
internal void SetTooltipLabel(GameObject label)
|
||||
{
|
||||
m_TooltipLabel = label;
|
||||
m_TooltipLabelRect = label.GetComponent<RectTransform>();
|
||||
@@ -547,13 +547,13 @@ namespace XCharts
|
||||
m_TooltipLabel.SetActive(true);
|
||||
}
|
||||
|
||||
public void SetTooltipLabelColor(Color bgColor, Color textColor)
|
||||
internal void SetTooltipLabelColor(Color bgColor, Color textColor)
|
||||
{
|
||||
m_TooltipLabel.GetComponent<Image>().color = bgColor;
|
||||
m_TooltipLabelText.color = textColor;
|
||||
}
|
||||
|
||||
public void SetTooltipLabelActive(bool flag)
|
||||
internal void SetTooltipLabelActive(bool flag)
|
||||
{
|
||||
if (m_TooltipLabel && m_TooltipLabel.activeInHierarchy != flag)
|
||||
{
|
||||
@@ -561,7 +561,7 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateTooptipLabelText(string text)
|
||||
internal void UpdateTooptipLabelText(string text)
|
||||
{
|
||||
if (m_TooltipLabelText)
|
||||
{
|
||||
@@ -571,7 +571,7 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateTooltipLabelPos(Vector2 pos)
|
||||
internal void UpdateTooltipLabelPos(Vector2 pos)
|
||||
{
|
||||
if (m_TooltipLabel)
|
||||
{
|
||||
@@ -591,7 +591,7 @@ namespace XCharts
|
||||
/// </summary>
|
||||
/// <param name="minValue"></param>
|
||||
/// <param name="maxValue"></param>
|
||||
public void AdjustMinMaxValue(ref float minValue, ref float maxValue)
|
||||
internal void AdjustMinMaxValue(ref float minValue, ref float maxValue)
|
||||
{
|
||||
if (minMaxType == Axis.AxisMinMaxType.Custom)
|
||||
{
|
||||
@@ -663,8 +663,8 @@ namespace XCharts
|
||||
m_AxisLabel.Equals(other.axisLabel) &&
|
||||
splitLineType == other.splitLineType &&
|
||||
boundaryGap == other.boundaryGap &&
|
||||
minValue == other.minValue &&
|
||||
maxValue == other.maxValue &&
|
||||
runtimeMinValue == other.runtimeMinValue &&
|
||||
runtimeMaxValue == other.runtimeMaxValue &&
|
||||
axisName.Equals(other.axisName) &&
|
||||
ChartHelper.IsValueEqualsList<string>(m_Data, other.data);
|
||||
}
|
||||
|
||||
@@ -208,12 +208,12 @@ namespace XCharts
|
||||
/// The start label.
|
||||
/// 组件的开始信息文本。
|
||||
/// </summary>
|
||||
public Text startLabel { get; set; }
|
||||
private Text m_StartLabel { get; set; }
|
||||
/// <summary>
|
||||
/// The end label.
|
||||
/// 组件的结束信息文本。
|
||||
/// </summary>
|
||||
public Text endLabel { get; set; }
|
||||
private Text m_EndLabel { get; set; }
|
||||
|
||||
public static DataZoom defaultDataZoom
|
||||
{
|
||||
@@ -297,15 +297,15 @@ namespace XCharts
|
||||
/// 是否显示文本
|
||||
/// </summary>
|
||||
/// <param name="flag"></param>
|
||||
public void SetLabelActive(bool flag)
|
||||
internal void SetLabelActive(bool flag)
|
||||
{
|
||||
if (startLabel && startLabel.gameObject.activeInHierarchy != flag)
|
||||
if (m_StartLabel && m_StartLabel.gameObject.activeInHierarchy != flag)
|
||||
{
|
||||
startLabel.gameObject.SetActive(flag);
|
||||
m_StartLabel.gameObject.SetActive(flag);
|
||||
}
|
||||
if (endLabel && endLabel.gameObject.activeInHierarchy != flag)
|
||||
if (m_EndLabel && m_EndLabel.gameObject.activeInHierarchy != flag)
|
||||
{
|
||||
endLabel.gameObject.SetActive(flag);
|
||||
m_EndLabel.gameObject.SetActive(flag);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -313,18 +313,18 @@ namespace XCharts
|
||||
/// 设置开始文本内容
|
||||
/// </summary>
|
||||
/// <param name="text"></param>
|
||||
public void SetStartLabelText(string text)
|
||||
internal void SetStartLabelText(string text)
|
||||
{
|
||||
if (startLabel) startLabel.text = text;
|
||||
if (m_StartLabel) m_StartLabel.text = text;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置结束文本内容
|
||||
/// </summary>
|
||||
/// <param name="text"></param>
|
||||
public void SetEndLabelText(string text)
|
||||
internal void SetEndLabelText(string text)
|
||||
{
|
||||
if (endLabel) endLabel.text = text;
|
||||
if (m_EndLabel) m_EndLabel.text = text;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -332,7 +332,7 @@ namespace XCharts
|
||||
/// </summary>
|
||||
/// <param name="gridBottom"></param>
|
||||
/// <returns></returns>
|
||||
public float GetHeight(float gridBottom)
|
||||
internal float GetHeight(float gridBottom)
|
||||
{
|
||||
if (height <= 0)
|
||||
{
|
||||
@@ -342,5 +342,25 @@ namespace XCharts
|
||||
}
|
||||
else return height;
|
||||
}
|
||||
|
||||
internal void SetStartLabel(Text startLabel)
|
||||
{
|
||||
m_StartLabel = startLabel;
|
||||
}
|
||||
|
||||
internal void SetEndLabel(Text endLabel)
|
||||
{
|
||||
m_EndLabel = endLabel;
|
||||
}
|
||||
|
||||
internal void UpdateStartLabelPosition(Vector3 pos)
|
||||
{
|
||||
m_StartLabel.transform.localPosition = pos;
|
||||
}
|
||||
|
||||
internal void UpdateEndLabelPosition(Vector3 pos)
|
||||
{
|
||||
m_EndLabel.transform.localPosition = pos;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -30,6 +30,20 @@ namespace XCharts
|
||||
Circle
|
||||
}
|
||||
/// <summary>
|
||||
/// 显示位置。
|
||||
/// </summary>
|
||||
public enum PositionType
|
||||
{
|
||||
/// <summary>
|
||||
/// 显示在顶点处。
|
||||
/// </summary>
|
||||
Vertice,
|
||||
/// <summary>
|
||||
/// 显示在两者之间。
|
||||
/// </summary>
|
||||
Between,
|
||||
}
|
||||
/// <summary>
|
||||
/// Indicator of radar chart, which is used to assign multiple variables(dimensions) in radar chart.
|
||||
/// 雷达图的指示器,用来指定雷达图中的多个变量(维度)。
|
||||
/// </summary>
|
||||
@@ -39,7 +53,8 @@ namespace XCharts
|
||||
[SerializeField] private string m_Name;
|
||||
[SerializeField] private float m_Max;
|
||||
[SerializeField] private float m_Min;
|
||||
[SerializeField] private Color m_Color;
|
||||
[SerializeField] private TextStyle m_TextStyle = new TextStyle();
|
||||
|
||||
/// <summary>
|
||||
/// 指示器名称。
|
||||
/// </summary>
|
||||
@@ -55,10 +70,10 @@ namespace XCharts
|
||||
/// </summary>
|
||||
public float min { get { return m_Min; } set { m_Min = value; } }
|
||||
/// <summary>
|
||||
/// Specfy a color the the indicator.
|
||||
/// 标签特定的颜色。默认取自主题的axisTextColor。
|
||||
/// the style of text.
|
||||
/// 文本样式。
|
||||
/// </summary>
|
||||
public Color color { get { return m_Color; } set { m_Color = value; } }
|
||||
public TextStyle textStyle { get { return m_TextStyle; } set { m_TextStyle = value; } }
|
||||
/// <summary>
|
||||
/// the text conponent of indicator.
|
||||
/// 指示器的文本组件。
|
||||
@@ -72,7 +87,7 @@ namespace XCharts
|
||||
m_Name = name,
|
||||
m_Max = max,
|
||||
m_Min = min,
|
||||
m_Color = color
|
||||
m_TextStyle = textStyle.Clone()
|
||||
};
|
||||
}
|
||||
|
||||
@@ -99,7 +114,7 @@ namespace XCharts
|
||||
return false;
|
||||
}
|
||||
return m_Name.Equals(other.name) &&
|
||||
ChartHelper.IsValueEqualsColor(m_Color, other.color);
|
||||
m_TextStyle.Equals(other.textStyle);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
@@ -114,6 +129,8 @@ namespace XCharts
|
||||
[SerializeField] private LineStyle m_LineStyle = new LineStyle();
|
||||
[SerializeField] private AxisSplitArea m_SplitArea = AxisSplitArea.defaultSplitArea;
|
||||
[SerializeField] private bool m_Indicator = true;
|
||||
[SerializeField] private PositionType m_PositionType = PositionType.Vertice;
|
||||
[SerializeField] private float m_IndicatorGap = 10;
|
||||
[SerializeField] private List<Indicator> m_IndicatorList = new List<Indicator>();
|
||||
/// <summary>
|
||||
/// Radar render type, in which 'Polygon' and 'Circle' are supported.
|
||||
@@ -153,6 +170,14 @@ namespace XCharts
|
||||
/// </summary>
|
||||
public bool indicator { get { return m_Indicator; } set { m_Indicator = value; } }
|
||||
/// <summary>
|
||||
/// 指示器和雷达的间距。
|
||||
/// </summary>
|
||||
public float indicatorGap { get { return m_IndicatorGap; } set { m_IndicatorGap = value; } }
|
||||
/// <summary>
|
||||
/// 显示位置类型。
|
||||
/// </summary>
|
||||
public PositionType positionType { get { return m_PositionType; } set { m_PositionType = value; } }
|
||||
/// <summary>
|
||||
/// the indicator list.
|
||||
/// 指示器列表。
|
||||
/// </summary>
|
||||
@@ -162,20 +187,18 @@ namespace XCharts
|
||||
/// the center position of radar in container.
|
||||
/// 雷达图在容器中的具体中心点。
|
||||
/// </summary>
|
||||
/// <value></value>
|
||||
public Vector2 centerPos { get; set; }
|
||||
public Vector2 runtimeCenterPos { get; internal set; }
|
||||
/// <summary>
|
||||
/// the true radius of radar.
|
||||
/// 雷达图的运行时实际半径。
|
||||
/// </summary>
|
||||
/// <value></value>
|
||||
public float actualRadius { get; set; }
|
||||
public float runtimeRadius { get; internal set; }
|
||||
public float runtimeDataRadius { get; internal set; }
|
||||
/// <summary>
|
||||
/// the data position list of radar.
|
||||
/// 雷达图的所有数据坐标点列表。
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public Dictionary<int, List<Vector3>> dataPosList = new Dictionary<int, List<Vector3>>();
|
||||
public Dictionary<int, List<Vector3>> runtimeDataPosList = new Dictionary<int, List<Vector3>>();
|
||||
|
||||
public static Radar defaultRadar
|
||||
{
|
||||
@@ -219,12 +242,14 @@ namespace XCharts
|
||||
{
|
||||
var radar = new Radar();
|
||||
radar.shape = shape;
|
||||
radar.positionType = positionType;
|
||||
radar.radius = radius;
|
||||
radar.splitNumber = splitNumber;
|
||||
radar.center[0] = center[0];
|
||||
radar.center[1] = center[1];
|
||||
radar.indicatorList.Clear();
|
||||
radar.indicator = indicator;
|
||||
radar.indicatorGap = indicatorGap;
|
||||
foreach (var d in indicatorList) radar.indicatorList.Add(d.Clone());
|
||||
return radar;
|
||||
}
|
||||
@@ -253,10 +278,12 @@ namespace XCharts
|
||||
}
|
||||
return radius == other.radius &&
|
||||
shape == other.shape &&
|
||||
positionType == other.positionType &&
|
||||
splitNumber == other.splitNumber &&
|
||||
center[0] == other.center[0] &&
|
||||
center[1] == other.center[1] &&
|
||||
indicator == other.indicator &&
|
||||
indicatorGap == other.indicatorGap &&
|
||||
IsEqualsIndicatorList(indicatorList, other.indicatorList);
|
||||
}
|
||||
|
||||
@@ -344,32 +371,50 @@ namespace XCharts
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void UpdateRadarCenter(float chartWidth, float chartHeight)
|
||||
internal void UpdateRadarCenter(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];
|
||||
centerPos = new Vector2(centerX, centerY);
|
||||
runtimeCenterPos = new Vector2(centerX, centerY);
|
||||
if (radius <= 0)
|
||||
{
|
||||
actualRadius = 0;
|
||||
runtimeRadius = 0;
|
||||
}
|
||||
else if (radius <= 1)
|
||||
{
|
||||
actualRadius = Mathf.Min(chartWidth, chartHeight) * radius;
|
||||
runtimeRadius = Mathf.Min(chartWidth, chartHeight) * radius;
|
||||
}
|
||||
else
|
||||
{
|
||||
actualRadius = radius;
|
||||
runtimeRadius = radius;
|
||||
}
|
||||
if (shape == Radar.Shape.Polygon && positionType == PositionType.Between)
|
||||
{
|
||||
var angle = Mathf.PI / indicatorList.Count;
|
||||
runtimeDataRadius = runtimeRadius * Mathf.Cos(angle);
|
||||
}
|
||||
else
|
||||
{
|
||||
runtimeDataRadius = runtimeRadius;
|
||||
}
|
||||
}
|
||||
|
||||
public Vector3 GetIndicatorPosition(int index)
|
||||
{
|
||||
int indicatorNum = indicatorList.Count;
|
||||
var angle = 2 * Mathf.PI / indicatorNum * index;
|
||||
var x = centerPos.x + actualRadius * Mathf.Sin(angle);
|
||||
var y = centerPos.y + actualRadius * Mathf.Cos(angle);
|
||||
var angle = 0f;
|
||||
switch (positionType)
|
||||
{
|
||||
case PositionType.Vertice:
|
||||
angle = 2 * Mathf.PI / indicatorNum * index;
|
||||
break;
|
||||
case PositionType.Between:
|
||||
angle = 2 * Mathf.PI / indicatorNum * (index + 0.5f);
|
||||
break;
|
||||
}
|
||||
var x = runtimeCenterPos.x + (runtimeRadius + indicatorGap) * Mathf.Sin(angle);
|
||||
var y = runtimeCenterPos.y + (runtimeRadius + indicatorGap) * Mathf.Cos(angle);
|
||||
return new Vector3(x, y);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -426,12 +426,12 @@ namespace XCharts
|
||||
/// The index of serie,start at 0.
|
||||
/// 系列的索引,从0开始。
|
||||
/// </summary>
|
||||
public int index { get; set; }
|
||||
public int index { get; internal set; }
|
||||
/// <summary>
|
||||
/// Whether the serie is highlighted.
|
||||
/// 该系列是否高亮,一般由图例悬停触发。
|
||||
/// </summary>
|
||||
public bool highlighted { get; set; }
|
||||
public bool highlighted { get; internal set; }
|
||||
/// <summary>
|
||||
/// the count of data list.
|
||||
/// 数据项个数。
|
||||
@@ -444,25 +444,26 @@ namespace XCharts
|
||||
/// <summary>
|
||||
/// 饼图的中心点位置。
|
||||
/// </summary>
|
||||
public Vector3 pieCenterPos { get; set; }
|
||||
public Vector3 runtimePieCenterPos { get; internal set; }
|
||||
/// <summary>
|
||||
/// 饼图的内径
|
||||
/// </summary>
|
||||
public float pieInsideRadius { get; set; }
|
||||
public float runtimePieInsideRadius { get; internal set; }
|
||||
/// <summary>
|
||||
/// 饼图的外径
|
||||
/// </summary>
|
||||
public float pieOutsideRadius { get; set; }
|
||||
public float runtimePieOutsideRadius { get; internal set; }
|
||||
/// <summary>
|
||||
/// 饼图的数据项最大值
|
||||
/// </summary>
|
||||
public float pieDataMax { get; set; }
|
||||
public float runtimePieDataMax { get; internal set; }
|
||||
/// <summary>
|
||||
/// 饼图的数据项之和
|
||||
/// </summary>
|
||||
public float pieDataTotal { get; set; }
|
||||
public float runtimePieDataTotal { get; internal set; }
|
||||
internal int runtimeLastCheckDataCount { get; set; }
|
||||
|
||||
public List<Vector3> GetUpSmoothList(int dataIndex, int size = 100)
|
||||
internal List<Vector3> GetUpSmoothList(int dataIndex, int size = 100)
|
||||
{
|
||||
if (m_UpSmoothPoints.ContainsKey(dataIndex))
|
||||
{
|
||||
@@ -476,7 +477,7 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
public List<Vector3> GetDownSmoothList(int dataIndex, int size = 100)
|
||||
internal List<Vector3> GetDownSmoothList(int dataIndex, int size = 100)
|
||||
{
|
||||
if (m_DownSmoothPoints.ContainsKey(dataIndex))
|
||||
{
|
||||
@@ -490,7 +491,7 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
public void ClearSmoothList(int dataIndex)
|
||||
internal void ClearSmoothList(int dataIndex)
|
||||
{
|
||||
if (m_UpSmoothPoints.ContainsKey(dataIndex))
|
||||
{
|
||||
@@ -836,7 +837,7 @@ namespace XCharts
|
||||
/// 根据dataZoom更新数据列表缓存
|
||||
/// </summary>
|
||||
/// <param name="dataZoom"></param>
|
||||
public void UpdateFilterData(DataZoom dataZoom)
|
||||
internal void UpdateFilterData(DataZoom dataZoom)
|
||||
{
|
||||
if (dataZoom != null && dataZoom.enable)
|
||||
{
|
||||
@@ -939,7 +940,7 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
public Color GetAreaColor(ThemeInfo theme, int index, bool highlight)
|
||||
internal Color GetAreaColor(ThemeInfo theme, int index, bool highlight)
|
||||
{
|
||||
var color = areaStyle.color != Color.clear ? areaStyle.color : (Color)theme.GetColor(index);
|
||||
if (highlight)
|
||||
@@ -951,7 +952,7 @@ namespace XCharts
|
||||
return color;
|
||||
}
|
||||
|
||||
public Color GetAreaToColor(ThemeInfo theme, int index, bool highlight)
|
||||
internal Color GetAreaToColor(ThemeInfo theme, int index, bool highlight)
|
||||
{
|
||||
if (areaStyle.toColor != Color.clear)
|
||||
{
|
||||
@@ -970,7 +971,7 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
public Color GetLineColor(ThemeInfo theme, int index, bool highlight)
|
||||
internal Color GetLineColor(ThemeInfo theme, int index, bool highlight)
|
||||
{
|
||||
if (lineStyle.color != Color.clear)
|
||||
{
|
||||
@@ -988,7 +989,7 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
public Color GetSymbolColor(ThemeInfo theme, int index, bool highlight)
|
||||
internal Color GetSymbolColor(ThemeInfo theme, int index, bool highlight)
|
||||
{
|
||||
if (symbol.color != Color.clear)
|
||||
{
|
||||
@@ -1006,13 +1007,13 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
public float GetBarWidth(float categoryWidth)
|
||||
internal float GetBarWidth(float categoryWidth)
|
||||
{
|
||||
if (m_BarWidth > 1) return m_BarWidth;
|
||||
else return m_BarWidth * categoryWidth;
|
||||
}
|
||||
|
||||
public float GetBarGap(float categoryWidth)
|
||||
internal float GetBarGap(float categoryWidth)
|
||||
{
|
||||
if (m_BarGap == -1) return 0;
|
||||
else if (m_BarGap <= 1) return GetBarWidth(categoryWidth) * m_BarGap;
|
||||
@@ -1027,7 +1028,7 @@ namespace XCharts
|
||||
{
|
||||
foreach (var data in m_Data)
|
||||
{
|
||||
data.showIcon = flag;
|
||||
data.iconStyle.show = flag;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1041,7 +1042,7 @@ namespace XCharts
|
||||
if (dataIndex >= 0 && dataIndex < m_Data.Count)
|
||||
{
|
||||
var data = m_Data[dataIndex];
|
||||
data.showIcon = flag;
|
||||
data.iconStyle.show = flag;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1054,8 +1055,8 @@ namespace XCharts
|
||||
{
|
||||
foreach (var data in m_Data)
|
||||
{
|
||||
data.iconWidth = width;
|
||||
data.iconHeight = height;
|
||||
data.iconStyle.width = width;
|
||||
data.iconStyle.height = height;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1069,15 +1070,15 @@ namespace XCharts
|
||||
if (dataIndex >= 0 && dataIndex < m_Data.Count)
|
||||
{
|
||||
var data = m_Data[dataIndex];
|
||||
data.iconImage = image;
|
||||
data.iconStyle.sprite = image;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsNeedShowDataIcon()
|
||||
internal bool IsNeedShowDataIcon()
|
||||
{
|
||||
foreach (var data in m_Data)
|
||||
{
|
||||
if (data.showIcon) return true;
|
||||
if (data.iconStyle.show) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -1093,8 +1094,8 @@ namespace XCharts
|
||||
if (dataIndex >= 0 && dataIndex < m_Data.Count)
|
||||
{
|
||||
var data = m_Data[dataIndex];
|
||||
data.iconWidth = width;
|
||||
data.iconHeight = height;
|
||||
data.iconStyle.width = width;
|
||||
data.iconStyle.height = height;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1108,7 +1109,7 @@ namespace XCharts
|
||||
if (dataIndex >= 0 && dataIndex < m_Data.Count)
|
||||
{
|
||||
var data = m_Data[dataIndex];
|
||||
data.iconColor = color;
|
||||
data.iconStyle.color = color;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -143,7 +143,7 @@ namespace XCharts
|
||||
/// </summary>
|
||||
/// <param name="index"></param>
|
||||
/// <returns></returns>
|
||||
public Serie GetLastStackSerie(int index)
|
||||
internal Serie GetLastStackSerie(int index)
|
||||
{
|
||||
var serie = GetSerie(index);
|
||||
return GetLastStackSerie(serie);
|
||||
@@ -154,7 +154,7 @@ namespace XCharts
|
||||
/// </summary>
|
||||
/// <param name="stack"></param>
|
||||
/// <returns></returns>
|
||||
public bool IsAnyGradientSerie(string stack)
|
||||
internal bool IsAnyGradientSerie(string stack)
|
||||
{
|
||||
if (string.IsNullOrEmpty(stack)) return false;
|
||||
foreach (var serie in m_Series)
|
||||
@@ -172,7 +172,7 @@ namespace XCharts
|
||||
/// </summary>
|
||||
/// <param name="serie"></param>
|
||||
/// <returns></returns>
|
||||
public Serie GetLastStackSerie(Serie serie)
|
||||
internal Serie GetLastStackSerie(Serie serie)
|
||||
{
|
||||
if (serie == null || string.IsNullOrEmpty(serie.stack)) return null;
|
||||
for (int i = serie.index - 1; i >= 0; i--)
|
||||
@@ -461,7 +461,7 @@ namespace XCharts
|
||||
/// dataZoom由变化是更新系列的缓存数据
|
||||
/// </summary>
|
||||
/// <param name="dataZoom"></param>
|
||||
public void UpdateFilterData(DataZoom dataZoom)
|
||||
internal void UpdateFilterData(DataZoom dataZoom)
|
||||
{
|
||||
if (dataZoom != null && dataZoom.enable)
|
||||
{
|
||||
@@ -527,7 +527,7 @@ namespace XCharts
|
||||
/// </summary>
|
||||
/// <param name="axisIndex"></param>
|
||||
/// <returns></returns>
|
||||
public bool IsUsedAxisIndex(int axisIndex)
|
||||
internal bool IsUsedAxisIndex(int axisIndex)
|
||||
{
|
||||
foreach (var serie in list)
|
||||
{
|
||||
@@ -555,7 +555,7 @@ namespace XCharts
|
||||
/// <param name="axisIndex"></param>
|
||||
/// <param name="minVaule"></param>
|
||||
/// <param name="maxValue"></param>
|
||||
public void GetXMinMaxValue(DataZoom dataZoom, int axisIndex, bool isValueAxis,
|
||||
internal void GetXMinMaxValue(DataZoom dataZoom, int axisIndex, bool isValueAxis,
|
||||
out float minVaule, out float maxValue)
|
||||
{
|
||||
GetMinMaxValue(dataZoom, axisIndex, isValueAxis, false, out minVaule, out maxValue);
|
||||
@@ -568,7 +568,7 @@ namespace XCharts
|
||||
/// <param name="axisIndex"></param>
|
||||
/// <param name="minVaule"></param>
|
||||
/// <param name="maxValue"></param>
|
||||
public void GetYMinMaxValue(DataZoom dataZoom, int axisIndex, bool isValueAxis,
|
||||
internal void GetYMinMaxValue(DataZoom dataZoom, int axisIndex, bool isValueAxis,
|
||||
out float minVaule, out float maxValue)
|
||||
{
|
||||
GetMinMaxValue(dataZoom, axisIndex, isValueAxis, true, out minVaule, out maxValue);
|
||||
@@ -576,7 +576,7 @@ namespace XCharts
|
||||
|
||||
private Dictionary<int, List<Serie>> _stackSeriesForMinMax = new Dictionary<int, List<Serie>>();
|
||||
private Dictionary<int, float> _serieTotalValueForMinMax = new Dictionary<int, float>();
|
||||
public void GetMinMaxValue(DataZoom dataZoom, int axisIndex, bool isValueAxis, bool yValue,
|
||||
internal void GetMinMaxValue(DataZoom dataZoom, int axisIndex, bool isValueAxis, bool yValue,
|
||||
out float minVaule, out float maxValue)
|
||||
{
|
||||
float min = int.MaxValue;
|
||||
@@ -680,7 +680,7 @@ namespace XCharts
|
||||
/// 是否由数据堆叠
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public bool IsStack()
|
||||
internal bool IsStack()
|
||||
{
|
||||
_setForStack.Clear();
|
||||
foreach (var serie in m_Series)
|
||||
@@ -701,7 +701,7 @@ namespace XCharts
|
||||
/// <param name="stackName"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <returns></returns>
|
||||
public bool IsStack(string stackName, SerieType type)
|
||||
internal bool IsStack(string stackName, SerieType type)
|
||||
{
|
||||
if (string.IsNullOrEmpty(stackName)) return false;
|
||||
int count = 0;
|
||||
@@ -721,7 +721,7 @@ namespace XCharts
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
/// <returns></returns>
|
||||
public bool IsPercentStack(SerieType type)
|
||||
internal bool IsPercentStack(SerieType type)
|
||||
{
|
||||
int count = 0;
|
||||
bool isPercentStack = false;
|
||||
@@ -746,7 +746,7 @@ namespace XCharts
|
||||
/// <param name="stackName"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <returns></returns>
|
||||
public bool IsPercentStack(string stackName, SerieType type)
|
||||
internal bool IsPercentStack(string stackName, SerieType type)
|
||||
{
|
||||
if (string.IsNullOrEmpty(stackName)) return false;
|
||||
int count = 0;
|
||||
@@ -770,7 +770,7 @@ namespace XCharts
|
||||
/// 获得堆叠系列列表
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public Dictionary<int, List<Serie>> GetStackSeries()
|
||||
internal Dictionary<int, List<Serie>> GetStackSeries()
|
||||
{
|
||||
int count = 0;
|
||||
Dictionary<string, int> sets = new Dictionary<string, int>();
|
||||
@@ -810,7 +810,7 @@ namespace XCharts
|
||||
/// </summary>
|
||||
/// <param name="Dictionary<int"></param>
|
||||
/// <param name="stackSeries"></param>
|
||||
public void GetStackSeries(ref Dictionary<int, List<Serie>> stackSeries)
|
||||
internal void GetStackSeries(ref Dictionary<int, List<Serie>> stackSeries)
|
||||
{
|
||||
int count = 0;
|
||||
sets.Clear();
|
||||
@@ -860,7 +860,7 @@ namespace XCharts
|
||||
/// 获得所有系列名,不包含空名字。
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<string> GetSerieNameList()
|
||||
internal List<string> GetSerieNameList()
|
||||
{
|
||||
serieNameList.Clear();
|
||||
for (int n = 0; n < m_Series.Count; n++)
|
||||
|
||||
@@ -124,42 +124,42 @@ namespace XCharts
|
||||
/// The data index currently indicated by Tooltip.
|
||||
/// 当前提示框所指示的数据项索引。
|
||||
/// </summary>
|
||||
public List<int> dataIndex { get; set; }
|
||||
public List<int> runtimeDataIndex { get; internal set; }
|
||||
/// <summary>
|
||||
/// the value for x indicator label.
|
||||
/// 指示器X轴上要显示的值。
|
||||
/// </summary>
|
||||
public float[] xValues { get; set; }
|
||||
public float[] runtimeXValues { get; internal set; }
|
||||
/// <summary>
|
||||
/// the value for y indicator label.
|
||||
/// 指示器Y轴上要显示的值。
|
||||
/// </summary>
|
||||
public float[] yValues { get; set; }
|
||||
public float[] runtimeYValues { get; internal set; }
|
||||
/// <summary>
|
||||
/// the current pointer position.
|
||||
/// 当前鼠标位置。
|
||||
/// </summary>
|
||||
public Vector2 pointerPos { get; set; }
|
||||
public Vector2 runtimePointerPos { get; internal set; }
|
||||
/// <summary>
|
||||
/// the width of tooltip.
|
||||
/// 提示框宽。
|
||||
/// </summary>
|
||||
public float width { get { return m_ContentRect.sizeDelta.x; } }
|
||||
public float runtimeWidth { get { return m_ContentRect.sizeDelta.x; } }
|
||||
/// <summary>
|
||||
/// the height of tooltip.
|
||||
/// 提示框高。
|
||||
/// </summary>
|
||||
public float height { get { return m_ContentRect.sizeDelta.y; } }
|
||||
public float runtimeHeight { get { return m_ContentRect.sizeDelta.y; } }
|
||||
/// <summary>
|
||||
/// Whether the tooltip has been initialized.
|
||||
/// 提示框是否已初始化。
|
||||
/// </summary>
|
||||
public bool inited { get { return m_GameObject != null; } }
|
||||
public bool runtimeInited { get { return m_GameObject != null; } }
|
||||
/// <summary>
|
||||
/// the gameObject of tooltip.
|
||||
/// 提示框的gameObject。
|
||||
/// </summary>
|
||||
public GameObject gameObject { get { return m_GameObject; } }
|
||||
public GameObject runtimeGameObject { get { return m_GameObject; } }
|
||||
|
||||
public static Tooltip defaultTooltip
|
||||
{
|
||||
@@ -168,9 +168,9 @@ namespace XCharts
|
||||
var tooltip = new Tooltip
|
||||
{
|
||||
m_Show = true,
|
||||
xValues = new float[2] { -1, -1 },
|
||||
yValues = new float[2] { -1, -1 },
|
||||
dataIndex = new List<int>() { -1, -1 },
|
||||
runtimeXValues = new float[2] { -1, -1 },
|
||||
runtimeYValues = new float[2] { -1, -1 },
|
||||
runtimeDataIndex = new List<int>() { -1, -1 },
|
||||
lastDataIndex = new List<int>() { -1, -1 }
|
||||
};
|
||||
return tooltip;
|
||||
@@ -214,7 +214,8 @@ namespace XCharts
|
||||
/// <param name="color"></param>
|
||||
public void SetContentBackgroundColor(Color color)
|
||||
{
|
||||
m_Content.GetComponent<Image>().color = color;
|
||||
if (m_Content != null && m_Content.GetComponent<Image>() != null)
|
||||
m_Content.GetComponent<Image>().color = color;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -252,11 +253,11 @@ namespace XCharts
|
||||
/// <summary>
|
||||
/// 清除提示框指示数据
|
||||
/// </summary>
|
||||
public void ClearValue()
|
||||
internal void ClearValue()
|
||||
{
|
||||
dataIndex[0] = dataIndex[1] = -1;
|
||||
xValues[0] = xValues[1] = -1;
|
||||
yValues[0] = yValues[1] = -1;
|
||||
runtimeDataIndex[0] = runtimeDataIndex[1] = -1;
|
||||
runtimeXValues[0] = runtimeXValues[1] = -1;
|
||||
runtimeYValues[0] = runtimeYValues[1] = -1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -308,17 +309,17 @@ namespace XCharts
|
||||
/// <returns></returns>
|
||||
public bool IsDataIndexChanged()
|
||||
{
|
||||
return dataIndex[0] != lastDataIndex[0] ||
|
||||
dataIndex[1] != lastDataIndex[1];
|
||||
return runtimeDataIndex[0] != lastDataIndex[0] ||
|
||||
runtimeDataIndex[1] != lastDataIndex[1];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 当前索引缓存
|
||||
/// </summary>
|
||||
public void UpdateLastDataIndex()
|
||||
internal void UpdateLastDataIndex()
|
||||
{
|
||||
lastDataIndex[0] = dataIndex[0];
|
||||
lastDataIndex[1] = dataIndex[1];
|
||||
lastDataIndex[0] = runtimeDataIndex[0];
|
||||
lastDataIndex[1] = runtimeDataIndex[1];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -327,7 +328,7 @@ namespace XCharts
|
||||
/// <returns></returns>
|
||||
public bool IsSelected()
|
||||
{
|
||||
return dataIndex[0] >= 0 || dataIndex[1] >= 0;
|
||||
return runtimeDataIndex[0] >= 0 || runtimeDataIndex[1] >= 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -337,10 +338,10 @@ namespace XCharts
|
||||
/// <returns></returns>
|
||||
public bool IsSelected(int index)
|
||||
{
|
||||
return dataIndex[0] == index || dataIndex[1] == index;
|
||||
return runtimeDataIndex[0] == index || runtimeDataIndex[1] == index;
|
||||
}
|
||||
|
||||
public string GetFormatterContent(int dataIndex, Series series, string category, DataZoom dataZoom = null)
|
||||
internal string GetFormatterContent(int dataIndex, Series series, string category, DataZoom dataZoom = null)
|
||||
{
|
||||
if (string.IsNullOrEmpty(m_Formatter))
|
||||
{
|
||||
@@ -383,7 +384,7 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
public string GetFormatterContent(string serieName, string dataName, float dataValue)
|
||||
internal string GetFormatterContent(string serieName, string dataName, float dataValue)
|
||||
{
|
||||
if (string.IsNullOrEmpty(m_Formatter))
|
||||
return ChartCached.FloatToStr(dataValue, 0, m_ForceENotation);
|
||||
|
||||
@@ -164,14 +164,14 @@ namespace XCharts
|
||||
/// 鼠标悬停选中的index
|
||||
/// </summary>
|
||||
/// <value></value>
|
||||
public int rtSelectedIndex { get; set; }
|
||||
public float rtSelectedValue { get; set; }
|
||||
public int runtimeSelectedIndex { get; internal set; }
|
||||
public float runtimeSelectedValue { get; internal set; }
|
||||
/// <summary>
|
||||
/// the current pointer position.
|
||||
/// 当前鼠标位置。
|
||||
/// </summary>
|
||||
public Vector2 pointerPos { get; set; }
|
||||
public bool isVertical { get { return orient == Orient.Vertical; } }
|
||||
public Vector2 runtimePointerPos { get; internal set; }
|
||||
public bool runtimeIsVertical { get { return orient == Orient.Vertical; } }
|
||||
public float rangeMin
|
||||
{
|
||||
get
|
||||
@@ -198,7 +198,7 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
public int rtSplitNumber
|
||||
public int runtimeSplitNumber
|
||||
{
|
||||
get
|
||||
{
|
||||
@@ -207,18 +207,18 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
public float rangeMinHeight { get { return (rangeMin - min) / (max - min) * itemHeight; } }
|
||||
public float rangeMaxHeight { get { return (rangeMax - min) / (max - min) * itemHeight; } }
|
||||
public float runtimeRangeMinHeight { get { return (rangeMin - min) / (max - min) * itemHeight; } }
|
||||
public float runtimeRangeMaxHeight { get { return (rangeMax - min) / (max - min) * itemHeight; } }
|
||||
|
||||
private List<Color> m_RtInRange = new List<Color>();
|
||||
public List<Color> rtInRange
|
||||
public List<Color> runtimeInRange
|
||||
{
|
||||
get
|
||||
{
|
||||
if (splitNumber == 0 || m_InRange.Count >= splitNumber || m_InRange.Count < 1) return m_InRange;
|
||||
else
|
||||
{
|
||||
if (m_RtInRange.Count != rtSplitNumber)
|
||||
if (m_RtInRange.Count != runtimeSplitNumber)
|
||||
{
|
||||
m_RtInRange.Clear();
|
||||
var total = max - min;
|
||||
@@ -256,7 +256,7 @@ namespace XCharts
|
||||
|
||||
public Color GetColor(float value)
|
||||
{
|
||||
int splitNumber = rtInRange.Count;
|
||||
int splitNumber = runtimeInRange.Count;
|
||||
if (splitNumber <= 0) return Color.clear;
|
||||
value = Mathf.Clamp(value, min, max);
|
||||
|
||||
@@ -264,13 +264,13 @@ namespace XCharts
|
||||
var index = GetIndex(value);
|
||||
var nowMin = min + index * diff;
|
||||
var rate = (value - nowMin) / diff;
|
||||
if (index == splitNumber - 1) return rtInRange[index];
|
||||
else return Color.Lerp(rtInRange[index], rtInRange[index + 1], rate);
|
||||
if (index == splitNumber - 1) return runtimeInRange[index];
|
||||
else return Color.Lerp(runtimeInRange[index], runtimeInRange[index + 1], rate);
|
||||
}
|
||||
|
||||
public int GetIndex(float value)
|
||||
{
|
||||
int splitNumber = rtInRange.Count;
|
||||
int splitNumber = runtimeInRange.Count;
|
||||
if (splitNumber <= 0) return -1;
|
||||
value = Mathf.Clamp(value, min, max);
|
||||
|
||||
@@ -289,19 +289,19 @@ namespace XCharts
|
||||
|
||||
public bool IsInSelectedValue(float value)
|
||||
{
|
||||
if (rtSelectedIndex < 0) return true;
|
||||
if (runtimeSelectedIndex < 0) return true;
|
||||
else
|
||||
{
|
||||
return rtSelectedIndex == GetIndex(value);
|
||||
return runtimeSelectedIndex == GetIndex(value);
|
||||
}
|
||||
}
|
||||
|
||||
public float GetValue(Vector3 pos, float chartWidth, float chartHeight)
|
||||
{
|
||||
var centerPos = location.GetPosition(chartWidth, chartHeight);
|
||||
var pos1 = centerPos + (isVertical ? Vector3.down : Vector3.left) * itemHeight / 2;
|
||||
var pos2 = centerPos + (isVertical ? Vector3.up : Vector3.right) * itemHeight / 2;
|
||||
if (isVertical)
|
||||
var pos1 = centerPos + (runtimeIsVertical ? Vector3.down : Vector3.left) * itemHeight / 2;
|
||||
var pos2 = centerPos + (runtimeIsVertical ? Vector3.up : Vector3.right) * itemHeight / 2;
|
||||
if (runtimeIsVertical)
|
||||
{
|
||||
if (pos.y < pos1.y) return min;
|
||||
else if (pos.y > pos2.y) return max;
|
||||
@@ -337,12 +337,12 @@ namespace XCharts
|
||||
{
|
||||
var pos1 = centerPos + Vector3.down * itemHeight / 2;
|
||||
return local.x >= centerPos.x - itemWidth / 2 && local.x <= centerPos.x + itemWidth / 2 &&
|
||||
local.y >= pos1.y + rangeMinHeight && local.y <= pos1.y + rangeMaxHeight;
|
||||
local.y >= pos1.y + runtimeRangeMinHeight && local.y <= pos1.y + runtimeRangeMaxHeight;
|
||||
}
|
||||
else
|
||||
{
|
||||
var pos1 = centerPos + Vector3.left * itemHeight / 2;
|
||||
return local.x >= pos1.x + rangeMinHeight && local.x <= pos1.x + rangeMaxHeight &&
|
||||
return local.x >= pos1.x + runtimeRangeMinHeight && local.x <= pos1.x + runtimeRangeMaxHeight &&
|
||||
local.y >= centerPos.y - itemWidth / 2 && local.y <= centerPos.y + itemWidth / 2;
|
||||
}
|
||||
}
|
||||
@@ -354,7 +354,7 @@ namespace XCharts
|
||||
{
|
||||
var radius = triangleLen / 2;
|
||||
var pos1 = centerPos + Vector3.down * itemHeight / 2;
|
||||
var cpos = new Vector3(pos1.x + itemWidth / 2 + radius, pos1.y + rangeMinHeight - radius);
|
||||
var cpos = new Vector3(pos1.x + itemWidth / 2 + radius, pos1.y + runtimeRangeMinHeight - radius);
|
||||
|
||||
return local.x >= cpos.x - radius && local.x <= cpos.x + radius &&
|
||||
local.y >= cpos.y - radius && local.y <= cpos.y + radius;
|
||||
@@ -363,7 +363,7 @@ namespace XCharts
|
||||
{
|
||||
var radius = triangleLen / 2;
|
||||
var pos1 = centerPos + Vector3.left * itemHeight / 2;
|
||||
var cpos = new Vector3(pos1.x + rangeMinHeight, pos1.y + itemWidth / 2 + radius);
|
||||
var cpos = new Vector3(pos1.x + runtimeRangeMinHeight, pos1.y + itemWidth / 2 + radius);
|
||||
return local.x >= cpos.x - radius && local.x <= cpos.x + radius &&
|
||||
local.y >= cpos.y - radius && local.y <= cpos.y + radius;
|
||||
}
|
||||
@@ -376,7 +376,7 @@ namespace XCharts
|
||||
{
|
||||
var radius = triangleLen / 2;
|
||||
var pos1 = centerPos + Vector3.down * itemHeight / 2;
|
||||
var cpos = new Vector3(pos1.x + itemWidth / 2 + radius, pos1.y + rangeMaxHeight + radius);
|
||||
var cpos = new Vector3(pos1.x + itemWidth / 2 + radius, pos1.y + runtimeRangeMaxHeight + radius);
|
||||
|
||||
return local.x >= cpos.x - radius && local.x <= cpos.x + radius &&
|
||||
local.y >= cpos.y - radius && local.y <= cpos.y + radius;
|
||||
@@ -385,7 +385,7 @@ namespace XCharts
|
||||
{
|
||||
var radius = triangleLen / 2;
|
||||
var pos1 = centerPos + Vector3.left * itemHeight / 2;
|
||||
var cpos = new Vector3(pos1.x + rangeMaxHeight + radius, pos1.y + itemWidth / 2 + radius);
|
||||
var cpos = new Vector3(pos1.x + runtimeRangeMaxHeight + radius, pos1.y + itemWidth / 2 + radius);
|
||||
return local.x >= cpos.x - radius && local.x <= cpos.x + radius &&
|
||||
local.y >= cpos.y - radius && local.y <= cpos.y + radius;
|
||||
}
|
||||
|
||||
105
Runtime/Component/Sub/IconStyle.cs
Normal file
105
Runtime/Component/Sub/IconStyle.cs
Normal file
@@ -0,0 +1,105 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
/// <summary>
|
||||
/// 系列数据项的图标
|
||||
/// </summary>
|
||||
[System.Serializable]
|
||||
public class IconStyle : SubComponent
|
||||
{
|
||||
public enum Layer
|
||||
{
|
||||
UnderLabel,
|
||||
AboveLabel
|
||||
}
|
||||
[SerializeField] private bool m_Show;
|
||||
[SerializeField] private Layer m_Layer;
|
||||
[SerializeField] private Sprite m_Sprite;
|
||||
[SerializeField] private Color m_Color = Color.white;
|
||||
[SerializeField] private float m_Width = 40;
|
||||
[SerializeField] private float m_Height = 40;
|
||||
[SerializeField] private Vector3 m_Offset;
|
||||
|
||||
/// <summary>
|
||||
/// Whether the data icon is show.
|
||||
/// 是否显示图标。
|
||||
/// </summary>
|
||||
public bool show { get { return m_Show; } set { m_Show = value; UpdateIcon(); } }
|
||||
/// <summary>
|
||||
/// 显示在上层还是在下层。
|
||||
/// </summary>
|
||||
public Layer layer { get { return m_Layer; } set { m_Layer = value; } }
|
||||
/// <summary>
|
||||
/// The image of icon.
|
||||
/// 图标的图片。
|
||||
/// </summary>
|
||||
public Sprite sprite { get { return m_Sprite; } set { m_Sprite = value; } }
|
||||
/// <summary>
|
||||
/// 图标颜色。
|
||||
/// </summary>
|
||||
public Color color { get { return m_Color; } set { m_Color = value; } }
|
||||
/// <summary>
|
||||
/// 图标宽。
|
||||
/// </summary>
|
||||
public float width { get { return m_Width; } set { m_Width = value; } }
|
||||
/// <summary>
|
||||
/// 图标高。
|
||||
/// </summary>
|
||||
public float height { get { return m_Height; } set { m_Height = value; } }
|
||||
/// <summary>
|
||||
/// 图标偏移。
|
||||
/// </summary>
|
||||
public Vector3 offset { get { return m_Offset; } set { m_Offset = value; } }
|
||||
|
||||
public Image image { get; private set; }
|
||||
public RectTransform rect { get; private set; }
|
||||
|
||||
public void SetImage(Image image)
|
||||
{
|
||||
this.image = image;
|
||||
if (image)
|
||||
{
|
||||
rect = image.GetComponent<RectTransform>();
|
||||
if (m_Layer == Layer.UnderLabel)
|
||||
rect.SetSiblingIndex(0);
|
||||
else
|
||||
rect.SetSiblingIndex(image.transform.childCount - 1);
|
||||
UpdateIcon();
|
||||
}
|
||||
}
|
||||
|
||||
public void SetActive(bool flag)
|
||||
{
|
||||
if (image)
|
||||
{
|
||||
ChartHelper.SetActive(image.gameObject, flag);
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateIcon()
|
||||
{
|
||||
if (image == null) return;
|
||||
if (show)
|
||||
{
|
||||
ChartHelper.SetActive(image.gameObject, true);
|
||||
image.sprite = m_Sprite;
|
||||
image.color = m_Color;
|
||||
rect.sizeDelta = new Vector2(m_Width, m_Height);
|
||||
image.transform.localPosition = m_Offset;
|
||||
}
|
||||
else
|
||||
{
|
||||
ChartHelper.SetActive(image.gameObject, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 73e326ed8a76f90408bfa9feb1797433
|
||||
timeCreated: 1555379601
|
||||
licenseType: Free
|
||||
guid: 82c4d360f7b5b4ee7845e9bbe611c8a3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
@@ -74,25 +74,25 @@ namespace XCharts
|
||||
/// Location对应的Anchor锚点
|
||||
/// </summary>
|
||||
/// <value></value>
|
||||
public TextAnchor textAnchor { get { return m_TextAnchor; } }
|
||||
public TextAnchor runtimeTextAnchor { get { return m_TextAnchor; } }
|
||||
/// <summary>
|
||||
/// the minimum achor.
|
||||
/// Location对应的anchorMin。
|
||||
/// </summary>
|
||||
/// <value></value>
|
||||
public Vector2 anchorMin { get { return m_AnchorMin; } }
|
||||
public Vector2 runtimeAnchorMin { get { return m_AnchorMin; } }
|
||||
/// <summary>
|
||||
/// the maximun achor.
|
||||
/// Location对应的anchorMax.
|
||||
/// </summary>
|
||||
/// <value></value>
|
||||
public Vector2 anchorMax { get { return m_AnchorMax; } }
|
||||
public Vector2 runtimeAnchorMax { get { return m_AnchorMax; } }
|
||||
/// <summary>
|
||||
/// the povot.
|
||||
/// Loation对应的中心点。
|
||||
/// </summary>
|
||||
/// <value></value>
|
||||
public Vector2 pivot { get { return m_Pivot; } }
|
||||
public Vector2 runtimePivot { get { return m_Pivot; } }
|
||||
|
||||
public static Location defaultLeft
|
||||
{
|
||||
|
||||
@@ -37,31 +37,26 @@ namespace XCharts
|
||||
/// Easing method used for the first animation.
|
||||
/// 动画的缓动效果。
|
||||
/// </summary>
|
||||
/// <value></value>
|
||||
public Easing easing { get { return m_Easting; } set { m_Easting = value; } }
|
||||
/// <summary>
|
||||
/// The milliseconds duration of the first animation.
|
||||
/// 设定的动画时长(毫秒)。
|
||||
/// </summary>
|
||||
/// <value></value>
|
||||
public int duration { get { return m_Duration; } set { m_Duration = value; } }
|
||||
/// <summary>
|
||||
/// The milliseconds actual duration of the first animation.
|
||||
/// 实际的动画时长(毫秒)。
|
||||
/// </summary>
|
||||
/// <value></value>
|
||||
public int 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.
|
||||
/// 是否开启动画的阈值,当单个系列显示的图形数量大于这个阈值时会关闭动画。
|
||||
/// </summary>
|
||||
/// <value></value>
|
||||
public int threshold { get { return m_Threshold; } set { m_Threshold = value; } }
|
||||
/// <summary>
|
||||
/// The milliseconds delay before updating the first animation.
|
||||
/// 动画延时(毫秒)。
|
||||
/// </summary>
|
||||
/// <value></value>
|
||||
public int delay { get { return m_Delay; } set { m_Delay = value; if (m_Delay < 0) m_Delay = 0; } }
|
||||
|
||||
private Dictionary<int, float> m_DataAnimationState = new Dictionary<int, float>();
|
||||
@@ -179,7 +174,7 @@ namespace XCharts
|
||||
return dataIndex <= m_CurrDataProgress;
|
||||
}
|
||||
|
||||
public void CheckProgress(float delta)
|
||||
internal void CheckProgress(float delta)
|
||||
{
|
||||
if (!enable) return;
|
||||
if (IsInDelay()) return;
|
||||
@@ -195,7 +190,7 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
public void CheckSymbol(float delta, float dest)
|
||||
internal void CheckSymbol(float delta, float dest)
|
||||
{
|
||||
m_CurrSymbolProgress += delta;
|
||||
if (m_CurrSymbolProgress > dest) m_CurrSymbolProgress = dest;
|
||||
|
||||
@@ -9,6 +9,7 @@ using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using System;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
@@ -22,13 +23,7 @@ namespace XCharts
|
||||
[SerializeField] private string m_Name;
|
||||
[SerializeField] private bool m_Selected;
|
||||
[SerializeField] private float m_Radius;
|
||||
[SerializeField] private bool m_ShowIcon;
|
||||
[SerializeField] private Sprite m_IconImage;
|
||||
[SerializeField] private Color m_IconColor = Color.white;
|
||||
[SerializeField] private float m_IconWidth = 40;
|
||||
[SerializeField] private float m_IconHeight = 40;
|
||||
[SerializeField] private Vector3 m_IconOffset;
|
||||
|
||||
[SerializeField] private IconStyle m_IconStyle = new IconStyle();
|
||||
[SerializeField] private List<float> m_Data = new List<float>();
|
||||
|
||||
private bool m_Show = true;
|
||||
@@ -58,32 +53,10 @@ namespace XCharts
|
||||
/// </summary>
|
||||
public bool selected { get { return m_Selected; } set { m_Selected = value; } }
|
||||
/// <summary>
|
||||
/// Whether the data icon is show.
|
||||
/// 是否显示图标。
|
||||
/// the icon of data.
|
||||
/// 数据项图标样式。
|
||||
/// </summary>
|
||||
public bool showIcon { get { return m_ShowIcon; } set { m_ShowIcon = value; } }
|
||||
/// <summary>
|
||||
/// The image of icon.
|
||||
/// 图标的图片。
|
||||
/// </summary>
|
||||
public Sprite iconImage { get { return m_IconImage; } set { m_IconImage = value; } }
|
||||
/// <summary>
|
||||
/// 图标颜色。
|
||||
/// </summary>
|
||||
public Color iconColor { get { return m_IconColor; } set { m_IconColor = value; } }
|
||||
/// <summary>
|
||||
/// 图标宽。
|
||||
/// </summary>
|
||||
public float iconWidth { get { return m_IconWidth; } set { m_IconWidth = value; } }
|
||||
/// <summary>
|
||||
/// 图标高。
|
||||
/// </summary>
|
||||
public float iconHeight { get { return m_IconHeight; } set { m_IconHeight = value; } }
|
||||
/// <summary>
|
||||
/// 图标偏移。
|
||||
/// </summary>
|
||||
public Vector3 iconOffset { get { return m_IconOffset; } set { m_IconOffset = value; } }
|
||||
|
||||
public IconStyle iconStyle { get { return m_IconStyle; } set { m_IconStyle = value; } }
|
||||
/// <summary>
|
||||
/// An arbitrary dimension data list of data item.
|
||||
/// 可指定任意维数的数值列表。
|
||||
@@ -124,8 +97,7 @@ namespace XCharts
|
||||
/// 最小值。
|
||||
/// </summary>
|
||||
public float min { get { return m_Data.Min(); } }
|
||||
public Image icon { get; private set; }
|
||||
public RectTransform iconRect { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 关联的gameObject
|
||||
/// </summary>
|
||||
@@ -133,34 +105,34 @@ namespace XCharts
|
||||
/// <summary>
|
||||
/// 饼图数据项的开始角度(运行时自动计算)
|
||||
/// </summary>
|
||||
public float pieStartAngle { get; set; }
|
||||
public float runtimePieStartAngle { get; internal set; }
|
||||
/// <summary>
|
||||
/// 饼图数据项的结束角度(运行时自动计算)
|
||||
/// </summary>
|
||||
public float pieToAngle { get; set; }
|
||||
public float runtimePieToAngle { get; internal set; }
|
||||
/// <summary>
|
||||
/// 饼图数据项的一半时的角度(运行时自动计算)
|
||||
/// </summary>
|
||||
public float pieHalfAngle { get; set; }
|
||||
public float runtimePieHalfAngle { get; internal set; }
|
||||
/// <summary>
|
||||
/// 饼图数据项的当前角度(运行时自动计算)
|
||||
/// </summary>
|
||||
public float pieCurrAngle { get; set; }
|
||||
public float runtimePieCurrAngle { get; internal set; }
|
||||
/// <summary>
|
||||
/// 饼图数据项的内半径
|
||||
/// </summary>
|
||||
public float pieInsideRadius { get; set; }
|
||||
public float runtimePieInsideRadius { get; internal set; }
|
||||
/// <summary>
|
||||
/// 饼图数据项的外半径
|
||||
/// </summary>
|
||||
public float pieOutsideRadius
|
||||
public float runtimePieOutsideRadius
|
||||
{
|
||||
get
|
||||
{
|
||||
if (radius > 0) return radius;
|
||||
else return m_RtPieOutsideRadius;
|
||||
}
|
||||
set
|
||||
internal set
|
||||
{
|
||||
m_RtPieOutsideRadius = value;
|
||||
}
|
||||
@@ -168,8 +140,8 @@ namespace XCharts
|
||||
/// <summary>
|
||||
/// 饼图数据项的偏移半径
|
||||
/// </summary>
|
||||
public float pieOffsetRadius { get; set; }
|
||||
public Vector3 pieOffsetCenter { get; set; }
|
||||
public float runtimePieOffsetRadius { get; internal set; }
|
||||
public Vector3 runtiemPieOffsetCenter { get; internal set; }
|
||||
|
||||
public float GetData(int index)
|
||||
{
|
||||
@@ -202,7 +174,8 @@ namespace XCharts
|
||||
labelText.text = text;
|
||||
if (m_LabelAutoSize)
|
||||
{
|
||||
var newSize = new Vector2(labelText.preferredWidth + m_LabelPaddingLeftRight * 2,
|
||||
var newSize = string.IsNullOrEmpty(text) ? Vector2.zero :
|
||||
new Vector2(labelText.preferredWidth + m_LabelPaddingLeftRight * 2,
|
||||
labelText.preferredHeight + m_LabelPaddingTopBottom * 2);
|
||||
var sizeChange = newSize.x != labelRect.sizeDelta.x || newSize.y != labelRect.sizeDelta.y;
|
||||
if (sizeChange) labelRect.sizeDelta = newSize;
|
||||
@@ -237,28 +210,19 @@ namespace XCharts
|
||||
if (labelRect) labelRect.localPosition = position;
|
||||
}
|
||||
|
||||
public void SetIconObj(GameObject iconObj)
|
||||
[Obsolete("Use SerieData.SetIconImage() instead.", true)]
|
||||
public void SetIconObj(GameObject iconObj) { }
|
||||
|
||||
public void SetIconImage(Image image)
|
||||
{
|
||||
icon = iconObj.GetComponent<Image>();
|
||||
iconRect = iconObj.GetComponent<RectTransform>();
|
||||
UpdateIcon();
|
||||
if (iconStyle == null) return;
|
||||
iconStyle.SetImage(image);
|
||||
}
|
||||
|
||||
public void UpdateIcon()
|
||||
{
|
||||
if (icon == null) return;
|
||||
if (m_ShowIcon)
|
||||
{
|
||||
ChartHelper.SetActive(icon.gameObject, true);
|
||||
icon.sprite = m_IconImage;
|
||||
icon.color = m_IconColor;
|
||||
iconRect.sizeDelta = new Vector2(m_IconWidth, m_IconHeight);
|
||||
icon.transform.localPosition = m_IconOffset;
|
||||
}
|
||||
else
|
||||
{
|
||||
ChartHelper.SetActive(icon.gameObject, false);
|
||||
}
|
||||
if (iconStyle == null) return;
|
||||
iconStyle.UpdateIcon();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
129
Runtime/Component/Sub/TextStyle.cs
Normal file
129
Runtime/Component/Sub/TextStyle.cs
Normal file
@@ -0,0 +1,129 @@
|
||||
using System.Threading;
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
/// <summary>
|
||||
/// Settings related to text.
|
||||
/// 文本的相关设置。
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class TextStyle : SubComponent, IEquatable<TextStyle>
|
||||
{
|
||||
[SerializeField] private float m_Rotate = 0;
|
||||
[SerializeField] private Vector2 m_Offset = Vector2.zero;
|
||||
[SerializeField] private Color m_Color = Color.clear;
|
||||
[SerializeField] private int m_FontSize = 18;
|
||||
[SerializeField] private FontStyle m_FontStyle = FontStyle.Normal;
|
||||
|
||||
/// <summary>
|
||||
/// Rotation of text.
|
||||
/// 文本的旋转。
|
||||
/// </summary>
|
||||
public float rotate { get { return m_Rotate; } set { m_Rotate = value; } }
|
||||
/// <summary>
|
||||
/// the offset of position.
|
||||
/// 坐标偏移。
|
||||
/// </summary>
|
||||
public Vector2 offset { get { return m_Offset; } set { m_Offset = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// the color of text.
|
||||
/// 文本的颜色。
|
||||
/// </summary>
|
||||
public Color color { get { return m_Color; } set { m_Color = value; } }
|
||||
/// <summary>
|
||||
/// font size.
|
||||
/// 文本字体大小。
|
||||
/// </summary>
|
||||
public int fontSize { get { return m_FontSize; } set { m_FontSize = value; } }
|
||||
/// <summary>
|
||||
/// font style.
|
||||
/// 文本字体的风格。
|
||||
/// </summary>
|
||||
public FontStyle fontStyle { get { return m_FontStyle; } set { m_FontStyle = value; } }
|
||||
|
||||
public TextStyle()
|
||||
{
|
||||
}
|
||||
|
||||
public TextStyle(int fontSize)
|
||||
{
|
||||
this.fontSize = fontSize;
|
||||
}
|
||||
|
||||
public TextStyle(int fontSize, FontStyle fontStyle)
|
||||
{
|
||||
this.fontSize = fontSize;
|
||||
this.fontStyle = fontStyle;
|
||||
}
|
||||
|
||||
public TextStyle(int fontSize, FontStyle fontStyle, Color color)
|
||||
{
|
||||
this.fontSize = fontSize;
|
||||
this.fontStyle = fontStyle;
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public TextStyle(int fontSize, FontStyle fontStyle, Color color, int rorate)
|
||||
{
|
||||
this.fontSize = fontSize;
|
||||
this.fontStyle = fontStyle;
|
||||
this.color = color;
|
||||
this.rotate = rotate;
|
||||
}
|
||||
|
||||
public TextStyle Clone()
|
||||
{
|
||||
var textStyle = new TextStyle();
|
||||
textStyle.rotate = rotate;
|
||||
textStyle.color = color;
|
||||
textStyle.fontSize = fontSize;
|
||||
textStyle.fontStyle = fontStyle;
|
||||
textStyle.offset = offset;
|
||||
return textStyle;
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
if (ReferenceEquals(null, obj))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else if (obj is TextStyle)
|
||||
{
|
||||
return Equals((TextStyle)obj);
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public bool Equals(TextStyle other)
|
||||
{
|
||||
if (ReferenceEquals(null, other))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return rotate == other.rotate &&
|
||||
fontSize == other.fontSize &&
|
||||
fontStyle == other.fontStyle &&
|
||||
offset == other.offset &&
|
||||
ChartHelper.IsValueEqualsColor(m_Color, other.color);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return base.GetHashCode();
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Runtime/Component/Sub/TextStyle.cs.meta
Normal file
11
Runtime/Component/Sub/TextStyle.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e8f6b652968894ab195666501dda672c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -87,8 +87,8 @@ namespace XCharts
|
||||
|
||||
protected override void RefreshTooltip()
|
||||
{
|
||||
var xData = m_Tooltip.xValues[0];
|
||||
var yData = m_Tooltip.yValues[0];
|
||||
var xData = m_Tooltip.runtimeXValues[0];
|
||||
var yData = m_Tooltip.runtimeYValues[0];
|
||||
if (IsCategory() && (xData < 0 || yData < 0)) return;
|
||||
sb.Length = 0;
|
||||
for (int i = 0; i < m_Series.Count; i++)
|
||||
@@ -117,13 +117,13 @@ namespace XCharts
|
||||
}
|
||||
m_Tooltip.UpdateContentText(sb.ToString().Trim());
|
||||
var pos = m_Tooltip.GetContentPos();
|
||||
if (pos.x + m_Tooltip.width > chartWidth)
|
||||
if (pos.x + m_Tooltip.runtimeWidth > chartWidth)
|
||||
{
|
||||
pos.x = chartWidth - m_Tooltip.width;
|
||||
pos.x = chartWidth - m_Tooltip.runtimeWidth;
|
||||
}
|
||||
if (pos.y - m_Tooltip.height < 0)
|
||||
if (pos.y - m_Tooltip.runtimeHeight < 0)
|
||||
{
|
||||
pos.y = m_Tooltip.height;
|
||||
pos.y = m_Tooltip.runtimeHeight;
|
||||
}
|
||||
m_Tooltip.UpdateContentPos(pos);
|
||||
m_Tooltip.SetActive(true);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
public static class XAxisPool
|
||||
internal static class XAxisPool
|
||||
{
|
||||
private static readonly ObjectPool<XAxis> s_ListPool = new ObjectPool<XAxis>(null, null);
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
public static class YAxisPool
|
||||
internal static class YAxisPool
|
||||
{
|
||||
private static readonly ObjectPool<YAxis> s_ListPool = new ObjectPool<YAxis>(null, null);
|
||||
|
||||
|
||||
@@ -54,12 +54,15 @@ namespace XCharts
|
||||
[NonSerialized] private Legend m_CheckLegend = Legend.defaultLegend;
|
||||
[NonSerialized] private float m_CheckWidth = 0;
|
||||
[NonSerialized] private float m_CheckHeight = 0;
|
||||
[NonSerialized] private Vector2 m_CheckMinAnchor;
|
||||
[NonSerialized] private Vector2 m_CheckMaxAnchor;
|
||||
|
||||
[NonSerialized] private float m_CheckSerieCount = 0;
|
||||
[NonSerialized] private List<string> m_CheckSerieName = new List<string>();
|
||||
[NonSerialized] private bool m_RefreshChart = false;
|
||||
[NonSerialized] private bool m_RefreshLabel = false;
|
||||
[NonSerialized] private bool m_ReinitLabel = false;
|
||||
[NonSerialized] private bool m_CheckAnimation = false;
|
||||
[NonSerialized] protected bool m_RefreshChart = false;
|
||||
[NonSerialized] protected bool m_RefreshLabel = false;
|
||||
[NonSerialized] protected bool m_ReinitLabel = false;
|
||||
[NonSerialized] protected bool m_CheckAnimation = false;
|
||||
[NonSerialized] protected List<string> m_LegendRealShowName = new List<string>();
|
||||
|
||||
protected Vector2 chartAnchorMax { get { return rectTransform.anchorMax; } }
|
||||
@@ -148,10 +151,10 @@ namespace XCharts
|
||||
private void InitTitle()
|
||||
{
|
||||
m_Title.OnChanged();
|
||||
TextAnchor anchor = m_Title.location.textAnchor;
|
||||
Vector2 anchorMin = m_Title.location.anchorMin;
|
||||
Vector2 anchorMax = m_Title.location.anchorMax;
|
||||
Vector2 pivot = m_Title.location.pivot;
|
||||
TextAnchor anchor = m_Title.location.runtimeTextAnchor;
|
||||
Vector2 anchorMin = m_Title.location.runtimeAnchorMin;
|
||||
Vector2 anchorMax = m_Title.location.runtimeAnchorMax;
|
||||
Vector2 pivot = m_Title.location.runtimePivot;
|
||||
Vector3 titlePosition = m_Title.location.GetPosition(chartWidth, chartHeight);
|
||||
Vector3 subTitlePosition = -new Vector3(0, m_Title.textFontSize + m_Title.itemGap, 0);
|
||||
float titleWid = chartWidth;
|
||||
@@ -183,10 +186,10 @@ namespace XCharts
|
||||
private void InitLegend()
|
||||
{
|
||||
m_Legend.OnChanged();
|
||||
TextAnchor anchor = m_Legend.location.textAnchor;
|
||||
Vector2 anchorMin = m_Legend.location.anchorMin;
|
||||
Vector2 anchorMax = m_Legend.location.anchorMax;
|
||||
Vector2 pivot = m_Legend.location.pivot;
|
||||
TextAnchor anchor = m_Legend.location.runtimeTextAnchor;
|
||||
Vector2 anchorMin = m_Legend.location.runtimeAnchorMin;
|
||||
Vector2 anchorMax = m_Legend.location.runtimeAnchorMax;
|
||||
Vector2 pivot = m_Legend.location.runtimePivot;
|
||||
|
||||
var legendObject = ChartHelper.AddObject(s_LegendObjectName, transform, anchorMin, anchorMax,
|
||||
pivot, new Vector2(chartWidth, chartHeight));
|
||||
@@ -213,7 +216,7 @@ namespace XCharts
|
||||
totalLegend++;
|
||||
}
|
||||
m_Legend.RemoveButton();
|
||||
ChartHelper.DestoryAllChilds(legendObject.transform);
|
||||
ChartHelper.DestroyAllChildren(legendObject.transform);
|
||||
if (!m_Legend.show) return;
|
||||
for (int i = 0; i < datas.Count; i++)
|
||||
{
|
||||
@@ -287,9 +290,9 @@ namespace XCharts
|
||||
|
||||
private void InitSerieLabel()
|
||||
{
|
||||
var labelObject = ChartHelper.AddObject(s_SerieLabelObjectName, transform, chartAnchorMin,
|
||||
chartAnchorMax, chartPivot, new Vector2(chartWidth, chartHeight));
|
||||
ChartHelper.DestoryAllChilds(labelObject.transform);
|
||||
var labelObject = ChartHelper.AddObject(s_SerieLabelObjectName, transform, Vector2.zero,
|
||||
Vector2.zero, Vector2.zero, new Vector2(chartWidth, chartHeight));
|
||||
SerieLabelPool.ReleaseAll(labelObject.transform);
|
||||
int count = 0;
|
||||
for (int i = 0; i < m_Series.Count; i++)
|
||||
{
|
||||
@@ -297,8 +300,8 @@ namespace XCharts
|
||||
for (int j = 0; j < serie.data.Count; j++)
|
||||
{
|
||||
var serieData = serie.data[j];
|
||||
if (!serie.label.show && j > 100) continue;
|
||||
var textName = s_SerieLabelObjectName + "_" + i + "_" + j + "_" + serieData.name;
|
||||
if (!serie.label.show && j > 100) continue;
|
||||
var textName = ChartCached.GetSerieLabelName(s_SerieLabelObjectName, i, j);
|
||||
var color = Color.grey;
|
||||
if (serie.type == SerieType.Pie)
|
||||
{
|
||||
@@ -310,14 +313,10 @@ namespace XCharts
|
||||
color = serie.label.color != Color.clear ? serie.label.color :
|
||||
(Color)m_ThemeInfo.GetColor(i);
|
||||
}
|
||||
var backgroundColor = serie.label.backgroundColor;
|
||||
var labelObj = ChartHelper.AddSerieLabel(textName, labelObject.transform, m_ThemeInfo.font,
|
||||
color, backgroundColor, serie.label.fontSize, serie.label.fontStyle, serie.label.rotate,
|
||||
serie.label.backgroundWidth, serie.label.backgroundHeight);
|
||||
var labelObj = SerieLabelPool.Get(textName, labelObject.transform, serie.label, m_ThemeInfo.font, color, serieData);
|
||||
var iconImage = labelObj.transform.Find("Icon").GetComponent<Image>();
|
||||
serieData.SetIconImage(iconImage);
|
||||
|
||||
var iconObj = ChartHelper.AddIcon("Icon", labelObj.transform, serieData.iconWidth, serieData.iconHeight);
|
||||
serieData.SetIconObj(iconObj);
|
||||
|
||||
var isAutoSize = serie.label.backgroundWidth == 0 || serie.label.backgroundHeight == 0;
|
||||
serieData.InitLabel(labelObj, isAutoSize, serie.label.paddingLeftRight, serie.label.paddingTopBottom);
|
||||
serieData.SetLabelActive(false);
|
||||
@@ -328,6 +327,7 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void InitTooltip()
|
||||
{
|
||||
var tooltipObject = ChartHelper.AddObject("tooltip", transform, chartAnchorMin,
|
||||
@@ -361,6 +361,13 @@ namespace XCharts
|
||||
{
|
||||
SetSize(sizeDelta.x, sizeDelta.y);
|
||||
}
|
||||
|
||||
if (m_CheckMinAnchor != rectTransform.anchorMin || m_CheckMaxAnchor != rectTransform.anchorMax)
|
||||
{
|
||||
m_CheckMaxAnchor = rectTransform.anchorMax;
|
||||
m_CheckMinAnchor = rectTransform.anchorMin;
|
||||
m_ReinitLabel = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void CheckTheme()
|
||||
@@ -409,7 +416,7 @@ namespace XCharts
|
||||
|
||||
private void CheckPointerPos()
|
||||
{
|
||||
var needCheck = (m_Tooltip.show && m_Tooltip.inited)
|
||||
var needCheck = (m_Tooltip.show && m_Tooltip.runtimeInited)
|
||||
|| raycastTarget;
|
||||
if (needCheck)
|
||||
{
|
||||
@@ -429,7 +436,7 @@ namespace XCharts
|
||||
|
||||
private void CheckTooltip()
|
||||
{
|
||||
if (!m_Tooltip.show || !m_Tooltip.inited)
|
||||
if (!m_Tooltip.show || !m_Tooltip.runtimeInited)
|
||||
{
|
||||
if (m_Tooltip.IsActive())
|
||||
{
|
||||
@@ -439,9 +446,9 @@ namespace XCharts
|
||||
}
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < m_Tooltip.dataIndex.Count; i++)
|
||||
for (int i = 0; i < m_Tooltip.runtimeDataIndex.Count; i++)
|
||||
{
|
||||
m_Tooltip.dataIndex[i] = -1;
|
||||
m_Tooltip.runtimeDataIndex[i] = -1;
|
||||
}
|
||||
Vector2 local = pointerPos;
|
||||
if (canvas == null) return;
|
||||
@@ -465,7 +472,7 @@ namespace XCharts
|
||||
}
|
||||
return;
|
||||
}
|
||||
m_Tooltip.pointerPos = local;
|
||||
m_Tooltip.runtimePointerPos = local;
|
||||
CheckTootipArea(local);
|
||||
}
|
||||
|
||||
@@ -486,6 +493,14 @@ namespace XCharts
|
||||
|
||||
protected void CheckRefreshLabel()
|
||||
{
|
||||
foreach (var serie in m_Series.list)
|
||||
{
|
||||
if (serie.label.show && serie.runtimeLastCheckDataCount != serie.dataCount)
|
||||
{
|
||||
m_ReinitLabel = true;
|
||||
serie.runtimeLastCheckDataCount = serie.dataCount;
|
||||
}
|
||||
}
|
||||
if (m_ReinitLabel)
|
||||
{
|
||||
m_ReinitLabel = false;
|
||||
@@ -518,6 +533,7 @@ namespace XCharts
|
||||
InitTitle();
|
||||
InitLegend();
|
||||
InitTooltip();
|
||||
InitSerieLabel();
|
||||
}
|
||||
|
||||
protected virtual void OnThemeChanged()
|
||||
|
||||
@@ -154,14 +154,14 @@ namespace XCharts
|
||||
if (!xAxis.show && !yAxis.show) continue;
|
||||
if (isCartesian && xAxis.show && yAxis.show)
|
||||
{
|
||||
var yRate = (yAxis.maxValue - yAxis.minValue) / coordinateHeight;
|
||||
var xRate = (xAxis.maxValue - xAxis.minValue) / coordinateWidth;
|
||||
var yValue = yRate * (local.y - coordinateY - yAxis.zeroYOffset);
|
||||
if (yAxis.minValue > 0) yValue += yAxis.minValue;
|
||||
m_Tooltip.yValues[i] = yValue;
|
||||
var xValue = xRate * (local.x - coordinateX - xAxis.zeroXOffset);
|
||||
if (xAxis.minValue > 0) xValue += xAxis.minValue;
|
||||
m_Tooltip.xValues[i] = xValue;
|
||||
var yRate = (yAxis.runtimeMaxValue - yAxis.runtimeMinValue) / coordinateHeight;
|
||||
var xRate = (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) / coordinateWidth;
|
||||
var yValue = yRate * (local.y - coordinateY - yAxis.runtimeZeroYOffset);
|
||||
if (yAxis.runtimeMinValue > 0) yValue += yAxis.runtimeMinValue;
|
||||
m_Tooltip.runtimeYValues[i] = yValue;
|
||||
var xValue = xRate * (local.x - coordinateX - xAxis.runtimeZeroXOffset);
|
||||
if (xAxis.runtimeMinValue > 0) xValue += xAxis.runtimeMinValue;
|
||||
m_Tooltip.runtimeXValues[i] = xValue;
|
||||
|
||||
for (int j = 0; j < m_Series.Count; j++)
|
||||
{
|
||||
@@ -175,7 +175,7 @@ namespace XCharts
|
||||
if (Mathf.Abs(xValue - xdata) / xRate < symbolSize
|
||||
&& Mathf.Abs(yValue - ydata) / yRate < symbolSize)
|
||||
{
|
||||
m_Tooltip.dataIndex[i] = n;
|
||||
m_Tooltip.runtimeDataIndex[i] = n;
|
||||
serieData.highlighted = true;
|
||||
}
|
||||
else
|
||||
@@ -195,8 +195,8 @@ namespace XCharts
|
||||
if ((xAxis.boundaryGap && (local.x > pX && local.x <= pX + splitWid)) ||
|
||||
(!xAxis.boundaryGap && (local.x > pX - splitWid / 2 && local.x <= pX + splitWid / 2)))
|
||||
{
|
||||
m_Tooltip.xValues[i] = j;
|
||||
m_Tooltip.dataIndex[i] = j;
|
||||
m_Tooltip.runtimeXValues[i] = j;
|
||||
m_Tooltip.runtimeDataIndex[i] = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -207,16 +207,16 @@ namespace XCharts
|
||||
if ((yAxis.boundaryGap && (local.y > pY && local.y <= pY + splitWid)) ||
|
||||
(!yAxis.boundaryGap && (local.y > pY - splitWid / 2 && local.y <= pY + splitWid / 2)))
|
||||
{
|
||||
m_Tooltip.yValues[i] = j;
|
||||
m_Tooltip.runtimeYValues[i] = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (xAxis.IsCategory())
|
||||
{
|
||||
var value = (yAxis.maxValue - yAxis.minValue) * (local.y - coordinateY - yAxis.zeroYOffset) / coordinateHeight;
|
||||
if (yAxis.minValue > 0) value += yAxis.minValue;
|
||||
m_Tooltip.yValues[i] = value;
|
||||
var value = (yAxis.runtimeMaxValue - yAxis.runtimeMinValue) * (local.y - coordinateY - yAxis.runtimeZeroYOffset) / coordinateHeight;
|
||||
if (yAxis.runtimeMinValue > 0) value += yAxis.runtimeMinValue;
|
||||
m_Tooltip.runtimeYValues[i] = value;
|
||||
for (int j = 0; j < xAxis.GetDataNumber(m_DataZoom); j++)
|
||||
{
|
||||
float splitWid = xAxis.GetDataWidth(coordinateWidth, dataCount, m_DataZoom);
|
||||
@@ -224,17 +224,17 @@ namespace XCharts
|
||||
if ((xAxis.boundaryGap && (local.x > pX && local.x <= pX + splitWid)) ||
|
||||
(!xAxis.boundaryGap && (local.x > pX - splitWid / 2 && local.x <= pX + splitWid / 2)))
|
||||
{
|
||||
m_Tooltip.xValues[i] = j;
|
||||
m_Tooltip.dataIndex[i] = j;
|
||||
m_Tooltip.runtimeXValues[i] = j;
|
||||
m_Tooltip.runtimeDataIndex[i] = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (yAxis.IsCategory())
|
||||
{
|
||||
var value = (xAxis.maxValue - xAxis.minValue) * (local.x - coordinateX - xAxis.zeroXOffset) / coordinateWidth;
|
||||
if (xAxis.minValue > 0) value += xAxis.minValue;
|
||||
m_Tooltip.xValues[i] = value;
|
||||
var value = (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) * (local.x - coordinateX - xAxis.runtimeZeroXOffset) / coordinateWidth;
|
||||
if (xAxis.runtimeMinValue > 0) value += xAxis.runtimeMinValue;
|
||||
m_Tooltip.runtimeXValues[i] = value;
|
||||
for (int j = 0; j < yAxis.GetDataNumber(m_DataZoom); j++)
|
||||
{
|
||||
float splitWid = yAxis.GetDataWidth(coordinateHeight, dataCount, m_DataZoom);
|
||||
@@ -242,8 +242,8 @@ namespace XCharts
|
||||
if ((yAxis.boundaryGap && (local.y > pY && local.y <= pY + splitWid)) ||
|
||||
(!yAxis.boundaryGap && (local.y > pY - splitWid / 2 && local.y <= pY + splitWid / 2)))
|
||||
{
|
||||
m_Tooltip.yValues[i] = j;
|
||||
m_Tooltip.dataIndex[i] = j;
|
||||
m_Tooltip.runtimeYValues[i] = j;
|
||||
m_Tooltip.runtimeDataIndex[i] = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -276,17 +276,17 @@ namespace XCharts
|
||||
bool isCartesian = IsValue();
|
||||
if (isCartesian)
|
||||
{
|
||||
index = m_Tooltip.dataIndex[0];
|
||||
index = m_Tooltip.runtimeDataIndex[0];
|
||||
tempAxis = m_XAxises[0];
|
||||
}
|
||||
else if (m_XAxises[0].type == Axis.AxisType.Value)
|
||||
{
|
||||
index = (int)m_Tooltip.yValues[0];
|
||||
index = (int)m_Tooltip.runtimeYValues[0];
|
||||
tempAxis = m_YAxises[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
index = (int)m_Tooltip.xValues[0];
|
||||
index = (int)m_Tooltip.runtimeXValues[0];
|
||||
tempAxis = m_XAxises[0];
|
||||
}
|
||||
if (index < 0)
|
||||
@@ -341,13 +341,13 @@ namespace XCharts
|
||||
m_Tooltip.UpdateContentText(m_Tooltip.GetFormatterContent(index, m_Series, category, m_DataZoom));
|
||||
}
|
||||
var pos = m_Tooltip.GetContentPos();
|
||||
if (pos.x + m_Tooltip.width > chartWidth)
|
||||
if (pos.x + m_Tooltip.runtimeWidth > chartWidth)
|
||||
{
|
||||
pos.x = chartWidth - m_Tooltip.width;
|
||||
pos.x = chartWidth - m_Tooltip.runtimeWidth;
|
||||
}
|
||||
if (pos.y - m_Tooltip.height < 0)
|
||||
if (pos.y - m_Tooltip.runtimeHeight < 0)
|
||||
{
|
||||
pos.y = m_Tooltip.height;
|
||||
pos.y = m_Tooltip.runtimeHeight;
|
||||
}
|
||||
m_Tooltip.UpdateContentPos(pos);
|
||||
m_Tooltip.SetActive(true);
|
||||
@@ -375,14 +375,14 @@ namespace XCharts
|
||||
var diff = axisIndex > 0 ? -axis.axisLabel.fontSize - axis.axisLabel.margin - 3.5f : axis.axisLabel.margin / 2 + 1;
|
||||
if (axis.IsValue())
|
||||
{
|
||||
labelText = ChartCached.FloatToStr(m_Tooltip.xValues[axisIndex], 2);
|
||||
labelPos = new Vector2(m_Tooltip.pointerPos.x, posY - diff);
|
||||
labelText = ChartCached.FloatToStr(m_Tooltip.runtimeXValues[axisIndex], 2);
|
||||
labelPos = new Vector2(m_Tooltip.runtimePointerPos.x, posY - diff);
|
||||
}
|
||||
else
|
||||
{
|
||||
labelText = axis.GetData((int)m_Tooltip.xValues[axisIndex], m_DataZoom);
|
||||
labelText = axis.GetData((int)m_Tooltip.runtimeXValues[axisIndex], m_DataZoom);
|
||||
float splitWidth = axis.GetSplitWidth(coordinateWidth, m_DataZoom);
|
||||
int index = (int)m_Tooltip.xValues[axisIndex];
|
||||
int index = (int)m_Tooltip.runtimeXValues[axisIndex];
|
||||
float px = coordinateX + index * splitWidth + (axis.boundaryGap ? splitWidth / 2 : 0) + 0.5f;
|
||||
labelPos = new Vector2(px, posY - diff);
|
||||
}
|
||||
@@ -393,14 +393,14 @@ namespace XCharts
|
||||
var diff = axisIndex > 0 ? -axis.axisLabel.margin + 3 : axis.axisLabel.margin - 3;
|
||||
if (axis.IsValue())
|
||||
{
|
||||
labelText = ChartCached.FloatToStr(m_Tooltip.yValues[axisIndex], 2);
|
||||
labelPos = new Vector2(posX - diff, m_Tooltip.pointerPos.y);
|
||||
labelText = ChartCached.FloatToStr(m_Tooltip.runtimeYValues[axisIndex], 2);
|
||||
labelPos = new Vector2(posX - diff, m_Tooltip.runtimePointerPos.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
labelText = axis.GetData((int)m_Tooltip.yValues[axisIndex], m_DataZoom);
|
||||
labelText = axis.GetData((int)m_Tooltip.runtimeYValues[axisIndex], m_DataZoom);
|
||||
float splitWidth = axis.GetSplitWidth(coordinateHeight, m_DataZoom);
|
||||
int index = (int)m_Tooltip.yValues[axisIndex];
|
||||
int index = (int)m_Tooltip.runtimeYValues[axisIndex];
|
||||
float py = coordinateY + index * splitWidth + (axis.boundaryGap ? splitWidth / 2 : 0);
|
||||
labelPos = new Vector2(posX - diff, py);
|
||||
}
|
||||
@@ -439,8 +439,8 @@ namespace XCharts
|
||||
m_YAxises.Add(axis1);
|
||||
m_YAxises.Add(axis2);
|
||||
}
|
||||
foreach (var axis in m_XAxises) axis.minValue = axis.maxValue = 0;
|
||||
foreach (var axis in m_YAxises) axis.minValue = axis.maxValue = 0;
|
||||
foreach (var axis in m_XAxises) axis.runtimeMinValue = axis.runtimeMaxValue = 0;
|
||||
foreach (var axis in m_YAxises) axis.runtimeMinValue = axis.runtimeMaxValue = 0;
|
||||
}
|
||||
|
||||
private void InitAxisY()
|
||||
@@ -462,7 +462,7 @@ namespace XCharts
|
||||
axisObj.transform.localPosition = Vector3.zero;
|
||||
axisObj.SetActive(yAxis.show && yAxis.axisLabel.show);
|
||||
ChartHelper.HideAllObject(axisObj);
|
||||
if (yAxis.IsValue() && yAxis.minValue == 0 && yAxis.maxValue == 0) return;
|
||||
if (yAxis.IsValue() && yAxis.runtimeMinValue == 0 && yAxis.runtimeMaxValue == 0) return;
|
||||
var labelColor = yAxis.axisLabel.color == Color.clear ?
|
||||
(Color)m_ThemeInfo.axisTextColor :
|
||||
yAxis.axisLabel.color;
|
||||
@@ -491,7 +491,7 @@ namespace XCharts
|
||||
txt.transform.localPosition = GetLabelYPosition(totalWidth + (yAxis.boundaryGap ? labelWidth / 2 : 0), i, yAxisIndex, yAxis);
|
||||
|
||||
var isPercentStack = m_Series.IsPercentStack(SerieType.Bar);
|
||||
txt.text = yAxis.GetLabelName(coordinateHeight, i, yAxis.minValue, yAxis.maxValue, m_DataZoom, isPercentStack);
|
||||
txt.text = yAxis.GetLabelName(coordinateHeight, i, yAxis.runtimeMinValue, yAxis.runtimeMaxValue, m_DataZoom, isPercentStack);
|
||||
txt.gameObject.SetActive(yAxis.show &&
|
||||
(yAxis.axisLabel.interval == 0 || i % (yAxis.axisLabel.interval + 1) == 0));
|
||||
yAxis.axisLabelTextList.Add(txt);
|
||||
@@ -504,7 +504,7 @@ namespace XCharts
|
||||
var fontSize = yAxis.axisName.fontSize;
|
||||
var offset = yAxis.axisName.offset;
|
||||
Text axisName = null;
|
||||
var zeroPos = new Vector3(coordinateX + m_XAxises[yAxisIndex].zeroXOffset, coordinateY);
|
||||
var zeroPos = new Vector3(coordinateX + m_XAxises[yAxisIndex].runtimeZeroXOffset, coordinateY);
|
||||
switch (yAxis.axisName.location)
|
||||
{
|
||||
case AxisName.Location.Start:
|
||||
@@ -538,10 +538,10 @@ namespace XCharts
|
||||
axisName.text = yAxis.axisName.name;
|
||||
}
|
||||
//init tooltip label
|
||||
if (m_Tooltip.gameObject)
|
||||
if (m_Tooltip.runtimeGameObject)
|
||||
{
|
||||
Vector2 privot = yAxisIndex > 0 ? new Vector2(0, 0.5f) : new Vector2(1, 0.5f);
|
||||
var labelParent = m_Tooltip.gameObject.transform;
|
||||
var labelParent = m_Tooltip.runtimeGameObject.transform;
|
||||
GameObject labelObj = ChartHelper.AddTooltipLabel(objName + "_label", labelParent, m_ThemeInfo.font, privot);
|
||||
yAxis.SetTooltipLabel(labelObj);
|
||||
yAxis.SetTooltipLabelColor(m_ThemeInfo.tooltipBackgroundColor, m_ThemeInfo.tooltipTextColor);
|
||||
@@ -567,7 +567,7 @@ namespace XCharts
|
||||
axisObj.transform.localPosition = Vector3.zero;
|
||||
axisObj.SetActive(xAxis.show && xAxis.axisLabel.show);
|
||||
ChartHelper.HideAllObject(axisObj);
|
||||
if (xAxis.IsValue() && xAxis.minValue == 0 && xAxis.maxValue == 0) return;
|
||||
if (xAxis.IsValue() && xAxis.runtimeMinValue == 0 && xAxis.runtimeMaxValue == 0) return;
|
||||
var labelColor = xAxis.axisLabel.color == Color.clear ?
|
||||
(Color)m_ThemeInfo.axisTextColor :
|
||||
xAxis.axisLabel.color;
|
||||
@@ -586,7 +586,7 @@ namespace XCharts
|
||||
i, xAxisIndex, xAxis);
|
||||
totalWidth += labelWidth;
|
||||
var isPercentStack = m_Series.IsPercentStack(SerieType.Bar);
|
||||
txt.text = xAxis.GetLabelName(coordinateWidth, i, xAxis.minValue, xAxis.maxValue, m_DataZoom, isPercentStack);
|
||||
txt.text = xAxis.GetLabelName(coordinateWidth, i, xAxis.runtimeMinValue, xAxis.runtimeMaxValue, m_DataZoom, isPercentStack);
|
||||
txt.gameObject.SetActive(xAxis.show &&
|
||||
(xAxis.axisLabel.interval == 0 || i % (xAxis.axisLabel.interval + 1) == 0));
|
||||
xAxis.axisLabelTextList.Add(txt);
|
||||
@@ -598,7 +598,7 @@ namespace XCharts
|
||||
var fontSize = xAxis.axisName.fontSize;
|
||||
var offset = xAxis.axisName.offset;
|
||||
Text axisName = null;
|
||||
var zeroPos = new Vector3(coordinateX, coordinateY + m_YAxises[xAxisIndex].zeroYOffset);
|
||||
var zeroPos = new Vector3(coordinateX, coordinateY + m_YAxises[xAxisIndex].runtimeZeroYOffset);
|
||||
switch (xAxis.axisName.location)
|
||||
{
|
||||
case AxisName.Location.Start:
|
||||
@@ -631,10 +631,10 @@ namespace XCharts
|
||||
}
|
||||
axisName.text = xAxis.axisName.name;
|
||||
}
|
||||
if (m_Tooltip.gameObject)
|
||||
if (m_Tooltip.runtimeGameObject)
|
||||
{
|
||||
Vector2 privot = xAxisIndex > 0 ? new Vector2(0.5f, 1) : new Vector2(0.5f, 1);
|
||||
var labelParent = m_Tooltip.gameObject.transform;
|
||||
var labelParent = m_Tooltip.runtimeGameObject.transform;
|
||||
GameObject labelObj = ChartHelper.AddTooltipLabel(ChartHelper.Cancat(objName, "_label"), labelParent, m_ThemeInfo.font, privot);
|
||||
xAxis.SetTooltipLabel(labelObj);
|
||||
xAxis.SetTooltipLabelColor(m_ThemeInfo.tooltipBackgroundColor, m_ThemeInfo.tooltipTextColor);
|
||||
@@ -648,12 +648,14 @@ namespace XCharts
|
||||
chartAnchorMax, chartPivot, new Vector2(chartWidth, chartHeight));
|
||||
dataZoomObject.transform.localPosition = Vector3.zero;
|
||||
ChartHelper.HideAllObject(dataZoomObject);
|
||||
m_DataZoom.startLabel = ChartHelper.AddTextObject(s_DefaultDataZoom + "start",
|
||||
var startLabel = ChartHelper.AddTextObject(s_DefaultDataZoom + "start",
|
||||
dataZoomObject.transform, m_ThemeInfo.font, m_ThemeInfo.dataZoomTextColor, TextAnchor.MiddleRight,
|
||||
Vector2.zero, Vector2.zero, new Vector2(1, 0.5f), new Vector2(200, 20), m_DataZoom.fontSize, 0, m_DataZoom.fontStyle);
|
||||
m_DataZoom.endLabel = ChartHelper.AddTextObject(s_DefaultDataZoom + "end",
|
||||
var endLabel = ChartHelper.AddTextObject(s_DefaultDataZoom + "end",
|
||||
dataZoomObject.transform, m_ThemeInfo.font, m_ThemeInfo.dataZoomTextColor, TextAnchor.MiddleLeft,
|
||||
Vector2.zero, Vector2.zero, new Vector2(0, 0.5f), new Vector2(200, 20), m_DataZoom.fontSize, 0, m_DataZoom.fontStyle);
|
||||
m_DataZoom.SetStartLabel(startLabel);
|
||||
m_DataZoom.SetEndLabel(endLabel);
|
||||
m_DataZoom.SetLabelActive(false);
|
||||
CheckRaycastTarget();
|
||||
var xAxis = m_XAxises[m_DataZoom.xAxisIndex];
|
||||
@@ -786,26 +788,26 @@ namespace XCharts
|
||||
m_Series.GetYMinMaxValue(m_DataZoom, axisIndex, false, out tempMinValue, out tempMaxValue);
|
||||
}
|
||||
axis.AdjustMinMaxValue(ref tempMinValue, ref tempMaxValue);
|
||||
if (tempMinValue != axis.minValue || tempMaxValue != axis.maxValue)
|
||||
if (tempMinValue != axis.runtimeMinValue || tempMaxValue != axis.runtimeMaxValue)
|
||||
{
|
||||
m_CheckMinMaxValue = true;
|
||||
axis.minValue = tempMinValue;
|
||||
axis.maxValue = tempMaxValue;
|
||||
axis.zeroXOffset = 0;
|
||||
axis.zeroYOffset = 0;
|
||||
axis.runtimeMinValue = tempMinValue;
|
||||
axis.runtimeMaxValue = tempMaxValue;
|
||||
axis.runtimeZeroXOffset = 0;
|
||||
axis.runtimeZeroYOffset = 0;
|
||||
if (tempMinValue != 0 || tempMaxValue != 0)
|
||||
{
|
||||
if (axis is XAxis && axis.IsValue())
|
||||
{
|
||||
axis.zeroXOffset = axis.minValue > 0 ? 0 :
|
||||
axis.maxValue < 0 ? this.coordinateWidth :
|
||||
Mathf.Abs(axis.minValue) * (this.coordinateWidth / (Mathf.Abs(axis.minValue) + Mathf.Abs(axis.maxValue)));
|
||||
axis.runtimeZeroXOffset = axis.runtimeMinValue > 0 ? 0 :
|
||||
axis.runtimeMaxValue < 0 ? this.coordinateWidth :
|
||||
Mathf.Abs(axis.runtimeMinValue) * (this.coordinateWidth / (Mathf.Abs(axis.runtimeMinValue) + Mathf.Abs(axis.runtimeMaxValue)));
|
||||
}
|
||||
if (axis is YAxis && axis.IsValue())
|
||||
{
|
||||
axis.zeroYOffset = axis.minValue > 0 ? 0 :
|
||||
axis.maxValue < 0 ? coordinateHeight :
|
||||
Mathf.Abs(axis.minValue) * (coordinateHeight / (Mathf.Abs(axis.minValue) + Mathf.Abs(axis.maxValue)));
|
||||
axis.runtimeZeroYOffset = axis.runtimeMinValue > 0 ? 0 :
|
||||
axis.runtimeMaxValue < 0 ? coordinateHeight :
|
||||
Mathf.Abs(axis.runtimeMinValue) * (coordinateHeight / (Mathf.Abs(axis.runtimeMinValue) + Mathf.Abs(axis.runtimeMaxValue)));
|
||||
}
|
||||
}
|
||||
if (updateChart)
|
||||
@@ -881,7 +883,7 @@ namespace XCharts
|
||||
var size = yAxis.GetScaleNumber(coordinateWidth, m_DataZoom);
|
||||
var totalWidth = coordinateY;
|
||||
var xAxis = m_XAxises[yAxisIndex];
|
||||
var zeroPos = new Vector3(coordinateX + xAxis.zeroXOffset, coordinateY + yAxis.zeroYOffset);
|
||||
var zeroPos = new Vector3(coordinateX + xAxis.runtimeZeroXOffset, coordinateY + yAxis.runtimeZeroYOffset);
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
var scaleWidth = yAxis.GetScaleWidth(coordinateHeight, i, m_DataZoom);
|
||||
@@ -901,7 +903,7 @@ namespace XCharts
|
||||
}
|
||||
if (yAxis.axisTick.show)
|
||||
{
|
||||
var startX = coordinateX + m_XAxises[yAxisIndex].zeroXOffset;
|
||||
var startX = coordinateX + m_XAxises[yAxisIndex].runtimeZeroXOffset;
|
||||
if (yAxis.IsValue() && yAxisIndex > 0) startX += coordinateWidth;
|
||||
bool inside = yAxis.axisTick.inside;
|
||||
if ((inside && yAxisIndex == 0) || (!inside && yAxisIndex == 1))
|
||||
@@ -935,7 +937,7 @@ namespace XCharts
|
||||
var size = xAxis.GetScaleNumber(coordinateWidth, m_DataZoom);
|
||||
var totalWidth = coordinateX;
|
||||
var yAxis = m_YAxises[xAxisIndex];
|
||||
var zeroPos = new Vector3(coordinateX, coordinateY + yAxis.zeroYOffset);
|
||||
var zeroPos = new Vector3(coordinateX, coordinateY + yAxis.runtimeZeroYOffset);
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
var scaleWidth = xAxis.GetScaleWidth(coordinateWidth, i, m_DataZoom);
|
||||
@@ -955,7 +957,7 @@ namespace XCharts
|
||||
}
|
||||
if (xAxis.axisTick.show)
|
||||
{
|
||||
var startY = coordinateY + m_YAxises[xAxisIndex].zeroYOffset;
|
||||
var startY = coordinateY + m_YAxises[xAxisIndex].runtimeZeroYOffset;
|
||||
if (xAxis.IsValue() && xAxisIndex > 0) startY += coordinateHeight;
|
||||
bool inside = xAxis.axisTick.inside;
|
||||
if ((inside && xAxisIndex == 0) || (!inside && xAxisIndex == 1))
|
||||
@@ -986,7 +988,7 @@ namespace XCharts
|
||||
{
|
||||
if (xAxis.show && xAxis.axisLine.show)
|
||||
{
|
||||
var lineY = coordinateY + (xAxis.axisLine.onZero ? m_YAxises[xAxisIndex].zeroYOffset : 0);
|
||||
var lineY = coordinateY + (xAxis.axisLine.onZero ? m_YAxises[xAxisIndex].runtimeZeroYOffset : 0);
|
||||
if (xAxis.IsValue() && xAxisIndex > 0) lineY += coordinateHeight;
|
||||
var left = new Vector3(coordinateX - xAxis.axisLine.width, lineY);
|
||||
var top = new Vector3(coordinateX + coordinateWidth + xAxis.axisLine.width, lineY);
|
||||
@@ -1004,7 +1006,7 @@ namespace XCharts
|
||||
{
|
||||
if (yAxis.show && yAxis.axisLine.show)
|
||||
{
|
||||
var lineX = coordinateX + (yAxis.axisLine.onZero ? m_XAxises[yAxisIndex].zeroXOffset : 0);
|
||||
var lineX = coordinateX + (yAxis.axisLine.onZero ? m_XAxises[yAxisIndex].runtimeZeroXOffset : 0);
|
||||
if (yAxis.IsValue() && yAxisIndex > 0) lineX += coordinateWidth;
|
||||
var top = new Vector3(lineX, coordinateY + coordinateHeight + yAxis.axisLine.width);
|
||||
ChartDrawer.DrawLine(vh, new Vector3(lineX, coordinateY - yAxis.axisLine.width),
|
||||
@@ -1056,8 +1058,8 @@ namespace XCharts
|
||||
{
|
||||
float value = SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i);
|
||||
float pX = coordinateX + i * scaleWid;
|
||||
float dataHig = (axis.maxValue - axis.minValue) == 0 ? 0 :
|
||||
(value - axis.minValue) / (axis.maxValue - axis.minValue) * hig;
|
||||
float dataHig = (axis.runtimeMaxValue - axis.runtimeMinValue) == 0 ? 0 :
|
||||
(value - axis.runtimeMinValue) / (axis.runtimeMaxValue - axis.runtimeMinValue) * hig;
|
||||
np = new Vector3(pX, m_DataZoom.bottom + dataHig);
|
||||
if (i > 0)
|
||||
{
|
||||
@@ -1127,24 +1129,24 @@ namespace XCharts
|
||||
{
|
||||
case Tooltip.Type.Corss:
|
||||
case Tooltip.Type.Line:
|
||||
float pX = coordinateX + m_Tooltip.xValues[i] * splitWidth
|
||||
float pX = coordinateX + m_Tooltip.runtimeXValues[i] * splitWidth
|
||||
+ (xAxis.boundaryGap ? splitWidth / 2 : 0);
|
||||
if (xAxis.IsValue()) pX = m_Tooltip.pointerPos.x;
|
||||
if (xAxis.IsValue()) pX = m_Tooltip.runtimePointerPos.x;
|
||||
Vector2 sp = new Vector2(pX, coordinateY);
|
||||
Vector2 ep = new Vector2(pX, coordinateY + coordinateHeight);
|
||||
DrawSplitLine(vh, xAxis, Axis.SplitLineType.Solid, sp, ep, m_ThemeInfo.tooltipLineColor);
|
||||
if (m_Tooltip.type == Tooltip.Type.Corss)
|
||||
{
|
||||
sp = new Vector2(coordinateX, m_Tooltip.pointerPos.y);
|
||||
ep = new Vector2(coordinateX + coordinateWidth, m_Tooltip.pointerPos.y);
|
||||
sp = new Vector2(coordinateX, m_Tooltip.runtimePointerPos.y);
|
||||
ep = new Vector2(coordinateX + coordinateWidth, m_Tooltip.runtimePointerPos.y);
|
||||
DrawSplitLine(vh, yAxis, Axis.SplitLineType.Dashed, sp, ep, m_ThemeInfo.tooltipLineColor);
|
||||
}
|
||||
break;
|
||||
case Tooltip.Type.Shadow:
|
||||
float tooltipSplitWid = splitWidth < 1 ? 1 : splitWidth;
|
||||
pX = coordinateX + splitWidth * m_Tooltip.xValues[i] -
|
||||
pX = coordinateX + splitWidth * m_Tooltip.runtimeXValues[i] -
|
||||
(xAxis.boundaryGap ? 0 : splitWidth / 2);
|
||||
if (xAxis.IsValue()) pX = m_Tooltip.xValues[i];
|
||||
if (xAxis.IsValue()) pX = m_Tooltip.runtimeXValues[i];
|
||||
float pY = coordinateY + coordinateHeight;
|
||||
Vector3 p1 = new Vector3(pX, coordinateY);
|
||||
Vector3 p2 = new Vector3(pX, pY);
|
||||
@@ -1172,21 +1174,21 @@ namespace XCharts
|
||||
case Tooltip.Type.Corss:
|
||||
case Tooltip.Type.Line:
|
||||
|
||||
float pY = coordinateY + m_Tooltip.yValues[i] * splitWidth + (yAxis.boundaryGap ? splitWidth / 2 : 0);
|
||||
float pY = coordinateY + m_Tooltip.runtimeYValues[i] * splitWidth + (yAxis.boundaryGap ? splitWidth / 2 : 0);
|
||||
Vector2 sp = new Vector2(coordinateX, pY);
|
||||
Vector2 ep = new Vector2(coordinateX + coordinateWidth, pY);
|
||||
DrawSplitLine(vh, xAxis, Axis.SplitLineType.Solid, sp, ep, m_ThemeInfo.tooltipLineColor);
|
||||
if (m_Tooltip.type == Tooltip.Type.Corss)
|
||||
{
|
||||
sp = new Vector2(coordinateX, m_Tooltip.pointerPos.y);
|
||||
ep = new Vector2(coordinateX + coordinateWidth, m_Tooltip.pointerPos.y);
|
||||
sp = new Vector2(coordinateX, m_Tooltip.runtimePointerPos.y);
|
||||
ep = new Vector2(coordinateX + coordinateWidth, m_Tooltip.runtimePointerPos.y);
|
||||
DrawSplitLine(vh, yAxis, Axis.SplitLineType.Dashed, sp, ep, m_ThemeInfo.tooltipLineColor);
|
||||
}
|
||||
break;
|
||||
case Tooltip.Type.Shadow:
|
||||
float tooltipSplitWid = splitWidth < 1 ? 1 : splitWidth;
|
||||
float pX = coordinateX + coordinateWidth;
|
||||
pY = coordinateY + splitWidth * m_Tooltip.yValues[i] -
|
||||
pY = coordinateY + splitWidth * m_Tooltip.runtimeYValues[i] -
|
||||
(yAxis.boundaryGap ? 0 : splitWidth / 2);
|
||||
Vector3 p1 = new Vector3(coordinateX, pY);
|
||||
Vector3 p2 = new Vector3(coordinateX, pY + tooltipSplitWid);
|
||||
@@ -1289,10 +1291,8 @@ namespace XCharts
|
||||
var start = coordinateX + coordinateWidth * m_DataZoom.start / 100;
|
||||
var end = coordinateX + coordinateWidth * m_DataZoom.end / 100;
|
||||
var hig = m_DataZoom.GetHeight(grid.bottom);
|
||||
m_DataZoom.startLabel.transform.localPosition =
|
||||
new Vector3(start - 10, m_DataZoom.bottom + hig / 2);
|
||||
m_DataZoom.endLabel.transform.localPosition =
|
||||
new Vector3(end + 10, m_DataZoom.bottom + hig / 2);
|
||||
m_DataZoom.UpdateStartLabelPosition(new Vector3(start - 10, m_DataZoom.bottom + hig / 2));
|
||||
m_DataZoom.UpdateEndLabelPosition(new Vector3(end + 10, m_DataZoom.bottom + hig / 2));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1313,19 +1313,19 @@ namespace XCharts
|
||||
if (isYAxis)
|
||||
{
|
||||
var xAxis = m_XAxises[serie.axisIndex];
|
||||
zeroPos = new Vector3(coordinateX + xAxis.zeroXOffset, coordinateY);
|
||||
zeroPos = new Vector3(coordinateX + xAxis.runtimeZeroXOffset, coordinateY);
|
||||
}
|
||||
else
|
||||
{
|
||||
var yAxis = m_YAxises[serie.axisIndex];
|
||||
zeroPos = new Vector3(coordinateX, coordinateY + yAxis.zeroYOffset);
|
||||
zeroPos = new Vector3(coordinateX, coordinateY + yAxis.runtimeZeroYOffset);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int j = 0; j < serie.data.Count; j++)
|
||||
{
|
||||
var serieData = serie.data[j];
|
||||
if (serie.label.show || serieData.showIcon)
|
||||
if (serie.label.show || serieData.iconStyle.show)
|
||||
{
|
||||
var pos = serie.dataPoints[j];
|
||||
var value = serieData.data[1];
|
||||
@@ -1348,6 +1348,7 @@ namespace XCharts
|
||||
}
|
||||
break;
|
||||
}
|
||||
m_RefreshLabel = true;
|
||||
serieData.labelPosition = pos;
|
||||
if (serie.label.show) DrawLabelBackground(vh, serie, serieData);
|
||||
}
|
||||
@@ -1372,6 +1373,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)
|
||||
|
||||
@@ -50,7 +50,7 @@ namespace XCharts
|
||||
seriesHig.Add(0);
|
||||
}
|
||||
float value = showData[i].data[1];
|
||||
float pX = seriesHig[i] + coordinateX + xAxis.zeroXOffset + yAxis.axisLine.width;
|
||||
float pX = seriesHig[i] + coordinateX + xAxis.runtimeZeroXOffset + yAxis.axisLine.width;
|
||||
float pY = coordinateY + +i * categoryWidth;
|
||||
if (!yAxis.boundaryGap) pY -= categoryWidth / 2;
|
||||
|
||||
@@ -64,8 +64,8 @@ namespace XCharts
|
||||
}
|
||||
else
|
||||
{
|
||||
valueTotal = xAxis.maxValue - xAxis.minValue;
|
||||
barHig = (xAxis.minValue > 0 ? value - xAxis.minValue : value)
|
||||
valueTotal = xAxis.runtimeMaxValue - xAxis.runtimeMinValue;
|
||||
barHig = (xAxis.runtimeMinValue > 0 ? value - xAxis.runtimeMinValue : value)
|
||||
/ valueTotal * coordinateWidth;
|
||||
seriesHig[i] += barHig;
|
||||
}
|
||||
@@ -160,7 +160,7 @@ namespace XCharts
|
||||
}
|
||||
float value = showData[i].data[1];
|
||||
float pX = coordinateX + i * categoryWidth;
|
||||
float zeroY = coordinateY + yAxis.zeroYOffset;
|
||||
float zeroY = coordinateY + yAxis.runtimeZeroYOffset;
|
||||
if (!xAxis.boundaryGap) pX -= categoryWidth / 2;
|
||||
float pY = seriesHig[i] + zeroY + xAxis.axisLine.width;
|
||||
|
||||
@@ -174,8 +174,8 @@ namespace XCharts
|
||||
}
|
||||
else
|
||||
{
|
||||
valueTotal = yAxis.maxValue - yAxis.minValue;
|
||||
barHig = (yAxis.minValue > 0 ? value - yAxis.minValue : value)
|
||||
valueTotal = yAxis.runtimeMaxValue - yAxis.runtimeMinValue;
|
||||
barHig = (yAxis.runtimeMinValue > 0 ? value - yAxis.runtimeMinValue : value)
|
||||
/ valueTotal * coordinateHeight;
|
||||
seriesHig[i] += barHig;
|
||||
}
|
||||
|
||||
@@ -24,9 +24,9 @@ namespace XCharts
|
||||
if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform,
|
||||
Input.mousePosition, canvas.worldCamera, out local))
|
||||
{
|
||||
if (m_VisualMap.rtSelectedIndex >= 0)
|
||||
if (m_VisualMap.runtimeSelectedIndex >= 0)
|
||||
{
|
||||
m_VisualMap.rtSelectedIndex = -1;
|
||||
m_VisualMap.runtimeSelectedIndex = -1;
|
||||
RefreshChart();
|
||||
}
|
||||
return;
|
||||
@@ -35,9 +35,9 @@ namespace XCharts
|
||||
local.y < 0 || local.y > chartHeight ||
|
||||
!m_VisualMap.IsInRangeRect(local, chartWidth, chartHeight))
|
||||
{
|
||||
if (m_VisualMap.rtSelectedIndex >= 0)
|
||||
if (m_VisualMap.runtimeSelectedIndex >= 0)
|
||||
{
|
||||
m_VisualMap.rtSelectedIndex = -1;
|
||||
m_VisualMap.runtimeSelectedIndex = -1;
|
||||
RefreshChart();
|
||||
}
|
||||
return;
|
||||
@@ -63,8 +63,8 @@ namespace XCharts
|
||||
selectedIndex = m_VisualMap.GetIndex(value);
|
||||
break;
|
||||
}
|
||||
m_VisualMap.rtSelectedValue = value;
|
||||
m_VisualMap.rtSelectedIndex = selectedIndex;
|
||||
m_VisualMap.runtimeSelectedValue = value;
|
||||
m_VisualMap.runtimeSelectedIndex = selectedIndex;
|
||||
RefreshChart();
|
||||
}
|
||||
|
||||
@@ -161,8 +161,8 @@ namespace XCharts
|
||||
}
|
||||
if(animationIndex>= 0 && i> animationIndex) continue;
|
||||
serieData.canShowLabel = true;
|
||||
var emphasis = (m_Tooltip.show && i == (int)m_Tooltip.xValues[0] && j == (int)m_Tooltip.yValues[0])
|
||||
|| m_VisualMap.rtSelectedIndex > 0;
|
||||
var emphasis = (m_Tooltip.show && i == (int)m_Tooltip.runtimeXValues[0] && j == (int)m_Tooltip.runtimeYValues[0])
|
||||
|| m_VisualMap.runtimeSelectedIndex > 0;
|
||||
var rectWid = xWidth - 2 * borderWidth;
|
||||
var rectHig = yWidth - 2 * borderWidth;
|
||||
ChartDrawer.DrawPolygon(vh, pos, rectWid / 2, rectHig / 2, color);
|
||||
@@ -199,10 +199,10 @@ namespace XCharts
|
||||
var halfHig = m_VisualMap.itemHeight / 2;
|
||||
var xRadius = 0f;
|
||||
var yRadius = 0f;
|
||||
var splitNum = m_VisualMap.rtInRange.Count;
|
||||
var splitNum = m_VisualMap.runtimeInRange.Count;
|
||||
var splitWid = m_VisualMap.itemHeight / (splitNum - 1);
|
||||
var isVertical = false;
|
||||
var colors = m_VisualMap.rtInRange;
|
||||
var colors = m_VisualMap.runtimeInRange;
|
||||
var triangeLen = m_Settings.visualMapTriangeLen;
|
||||
switch (m_VisualMap.orient)
|
||||
{
|
||||
@@ -215,13 +215,13 @@ namespace XCharts
|
||||
isVertical = false;
|
||||
if (m_VisualMap.calculable)
|
||||
{
|
||||
var p0 = pos1 + Vector3.right * m_VisualMap.rangeMinHeight;
|
||||
var p0 = pos1 + Vector3.right * m_VisualMap.runtimeRangeMinHeight;
|
||||
var p1 = p0 + Vector3.up * halfWid;
|
||||
var p2 = p0 + Vector3.up * (halfWid + triangeLen);
|
||||
var p3 = p2 + Vector3.left * triangeLen;
|
||||
var color = m_VisualMap.GetColor(m_VisualMap.rangeMin);
|
||||
ChartDrawer.DrawTriangle(vh, p1, p2, p3, color);
|
||||
p0 = pos1 + Vector3.right * m_VisualMap.rangeMaxHeight;
|
||||
p0 = pos1 + Vector3.right * m_VisualMap.runtimeRangeMaxHeight;
|
||||
p1 = p0 + Vector3.up * halfWid;
|
||||
p2 = p0 + Vector3.up * (halfWid + triangeLen);
|
||||
p3 = p2 + Vector3.right * triangeLen;
|
||||
@@ -238,13 +238,13 @@ namespace XCharts
|
||||
isVertical = true;
|
||||
if (m_VisualMap.calculable)
|
||||
{
|
||||
var p0 = pos1 + Vector3.up * m_VisualMap.rangeMinHeight;
|
||||
var p0 = pos1 + Vector3.up * m_VisualMap.runtimeRangeMinHeight;
|
||||
var p1 = p0 + Vector3.right * halfWid;
|
||||
var p2 = p0 + Vector3.right * (halfWid + triangeLen);
|
||||
var p3 = p2 + Vector3.down * triangeLen;
|
||||
var color = m_VisualMap.GetColor(m_VisualMap.rangeMin);
|
||||
ChartDrawer.DrawTriangle(vh, p1, p2, p3, color);
|
||||
p0 = pos1 + Vector3.up * m_VisualMap.rangeMaxHeight;
|
||||
p0 = pos1 + Vector3.up * m_VisualMap.runtimeRangeMaxHeight;
|
||||
p1 = p0 + Vector3.right * halfWid;
|
||||
p2 = p0 + Vector3.right * (halfWid + triangeLen);
|
||||
p3 = p2 + Vector3.up * triangeLen;
|
||||
@@ -276,7 +276,7 @@ namespace XCharts
|
||||
}
|
||||
else if (rangeMin > splitMin && rangeMax >= splitMax)
|
||||
{
|
||||
var p0 = pos1 + dir * m_VisualMap.rangeMinHeight;
|
||||
var p0 = pos1 + dir * m_VisualMap.runtimeRangeMinHeight;
|
||||
var splitMaxPos = pos1 + dir * i * splitWid;
|
||||
var splitPos = p0 + (splitMaxPos - p0) / 2;
|
||||
var startColor = m_VisualMap.GetColor(m_VisualMap.rangeMin);
|
||||
@@ -289,7 +289,7 @@ namespace XCharts
|
||||
}
|
||||
else if (rangeMax < splitMax && rangeMin <= splitMin)
|
||||
{
|
||||
var p0 = pos1 + dir * m_VisualMap.rangeMaxHeight;
|
||||
var p0 = pos1 + dir * m_VisualMap.runtimeRangeMaxHeight;
|
||||
var splitMinPos = pos1 + dir * (i - 1) * splitWid;
|
||||
var splitPos = splitMinPos + (p0 - splitMinPos) / 2;
|
||||
var startColor = colors[i - 1];
|
||||
@@ -302,8 +302,8 @@ namespace XCharts
|
||||
}
|
||||
else
|
||||
{
|
||||
var p0 = pos1 + dir * m_VisualMap.rangeMinHeight;
|
||||
var p1 = pos1 + dir * m_VisualMap.rangeMaxHeight;
|
||||
var p0 = pos1 + dir * m_VisualMap.runtimeRangeMinHeight;
|
||||
var p1 = pos1 + dir * m_VisualMap.runtimeRangeMaxHeight;
|
||||
var splitPos = (p0 + p1) / 2;
|
||||
var startColor = m_VisualMap.GetColor(m_VisualMap.rangeMin);
|
||||
var toColor = m_VisualMap.GetColor(m_VisualMap.rangeMax);
|
||||
@@ -328,38 +328,38 @@ namespace XCharts
|
||||
|
||||
if (m_VisualMap.rangeMin > m_VisualMap.min)
|
||||
{
|
||||
var p0 = pos1 + dir * m_VisualMap.rangeMinHeight;
|
||||
var p0 = pos1 + dir * m_VisualMap.runtimeRangeMinHeight;
|
||||
ChartDrawer.DrawPolygon(vh, pos1, p0, m_VisualMap.itemWidth / 2, m_ThemeInfo.visualMapBackgroundColor);
|
||||
}
|
||||
if (m_VisualMap.rangeMax < m_VisualMap.max)
|
||||
{
|
||||
var p1 = pos1 + dir * m_VisualMap.rangeMaxHeight;
|
||||
var p1 = pos1 + dir * m_VisualMap.runtimeRangeMaxHeight;
|
||||
ChartDrawer.DrawPolygon(vh, p1, pos2, m_VisualMap.itemWidth / 2, m_ThemeInfo.visualMapBackgroundColor);
|
||||
}
|
||||
|
||||
if (m_VisualMap.hoverLink)
|
||||
{
|
||||
if (m_VisualMap.rtSelectedIndex >= 0)
|
||||
if (m_VisualMap.runtimeSelectedIndex >= 0)
|
||||
{
|
||||
var p0 = pos1 + dir * m_VisualMap.rangeMinHeight;
|
||||
var p1 = pos1 + dir * m_VisualMap.rangeMaxHeight;
|
||||
var p0 = pos1 + dir * m_VisualMap.runtimeRangeMinHeight;
|
||||
var p1 = pos1 + dir * m_VisualMap.runtimeRangeMaxHeight;
|
||||
|
||||
if (m_VisualMap.orient == Orient.Vertical)
|
||||
{
|
||||
var p2 = new Vector3(centerPos.x + halfWid, Mathf.Clamp(pointerPos.y + (triangeLen / 2), p0.y, p1.y));
|
||||
var p3 = new Vector3(centerPos.x + halfWid, Mathf.Clamp(pointerPos.y - (triangeLen / 2), p0.y, p1.y));
|
||||
var p4 = new Vector3(centerPos.x + halfWid + triangeLen / 2, pointerPos.y);
|
||||
ChartDrawer.DrawTriangle(vh, p2, p3, p4, colors[m_VisualMap.rtSelectedIndex]);
|
||||
ChartDrawer.DrawTriangle(vh, p2, p3, p4, colors[m_VisualMap.runtimeSelectedIndex]);
|
||||
}
|
||||
else
|
||||
{
|
||||
var p2 = new Vector3(Mathf.Clamp(pointerPos.x + (triangeLen / 2), p0.x, p1.x), centerPos.y + halfWid);
|
||||
var p3 = new Vector3(Mathf.Clamp(pointerPos.x - (triangeLen / 2), p0.x, p1.x), centerPos.y + halfWid);
|
||||
var p4 = new Vector3(pointerPos.x, centerPos.y + halfWid + triangeLen / 2);
|
||||
ChartDrawer.DrawTriangle(vh, p2, p3, p4, colors[m_VisualMap.rtSelectedIndex]);
|
||||
ChartDrawer.DrawTriangle(vh, p2, p3, p4, colors[m_VisualMap.runtimeSelectedIndex]);
|
||||
}
|
||||
}
|
||||
else if (m_Tooltip.show && m_Tooltip.xValues[0] >= 0 && m_Tooltip.yValues[0] >= 0)
|
||||
else if (m_Tooltip.show && m_Tooltip.runtimeXValues[0] >= 0 && m_Tooltip.runtimeYValues[0] >= 0)
|
||||
{
|
||||
// var p0 = pos1 + dir * m_VisualMap.rangeMinHeight;
|
||||
// var p1 = pos1 + dir * m_VisualMap.rangeMaxHeight;
|
||||
|
||||
@@ -88,7 +88,7 @@ namespace XCharts
|
||||
Vector3 lp = Vector3.zero, np = Vector3.zero, llp = Vector3.zero, nnp = Vector3.zero;
|
||||
var yAxis = m_YAxises[serie.axisIndex];
|
||||
var xAxis = m_XAxises[serie.axisIndex];
|
||||
var zeroPos = new Vector3(coordinateX, coordinateY + yAxis.zeroYOffset);
|
||||
var zeroPos = new Vector3(coordinateX, coordinateY + yAxis.runtimeZeroYOffset);
|
||||
var isStack = m_Series.IsStack(serie.stack, SerieType.Line);
|
||||
if (!xAxis.show) xAxis = m_XAxises[(serie.axisIndex + 1) % m_XAxises.Count];
|
||||
float scaleWid = xAxis.GetDataWidth(coordinateWidth, showData.Count, m_DataZoom);
|
||||
@@ -168,7 +168,7 @@ namespace XCharts
|
||||
serie.ClearSmoothList(i);
|
||||
if (!serie.animation.NeedAnimation(i)) break;
|
||||
bool isFinish = true;
|
||||
if (serie.areaStyle.tooltipHighlight && m_Tooltip.show && i <= m_Tooltip.dataIndex[0])
|
||||
if (serie.areaStyle.tooltipHighlight && m_Tooltip.show && i <= m_Tooltip.runtimeDataIndex[0])
|
||||
{
|
||||
areaColor = highlightAreaColor;
|
||||
areaToColor = highlightAreaToColor;
|
||||
@@ -294,18 +294,18 @@ namespace XCharts
|
||||
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.maxValue - xAxis.minValue) <= 0) xDataHig = 0;
|
||||
else xDataHig = (xValue - xAxis.minValue) / (xAxis.maxValue - xAxis.minValue) * coordinateWidth;
|
||||
if ((yAxis.maxValue - yAxis.minValue) <= 0) yDataHig = 0;
|
||||
else yDataHig = (yValue - yAxis.minValue) / (yAxis.maxValue - yAxis.minValue) * coordinateHeight;
|
||||
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;
|
||||
np = new Vector3(pX + xDataHig, pY + yDataHig);
|
||||
}
|
||||
else
|
||||
{
|
||||
float pX = startX + i * scaleWid;
|
||||
float pY = serieHig + coordinateY + yAxis.axisLine.width;
|
||||
if ((yAxis.maxValue - yAxis.minValue) <= 0) yDataHig = 0;
|
||||
else yDataHig = (yValue - yAxis.minValue) / (yAxis.maxValue - yAxis.minValue) * coordinateHeight;
|
||||
if ((yAxis.runtimeMaxValue - yAxis.runtimeMinValue) <= 0) yDataHig = 0;
|
||||
else yDataHig = (yValue - yAxis.runtimeMinValue) / (yAxis.runtimeMaxValue - yAxis.runtimeMinValue) * coordinateHeight;
|
||||
np = new Vector3(pX, pY + yDataHig);
|
||||
}
|
||||
return yDataHig;
|
||||
@@ -327,7 +327,7 @@ namespace XCharts
|
||||
Color areaColor, areaToColor;
|
||||
var xAxis = m_XAxises[serie.axisIndex];
|
||||
var yAxis = m_YAxises[serie.axisIndex];
|
||||
var zeroPos = new Vector3(coordinateX + xAxis.zeroXOffset, coordinateY);
|
||||
var zeroPos = new Vector3(coordinateX + xAxis.runtimeZeroXOffset, coordinateY);
|
||||
var isStack = m_Series.IsStack(serie.stack, SerieType.Line);
|
||||
if (!yAxis.show) yAxis = m_YAxises[(serie.axisIndex + 1) % m_YAxises.Count];
|
||||
float scaleWid = yAxis.GetDataWidth(coordinateHeight, showData.Count, m_DataZoom);
|
||||
@@ -356,7 +356,7 @@ namespace XCharts
|
||||
float value = showData[i].data[1];
|
||||
float pY = startY + i * scaleWid;
|
||||
float pX = seriesHig[i] + coordinateX + yAxis.axisLine.width;
|
||||
float dataHig = (value - xAxis.minValue) / (xAxis.maxValue - xAxis.minValue) * coordinateWidth;
|
||||
float dataHig = (value - xAxis.runtimeMinValue) / (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) * coordinateWidth;
|
||||
np = new Vector3(pX + dataHig, pY);
|
||||
serie.dataPoints.Add(np);
|
||||
seriesHig[i] += dataHig;
|
||||
@@ -368,7 +368,7 @@ namespace XCharts
|
||||
float value = showData[i].data[1];
|
||||
float pY = startY + i * scaleWid;
|
||||
float pX = seriesHig[i] + coordinateX + yAxis.axisLine.width;
|
||||
float dataHig = (value - xAxis.minValue) / (xAxis.maxValue - xAxis.minValue) * coordinateWidth;
|
||||
float dataHig = (value - xAxis.runtimeMinValue) / (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) * coordinateWidth;
|
||||
np = new Vector3(pX + dataHig, pY);
|
||||
serie.dataPoints.Add(np);
|
||||
seriesHig[i] += dataHig;
|
||||
@@ -384,7 +384,7 @@ namespace XCharts
|
||||
serie.ClearSmoothList(i);
|
||||
if (!serie.animation.NeedAnimation(i)) break;
|
||||
bool isFinish = true;
|
||||
if (serie.areaStyle.tooltipHighlight && m_Tooltip.show && i < m_Tooltip.dataIndex[0])
|
||||
if (serie.areaStyle.tooltipHighlight && m_Tooltip.show && i < m_Tooltip.runtimeDataIndex[0])
|
||||
{
|
||||
areaColor = highlightAreaColor;
|
||||
areaToColor = highlightAreaToColor;
|
||||
|
||||
@@ -30,8 +30,8 @@ namespace XCharts
|
||||
float yValue = serieData.data[1];
|
||||
float pX = coordinateX + xAxis.axisLine.width;
|
||||
float pY = coordinateY + yAxis.axisLine.width;
|
||||
float xDataHig = (xValue - xAxis.minValue) / (xAxis.maxValue - xAxis.minValue) * coordinateWidth;
|
||||
float yDataHig = (yValue - yAxis.minValue) / (yAxis.maxValue - yAxis.minValue) * coordinateHeight;
|
||||
float xDataHig = (xValue - xAxis.runtimeMinValue) / (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) * coordinateWidth;
|
||||
float yDataHig = (yValue - yAxis.runtimeMinValue) / (yAxis.runtimeMaxValue - yAxis.runtimeMinValue) * coordinateHeight;
|
||||
var pos = new Vector3(pX + xDataHig, pY + yDataHig);
|
||||
|
||||
var datas = serie.data[n].data;
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using UnityEngine;
|
||||
using System;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
/// <summary>
|
||||
/// 支持从json格式的字符串中导入数据
|
||||
/// </summary>
|
||||
public class JsonDataSupport : IJsonData, ISerializationCallbackReceiver
|
||||
{
|
||||
[SerializeField] protected string m_JsonData;
|
||||
[SerializeField] protected bool m_DataFromJson;
|
||||
|
||||
/// <summary>
|
||||
/// json格式的字符串数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public string jsonData { get { return m_JsonData; } set { m_JsonData = value; ParseJsonData(value); } }
|
||||
|
||||
public void OnAfterDeserialize()
|
||||
{
|
||||
if (m_DataFromJson)
|
||||
{
|
||||
ParseJsonData(m_JsonData);
|
||||
m_DataFromJson = false;
|
||||
}
|
||||
}
|
||||
|
||||
public void OnBeforeSerialize()
|
||||
{
|
||||
}
|
||||
|
||||
public virtual void ParseJsonData(string json)
|
||||
{
|
||||
throw new Exception("no support yet");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,7 @@ using UnityEngine.Events;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
public class ObjectPool<T> where T : new()
|
||||
internal class ObjectPool<T> where T : new()
|
||||
{
|
||||
private readonly Stack<T> m_Stack = new Stack<T>();
|
||||
private readonly UnityAction<T> m_ActionOnGet;
|
||||
|
||||
60
Runtime/Internal/SerieLabelPool.cs
Normal file
60
Runtime/Internal/SerieLabelPool.cs
Normal file
@@ -0,0 +1,60 @@
|
||||
/******************************************/
|
||||
/* */
|
||||
/* Copyright (c) 2018 monitor1394 */
|
||||
/* https://github.com/monitor1394 */
|
||||
/* */
|
||||
/******************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
internal static class SerieLabelPool
|
||||
{
|
||||
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)
|
||||
{
|
||||
GameObject element;
|
||||
if (m_Stack.Count == 0 || !Application.isPlaying)
|
||||
{
|
||||
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);
|
||||
}
|
||||
else
|
||||
{
|
||||
element = m_Stack.Pop();
|
||||
element.name = name;
|
||||
element.transform.SetParent(parent);
|
||||
ChartHelper.SetActive(element, true);
|
||||
}
|
||||
return element;
|
||||
}
|
||||
|
||||
public static void Release(GameObject element)
|
||||
{
|
||||
ChartHelper.SetActive(element, false);
|
||||
//if (m_Stack.Count > 0 && ReferenceEquals(m_Stack.Peek(), element))
|
||||
// Debug.LogError("Internal error. Trying to destroy object that is already released to pool." + element.name);
|
||||
if (Application.isPlaying)
|
||||
m_Stack.Push(element);
|
||||
}
|
||||
|
||||
public static void ReleaseAll(Transform parent)
|
||||
{
|
||||
int count = parent.childCount;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
Release(parent.GetChild(i).gameObject);
|
||||
}
|
||||
}
|
||||
|
||||
public static void ClearAll()
|
||||
{
|
||||
m_Stack.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Runtime/Internal/SerieLabelPool.cs.meta
Normal file
11
Runtime/Internal/SerieLabelPool.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 340f267fa46e74d0bbbb0b75a20bd708
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -65,8 +65,8 @@ namespace XCharts
|
||||
}
|
||||
bool isFinish = true;
|
||||
if (serie.pieClickOffset) isClickOffset = true;
|
||||
serie.pieDataMax = serie.yMax;
|
||||
serie.pieDataTotal = serie.yTotal;
|
||||
serie.runtimePieDataMax = serie.yMax;
|
||||
serie.runtimePieDataTotal = serie.yTotal;
|
||||
UpdatePieCenter(serie);
|
||||
|
||||
float totalDegree = 360;
|
||||
@@ -85,73 +85,73 @@ namespace XCharts
|
||||
float value = serieData.data[1];
|
||||
serieNameCount = m_LegendRealShowName.IndexOf(serieData.legendName);
|
||||
Color color = m_ThemeInfo.GetColor(serieNameCount);
|
||||
serieData.pieStartAngle = startDegree;
|
||||
serieData.pieToAngle = startDegree;
|
||||
serieData.pieHalfAngle = startDegree;
|
||||
serieData.pieCurrAngle = startDegree;
|
||||
serieData.runtimePieStartAngle = startDegree;
|
||||
serieData.runtimePieToAngle = startDegree;
|
||||
serieData.runtimePieHalfAngle = startDegree;
|
||||
serieData.runtimePieCurrAngle = startDegree;
|
||||
if (!serieData.show)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
float degree = serie.pieRoseType == RoseType.Area ?
|
||||
(totalDegree / showdataCount) : (totalDegree * value / serie.pieDataTotal);
|
||||
serieData.pieToAngle = startDegree + degree;
|
||||
(totalDegree / showdataCount) : (totalDegree * value / serie.runtimePieDataTotal);
|
||||
serieData.runtimePieToAngle = startDegree + degree;
|
||||
|
||||
serieData.pieOutsideRadius = serie.pieRoseType > 0 ?
|
||||
serie.pieInsideRadius + (serie.pieOutsideRadius - serie.pieInsideRadius) * value / serie.pieDataMax :
|
||||
serie.pieOutsideRadius;
|
||||
serieData.runtimePieOutsideRadius = serie.pieRoseType > 0 ?
|
||||
serie.runtimePieInsideRadius + (serie.runtimePieOutsideRadius - serie.runtimePieInsideRadius) * value / serie.runtimePieDataMax :
|
||||
serie.runtimePieOutsideRadius;
|
||||
if (serieData.highlighted)
|
||||
{
|
||||
isDataHighlight = true;
|
||||
color *= 1.2f;
|
||||
serieData.pieOutsideRadius += m_Settings.pieTooltipExtraRadius;
|
||||
serieData.runtimePieOutsideRadius += m_Settings.pieTooltipExtraRadius;
|
||||
}
|
||||
var offset = serie.pieSpace;
|
||||
if (serie.pieClickOffset && serieData.selected)
|
||||
{
|
||||
offset += m_Settings.pieSelectedOffset;
|
||||
}
|
||||
var halfDegree = (serieData.pieToAngle - startDegree) / 2;
|
||||
serieData.pieHalfAngle = startDegree + halfDegree;
|
||||
float currRad = serieData.pieHalfAngle * Mathf.Deg2Rad;
|
||||
var halfDegree = (serieData.runtimePieToAngle - startDegree) / 2;
|
||||
serieData.runtimePieHalfAngle = startDegree + halfDegree;
|
||||
float currRad = serieData.runtimePieHalfAngle * Mathf.Deg2Rad;
|
||||
float currSin = Mathf.Sin(currRad);
|
||||
float currCos = Mathf.Cos(currRad);
|
||||
var center = serie.pieCenterPos;
|
||||
var center = serie.runtimePieCenterPos;
|
||||
|
||||
serieData.pieCurrAngle = serieData.pieToAngle;
|
||||
serieData.pieOffsetCenter = center;
|
||||
serieData.pieInsideRadius = serie.pieInsideRadius;
|
||||
if (serie.animation.CheckDetailBreak(n, serieData.pieToAngle))
|
||||
serieData.runtimePieCurrAngle = serieData.runtimePieToAngle;
|
||||
serieData.runtiemPieOffsetCenter = center;
|
||||
serieData.runtimePieInsideRadius = serie.runtimePieInsideRadius;
|
||||
if (serie.animation.CheckDetailBreak(n, serieData.runtimePieToAngle))
|
||||
{
|
||||
isFinish = false;
|
||||
serieData.pieCurrAngle = serie.animation.GetCurrDetail();
|
||||
serieData.runtimePieCurrAngle = serie.animation.GetCurrDetail();
|
||||
}
|
||||
if (offset > 0)
|
||||
{
|
||||
serieData.pieOffsetRadius = serie.pieSpace / Mathf.Sin(halfDegree * Mathf.Deg2Rad);
|
||||
serieData.pieInsideRadius -= serieData.pieOffsetRadius;
|
||||
serieData.pieOutsideRadius -= serieData.pieOffsetRadius;
|
||||
serieData.runtimePieOffsetRadius = serie.pieSpace / Mathf.Sin(halfDegree * Mathf.Deg2Rad);
|
||||
serieData.runtimePieInsideRadius -= serieData.runtimePieOffsetRadius;
|
||||
serieData.runtimePieOutsideRadius -= serieData.runtimePieOffsetRadius;
|
||||
if (serie.pieClickOffset && serieData.selected)
|
||||
{
|
||||
serieData.pieOffsetRadius += m_Settings.pieSelectedOffset;
|
||||
if (serieData.pieInsideRadius > 0) serieData.pieInsideRadius += m_Settings.pieSelectedOffset;
|
||||
serieData.pieOutsideRadius += m_Settings.pieSelectedOffset;
|
||||
serieData.runtimePieOffsetRadius += m_Settings.pieSelectedOffset;
|
||||
if (serieData.runtimePieInsideRadius > 0) serieData.runtimePieInsideRadius += m_Settings.pieSelectedOffset;
|
||||
serieData.runtimePieOutsideRadius += m_Settings.pieSelectedOffset;
|
||||
}
|
||||
|
||||
serieData.pieOffsetCenter = new Vector3(center.x + serieData.pieOffsetRadius * currSin,
|
||||
center.y + serieData.pieOffsetRadius * currCos);
|
||||
serieData.runtiemPieOffsetCenter = new Vector3(center.x + serieData.runtimePieOffsetRadius * currSin,
|
||||
center.y + serieData.runtimePieOffsetRadius * currCos);
|
||||
|
||||
ChartDrawer.DrawDoughnut(vh, serieData.pieOffsetCenter, serieData.pieInsideRadius, serieData.pieOutsideRadius,
|
||||
color, m_ThemeInfo.backgroundColor, m_Settings.cicleSmoothness, startDegree, serieData.pieCurrAngle);
|
||||
ChartDrawer.DrawDoughnut(vh, serieData.runtiemPieOffsetCenter, serieData.runtimePieInsideRadius, serieData.runtimePieOutsideRadius,
|
||||
color, m_ThemeInfo.backgroundColor, m_Settings.cicleSmoothness, startDegree, serieData.runtimePieCurrAngle);
|
||||
}
|
||||
else
|
||||
{
|
||||
ChartDrawer.DrawDoughnut(vh, center, serieData.pieInsideRadius, serieData.pieOutsideRadius,
|
||||
color, m_ThemeInfo.backgroundColor, m_Settings.cicleSmoothness, startDegree, serieData.pieCurrAngle);
|
||||
ChartDrawer.DrawDoughnut(vh, center, serieData.runtimePieInsideRadius, serieData.runtimePieOutsideRadius,
|
||||
color, m_ThemeInfo.backgroundColor, m_Settings.cicleSmoothness, startDegree, serieData.runtimePieCurrAngle);
|
||||
}
|
||||
serieData.canShowLabel = serieData.pieCurrAngle >= serieData.pieHalfAngle;
|
||||
serieData.canShowLabel = serieData.runtimePieCurrAngle >= serieData.runtimePieHalfAngle;
|
||||
isDrawPie = true;
|
||||
startDegree = serieData.pieToAngle;
|
||||
startDegree = serieData.runtimePieToAngle;
|
||||
if (isFinish) serie.animation.SetDataFinish(n);
|
||||
else break;
|
||||
}
|
||||
@@ -213,18 +213,20 @@ namespace XCharts
|
||||
&& serie.label.position == SerieLabel.Position.Outside
|
||||
&& serie.label.line)
|
||||
{
|
||||
var insideRadius = serieData.pieInsideRadius;
|
||||
var outSideRadius = serieData.pieOutsideRadius;
|
||||
var center = serie.pieCenterPos;
|
||||
var currAngle = serieData.pieHalfAngle;
|
||||
var insideRadius = serieData.runtimePieInsideRadius;
|
||||
var outSideRadius = serieData.runtimePieOutsideRadius;
|
||||
var center = serie.runtimePieCenterPos;
|
||||
var currAngle = serieData.runtimePieHalfAngle;
|
||||
if (serie.label.lineColor != Color.clear) color = serie.label.lineColor;
|
||||
else if (serie.label.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.pieOutsideRadius : outSideRadius;
|
||||
var radius2 = serie.pieOutsideRadius + serie.label.lineLength1;
|
||||
serie.runtimePieOutsideRadius : outSideRadius;
|
||||
var radius2 = serie.runtimePieOutsideRadius + serie.label.lineLength1;
|
||||
var radius3 = insideRadius + (outSideRadius - insideRadius) / 2;
|
||||
if (radius1 < serie.runtimePieInsideRadius) radius1 = serie.runtimePieInsideRadius;
|
||||
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);
|
||||
@@ -332,10 +334,10 @@ namespace XCharts
|
||||
private void DrawLabel(Serie serie, int dataIndex, SerieData serieData, Color serieColor)
|
||||
{
|
||||
if (serieData.labelText == null) return;
|
||||
var currAngle = serieData.pieHalfAngle;
|
||||
var currAngle = serieData.runtimePieHalfAngle;
|
||||
var isHighlight = (serieData.highlighted && serie.emphasis.label.show);
|
||||
var showLabel = ((serie.label.show || isHighlight) && serieData.canShowLabel);
|
||||
if (showLabel || serieData.showIcon)
|
||||
if (showLabel || serieData.iconStyle.show)
|
||||
{
|
||||
serieData.SetLabelActive(showLabel);
|
||||
float rotate = 0;
|
||||
@@ -387,30 +389,31 @@ namespace XCharts
|
||||
|
||||
protected void UpdateLabelPostion(Serie serie, SerieData serieData)
|
||||
{
|
||||
var currAngle = serieData.pieHalfAngle;
|
||||
if (serieData.labelText == null) return;
|
||||
var currAngle = serieData.runtimePieHalfAngle;
|
||||
var currRad = currAngle * Mathf.Deg2Rad;
|
||||
var offsetRadius = serieData.pieOffsetRadius;
|
||||
var insideRadius = serieData.pieInsideRadius;
|
||||
var outsideRadius = serieData.pieOutsideRadius;
|
||||
var offsetRadius = serieData.runtimePieOffsetRadius;
|
||||
var insideRadius = serieData.runtimePieInsideRadius;
|
||||
var outsideRadius = serieData.runtimePieOutsideRadius;
|
||||
switch (serie.label.position)
|
||||
{
|
||||
case SerieLabel.Position.Center:
|
||||
serieData.labelPosition = serie.pieCenterPos;
|
||||
serieData.labelPosition = serie.runtimePieCenterPos;
|
||||
break;
|
||||
case SerieLabel.Position.Inside:
|
||||
var labelRadius = offsetRadius + insideRadius + (outsideRadius - insideRadius) / 2;
|
||||
var labelCenter = new Vector2(serie.pieCenterPos.x + labelRadius * Mathf.Sin(currRad),
|
||||
serie.pieCenterPos.y + labelRadius * Mathf.Cos(currRad));
|
||||
var labelCenter = new Vector2(serie.runtimePieCenterPos.x + labelRadius * Mathf.Sin(currRad),
|
||||
serie.runtimePieCenterPos.y + labelRadius * Mathf.Cos(currRad));
|
||||
serieData.labelPosition = labelCenter;
|
||||
break;
|
||||
case SerieLabel.Position.Outside:
|
||||
if (serie.label.lineType == SerieLabel.LineType.HorizontalLine)
|
||||
{
|
||||
var radius1 = serie.pieOutsideRadius;
|
||||
var radius1 = serie.runtimePieOutsideRadius;
|
||||
var radius3 = insideRadius + (outsideRadius - insideRadius) / 2;
|
||||
var currSin = Mathf.Sin(currRad);
|
||||
var currCos = Mathf.Cos(currRad);
|
||||
var pos0 = new Vector3(serie.pieCenterPos.x + radius3 * currSin, serie.pieCenterPos.y + radius3 * currCos);
|
||||
var pos0 = new Vector3(serie.runtimePieCenterPos.x + radius3 * currSin, serie.runtimePieCenterPos.y + radius3 * currCos);
|
||||
if (currAngle > 180)
|
||||
{
|
||||
currSin = Mathf.Sin((360 - currAngle) * Mathf.Deg2Rad);
|
||||
@@ -423,9 +426,9 @@ namespace XCharts
|
||||
}
|
||||
else
|
||||
{
|
||||
labelRadius = serie.pieOutsideRadius + serie.label.lineLength1;
|
||||
labelCenter = new Vector2(serie.pieCenterPos.x + labelRadius * Mathf.Sin(currRad),
|
||||
serie.pieCenterPos.y + labelRadius * Mathf.Cos(currRad));
|
||||
labelRadius = serie.runtimePieOutsideRadius + serie.label.lineLength1;
|
||||
labelCenter = new Vector2(serie.runtimePieCenterPos.x + labelRadius * Mathf.Sin(currRad),
|
||||
serie.runtimePieCenterPos.y + labelRadius * Mathf.Cos(currRad));
|
||||
float labelWidth = serieData.labelText.preferredWidth;
|
||||
if (currAngle > 180)
|
||||
{
|
||||
@@ -467,21 +470,21 @@ namespace XCharts
|
||||
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.pieCenterPos = new Vector2(centerX, centerY);
|
||||
serie.runtimePieCenterPos = new Vector2(centerX, centerY);
|
||||
var minWidth = Mathf.Min(chartWidth, chartHeight);
|
||||
serie.pieInsideRadius = serie.pieRadius[0] <= 1 ? minWidth * serie.pieRadius[0] : serie.pieRadius[0];
|
||||
serie.pieOutsideRadius = serie.pieRadius[1] <= 1 ? minWidth * serie.pieRadius[1] : serie.pieRadius[1];
|
||||
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;
|
||||
m_Tooltip.dataIndex.Clear();
|
||||
m_Tooltip.runtimeDataIndex.Clear();
|
||||
bool selected = false;
|
||||
foreach (var serie in m_Series.list)
|
||||
{
|
||||
int index = GetPosPieIndex(serie, local);
|
||||
m_Tooltip.dataIndex.Add(index);
|
||||
m_Tooltip.runtimeDataIndex.Add(index);
|
||||
if (serie.type != SerieType.Pie) continue;
|
||||
bool refresh = false;
|
||||
for (int j = 0; j < serie.data.Count; j++)
|
||||
@@ -508,14 +511,14 @@ namespace XCharts
|
||||
private int GetPosPieIndex(Serie serie, Vector2 local)
|
||||
{
|
||||
if (serie.type != SerieType.Pie) return -1;
|
||||
var dist = Vector2.Distance(local, serie.pieCenterPos);
|
||||
if (dist < serie.pieInsideRadius || dist > serie.pieOutsideRadius) return -1;
|
||||
Vector2 dir = local - new Vector2(serie.pieCenterPos.x, serie.pieCenterPos.y);
|
||||
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);
|
||||
float angle = VectorAngle(Vector2.up, dir);
|
||||
for (int i = 0; i < serie.data.Count; i++)
|
||||
{
|
||||
var serieData = serie.data[i];
|
||||
if (angle >= serieData.pieStartAngle && angle <= serieData.pieToAngle)
|
||||
if (angle >= serieData.runtimePieStartAngle && angle <= serieData.runtimePieToAngle)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
@@ -541,7 +544,7 @@ namespace XCharts
|
||||
bool showTooltip = false;
|
||||
foreach (var serie in m_Series.list)
|
||||
{
|
||||
int index = m_Tooltip.dataIndex[serie.index];
|
||||
int index = m_Tooltip.runtimeDataIndex[serie.index];
|
||||
if (index < 0) continue;
|
||||
showTooltip = true;
|
||||
if (string.IsNullOrEmpty(tooltip.formatter))
|
||||
@@ -565,13 +568,13 @@ namespace XCharts
|
||||
}
|
||||
|
||||
var pos = m_Tooltip.GetContentPos();
|
||||
if (pos.x + m_Tooltip.width > chartWidth)
|
||||
if (pos.x + m_Tooltip.runtimeWidth > chartWidth)
|
||||
{
|
||||
pos.x = chartWidth - m_Tooltip.width;
|
||||
pos.x = chartWidth - m_Tooltip.runtimeWidth;
|
||||
}
|
||||
if (pos.y - m_Tooltip.height < 0)
|
||||
if (pos.y - m_Tooltip.runtimeHeight < 0)
|
||||
{
|
||||
pos.y = m_Tooltip.height;
|
||||
pos.y = m_Tooltip.runtimeHeight;
|
||||
}
|
||||
m_Tooltip.UpdateContentPos(pos);
|
||||
}
|
||||
|
||||
@@ -20,12 +20,10 @@ namespace XCharts
|
||||
{
|
||||
private const string INDICATOR_TEXT = "indicator";
|
||||
|
||||
//[SerializeField] private Radar radar = Radar.defaultRadar;
|
||||
[SerializeField] private List<Radar> m_Radars = new List<Radar>();
|
||||
private List<Radar> m_CheckRadars = new List<Radar>();
|
||||
private bool m_IsEnterLegendButtom;
|
||||
|
||||
//public Radar radar { get { return radar; } }
|
||||
public List<Radar> radars { get { return m_Radars; } }
|
||||
|
||||
/// <summary>
|
||||
@@ -110,30 +108,31 @@ namespace XCharts
|
||||
var indicator = radar.indicatorList[i];
|
||||
var pos = radar.GetIndicatorPosition(i);
|
||||
TextAnchor anchor = TextAnchor.MiddleCenter;
|
||||
var diff = pos.x - radar.centerPos.x;
|
||||
if (diff < -1f)
|
||||
var textStyle = indicator.textStyle;
|
||||
var textColor = textStyle.color == Color.clear ? (Color)m_ThemeInfo.axisTextColor : textStyle.color;
|
||||
var txt = ChartHelper.AddTextObject(INDICATOR_TEXT + "_" + n + "_" + i, transform, m_ThemeInfo.font,
|
||||
textColor, anchor, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f),
|
||||
new Vector2(txtWid, txtHig), textStyle.fontSize, textStyle.rotate, textStyle.fontStyle);
|
||||
txt.text = radar.indicatorList[i].name;
|
||||
txt.gameObject.SetActive(radar.indicator);
|
||||
var txtWidth = txt.preferredWidth;
|
||||
var sizeDelta = new Vector2(txt.preferredWidth, txt.preferredHeight);
|
||||
txt.GetComponent<RectTransform>().sizeDelta = sizeDelta;
|
||||
var diff = pos.x - radar.runtimeCenterPos.x;
|
||||
if (diff < -1f) //left
|
||||
{
|
||||
pos = new Vector3(pos.x - 5, pos.y);
|
||||
anchor = TextAnchor.MiddleRight;
|
||||
pos = new Vector3(pos.x - txtWidth / 2, pos.y);
|
||||
}
|
||||
else if (diff > 1f)
|
||||
else if (diff > 1f) //right
|
||||
{
|
||||
anchor = TextAnchor.MiddleLeft;
|
||||
pos = new Vector3(pos.x + txtWid + 5, pos.y);
|
||||
pos = new Vector3(pos.x + txtWidth / 2, pos.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
anchor = TextAnchor.MiddleCenter;
|
||||
float y = pos.y > radar.centerPos.y ? pos.y + txtHig / 2 : pos.y - txtHig / 2;
|
||||
pos = new Vector3(pos.x + txtWid / 2, y);
|
||||
float y = pos.y > radar.runtimeCenterPos.y ? pos.y + txtHig / 2 : pos.y - txtHig / 2;
|
||||
pos = new Vector3(pos.x, y);
|
||||
}
|
||||
var textColor = indicator.color == Color.clear ? (Color)m_ThemeInfo.axisTextColor : indicator.color;
|
||||
Text txt = ChartHelper.AddTextObject(INDICATOR_TEXT + "_" + n + "_" + i, transform, m_ThemeInfo.font,
|
||||
textColor, anchor, Vector2.zero, Vector2.zero, new Vector2(1, 0.5f),
|
||||
new Vector2(txtWid, txtHig));
|
||||
txt.transform.localPosition = pos;
|
||||
txt.text = radar.indicatorList[i].name;
|
||||
txt.gameObject.SetActive(radar.indicator);
|
||||
txt.transform.localPosition = pos + new Vector3(textStyle.offset.x, textStyle.offset.y);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -212,7 +211,7 @@ namespace XCharts
|
||||
var radar = m_Radars[serie.radarIndex];
|
||||
int indicatorNum = radar.indicatorList.Count;
|
||||
var angle = 2 * Mathf.PI / indicatorNum;
|
||||
Vector3 p = radar.centerPos;
|
||||
Vector3 p = radar.runtimeCenterPos;
|
||||
serie.animation.InitProgress(1, 0, 1);
|
||||
if (!IsActive(i))
|
||||
{
|
||||
@@ -223,13 +222,13 @@ namespace XCharts
|
||||
{
|
||||
var serieData = serie.data[j];
|
||||
int key = i * 100 + j;
|
||||
if (!radar.dataPosList.ContainsKey(key))
|
||||
if (!radar.runtimeDataPosList.ContainsKey(key))
|
||||
{
|
||||
radar.dataPosList.Add(i * 100 + j, new List<Vector3>(serieData.data.Count));
|
||||
radar.runtimeDataPosList.Add(i * 100 + j, new List<Vector3>(serieData.data.Count));
|
||||
}
|
||||
else
|
||||
{
|
||||
radar.dataPosList[key].Clear();
|
||||
radar.runtimeDataPosList[key].Clear();
|
||||
}
|
||||
string dataName = serieData.name;
|
||||
int serieIndex = 0;
|
||||
@@ -253,11 +252,11 @@ namespace XCharts
|
||||
continue;
|
||||
}
|
||||
var isHighlight = serie.highlighted || serieData.highlighted ||
|
||||
(m_Tooltip.show && m_Tooltip.dataIndex[0] == i && m_Tooltip.dataIndex[1] == j);
|
||||
(m_Tooltip.show && m_Tooltip.runtimeDataIndex[0] == i && m_Tooltip.runtimeDataIndex[1] == j);
|
||||
var areaColor = serie.GetAreaColor(m_ThemeInfo, serieIndex, isHighlight);
|
||||
var lineColor = serie.GetLineColor(m_ThemeInfo, serieIndex, isHighlight);
|
||||
int dataCount = radar.indicatorList.Count;
|
||||
List<Vector3> pointList = radar.dataPosList[key];
|
||||
List<Vector3> pointList = radar.runtimeDataPosList[key];
|
||||
for (int n = 0; n < dataCount; n++)
|
||||
{
|
||||
if (n >= serieData.data.Count) break;
|
||||
@@ -269,9 +268,9 @@ namespace XCharts
|
||||
serie.GetMinMaxData(n, out min, out max);
|
||||
min = radar.GetIndicatorMin(n);
|
||||
}
|
||||
var radius = max < 0 ? radar.actualRadius - radar.actualRadius * value / max
|
||||
: radar.actualRadius * value / max;
|
||||
var currAngle = n * angle;
|
||||
var radius = max < 0 ? radar.runtimeDataRadius - radar.runtimeDataRadius * value / max
|
||||
: radar.runtimeDataRadius * value / max;
|
||||
var currAngle = (n + (radar.positionType == Radar.PositionType.Between ? 0.5f : 0)) * angle;
|
||||
radius *= rate;
|
||||
if (n == 0)
|
||||
{
|
||||
@@ -331,10 +330,10 @@ namespace XCharts
|
||||
return;
|
||||
}
|
||||
float insideRadius = 0, outsideRadius = 0;
|
||||
float block = radar.actualRadius / radar.splitNumber;
|
||||
float block = radar.runtimeRadius / radar.splitNumber;
|
||||
int indicatorNum = radar.indicatorList.Count;
|
||||
Vector3 p1, p2, p3, p4;
|
||||
Vector3 p = radar.centerPos;
|
||||
Vector3 p = radar.runtimeCenterPos;
|
||||
float angle = 2 * Mathf.PI / indicatorNum;
|
||||
var lineColor = GetLineColor(radar);
|
||||
for (int i = 0; i < radar.splitNumber; i++)
|
||||
@@ -382,9 +381,9 @@ namespace XCharts
|
||||
return;
|
||||
}
|
||||
float insideRadius = 0, outsideRadius = 0;
|
||||
float block = radar.actualRadius / radar.splitNumber;
|
||||
float block = radar.runtimeRadius / radar.splitNumber;
|
||||
int indicatorNum = radar.indicatorList.Count;
|
||||
Vector3 p = radar.centerPos;
|
||||
Vector3 p = radar.runtimeCenterPos;
|
||||
Vector3 p1;
|
||||
float angle = 2 * Mathf.PI / indicatorNum;
|
||||
var lineColor = GetLineColor(radar);
|
||||
@@ -443,23 +442,23 @@ namespace XCharts
|
||||
if (!IsActive(i)) continue;
|
||||
var serie = m_Series.GetSerie(i);
|
||||
var radar = m_Radars[serie.radarIndex];
|
||||
var dist = Vector2.Distance(radar.centerPos, local);
|
||||
if (dist > radar.actualRadius + serie.symbol.size)
|
||||
var dist = Vector2.Distance(radar.runtimeCenterPos, local);
|
||||
if (dist > radar.runtimeRadius + serie.symbol.size)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
for (int n = 0; n < serie.data.Count; n++)
|
||||
{
|
||||
var posKey = i * 100 + n;
|
||||
if (radar.dataPosList.ContainsKey(posKey))
|
||||
if (radar.runtimeDataPosList.ContainsKey(posKey))
|
||||
{
|
||||
var posList = radar.dataPosList[posKey];
|
||||
var posList = radar.runtimeDataPosList[posKey];
|
||||
foreach (var pos in posList)
|
||||
{
|
||||
if (Vector2.Distance(pos, local) <= serie.symbol.size * 1.2f)
|
||||
{
|
||||
m_Tooltip.dataIndex[0] = i;
|
||||
m_Tooltip.dataIndex[1] = n;
|
||||
m_Tooltip.runtimeDataIndex[0] = i;
|
||||
m_Tooltip.runtimeDataIndex[1] = n;
|
||||
highlight = true;
|
||||
break;
|
||||
}
|
||||
@@ -487,7 +486,7 @@ namespace XCharts
|
||||
protected override void RefreshTooltip()
|
||||
{
|
||||
base.RefreshTooltip();
|
||||
int serieIndex = m_Tooltip.dataIndex[0];
|
||||
int serieIndex = m_Tooltip.runtimeDataIndex[0];
|
||||
if (serieIndex < 0)
|
||||
{
|
||||
if (m_Tooltip.IsActive())
|
||||
@@ -500,7 +499,7 @@ namespace XCharts
|
||||
m_Tooltip.SetActive(true);
|
||||
var serie = m_Series.GetSerie(serieIndex);
|
||||
var radar = m_Radars[serie.radarIndex];
|
||||
var serieData = serie.GetSerieData(m_Tooltip.dataIndex[1]);
|
||||
var serieData = serie.GetSerieData(m_Tooltip.runtimeDataIndex[1]);
|
||||
StringBuilder sb = new StringBuilder(serieData.name);
|
||||
for (int i = 0; i < radar.indicatorList.Count; i++)
|
||||
{
|
||||
@@ -511,13 +510,13 @@ namespace XCharts
|
||||
}
|
||||
m_Tooltip.UpdateContentText(sb.ToString());
|
||||
var pos = m_Tooltip.GetContentPos();
|
||||
if (pos.x + m_Tooltip.width > chartWidth)
|
||||
if (pos.x + m_Tooltip.runtimeWidth > chartWidth)
|
||||
{
|
||||
pos.x = chartWidth - m_Tooltip.width;
|
||||
pos.x = chartWidth - m_Tooltip.runtimeWidth;
|
||||
}
|
||||
if (pos.y - m_Tooltip.height < 0)
|
||||
if (pos.y - m_Tooltip.runtimeHeight < 0)
|
||||
{
|
||||
pos.y = m_Tooltip.height;
|
||||
pos.y = m_Tooltip.runtimeHeight;
|
||||
}
|
||||
m_Tooltip.UpdateContentPos(pos);
|
||||
}
|
||||
|
||||
@@ -23,6 +23,10 @@ namespace XCharts
|
||||
private static Dictionary<int, string> s_IntToStr = new Dictionary<int, string>(1000);
|
||||
private static Dictionary<int, string> s_IntToFn = new Dictionary<int, string>(20);
|
||||
private static Dictionary<Color, string> s_ColorToStr = new Dictionary<Color, string>(1000);
|
||||
private static Dictionary<int, string> s_SerieLabelName = new Dictionary<int, string>(1000);
|
||||
private static Dictionary<int, string> s_AxisLabelName = new Dictionary<int, string>(1000);
|
||||
|
||||
|
||||
|
||||
public static string FloatToStr(float value, int f = 0, bool forceE = false)
|
||||
{
|
||||
@@ -83,5 +87,35 @@ namespace XCharts
|
||||
return s_ColorToStr[color];
|
||||
}
|
||||
}
|
||||
|
||||
internal static string GetSerieLabelName(string prefix, int i, int j)
|
||||
{
|
||||
int key = i * 10000000 + j;
|
||||
if (s_SerieLabelName.ContainsKey(key))
|
||||
{
|
||||
return s_SerieLabelName[key];
|
||||
}
|
||||
else
|
||||
{
|
||||
string name = prefix + "_" + i + "_" + j;
|
||||
s_SerieLabelName[key] = name;
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
internal static string GetAxisLabelName(string prefix, bool isYAxis,int axisIndex, int i)
|
||||
{
|
||||
int key = (isYAxis?2:1) * 1000000 + (axisIndex+1) * 100000 + i;
|
||||
if (s_AxisLabelName.ContainsKey(key))
|
||||
{
|
||||
return s_AxisLabelName[key];
|
||||
}
|
||||
else
|
||||
{
|
||||
string name = prefix + "_" + axisIndex + "_" + i;
|
||||
s_AxisLabelName[key] = name;
|
||||
return name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,9 @@ using System.Text.RegularExpressions;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityEngine.UI;
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
#endif
|
||||
|
||||
namespace XCharts
|
||||
{
|
||||
@@ -72,13 +75,22 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
public static void DestoryAllChilds(Transform parent)
|
||||
public static void DestroyAllChildren(Transform parent)
|
||||
{
|
||||
if (parent == null) return;
|
||||
#if UNITY_EDITOR && UNITY_2018_3_OR_NEWER
|
||||
if (PrefabUtility.IsPartOfAnyPrefab(parent.gameObject))
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
while (parent.childCount > 0)
|
||||
{
|
||||
var go = parent.GetChild(0);
|
||||
if (go.childCount > 0) DestoryAllChilds(go);
|
||||
else GameObject.DestroyImmediate(go.gameObject);
|
||||
if (go != null)
|
||||
{
|
||||
GameObject.DestroyImmediate(go.gameObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,15 +156,13 @@ namespace XCharts
|
||||
Text txt = GetOrAddComponent<Text>(txtObj);
|
||||
txt.font = font;
|
||||
txt.fontSize = fontSize;
|
||||
txt.fontStyle = fontStyle;
|
||||
txt.text = "Text";
|
||||
txt.alignment = anchor;
|
||||
txt.horizontalOverflow = HorizontalWrapMode.Overflow;
|
||||
txt.verticalOverflow = VerticalWrapMode.Overflow;
|
||||
txt.color = color;
|
||||
if (rotate > 0)
|
||||
{
|
||||
txtObj.transform.localEulerAngles = new Vector3(0, 0, rotate);
|
||||
}
|
||||
txtObj.transform.localEulerAngles = new Vector3(0, 0, rotate);
|
||||
|
||||
RectTransform rect = GetOrAddComponent<RectTransform>(txtObj);
|
||||
rect.localPosition = Vector3.zero;
|
||||
@@ -178,7 +188,7 @@ namespace XCharts
|
||||
return btnObj.GetComponent<Button>();
|
||||
}
|
||||
|
||||
public static GameObject AddTooltipContent(string name, Transform parent, Font font, int fontSize, FontStyle fontStyle)
|
||||
internal static GameObject AddTooltipContent(string name, Transform parent, Font font, int fontSize, FontStyle fontStyle)
|
||||
{
|
||||
var anchorMax = new Vector2(0, 1);
|
||||
var anchorMin = new Vector2(0, 1);
|
||||
@@ -206,7 +216,7 @@ namespace XCharts
|
||||
return iconObj;
|
||||
}
|
||||
|
||||
public static GameObject AddSerieLabel(string name, Transform parent, Font font, Color textColor, Color backgroundColor,
|
||||
internal static GameObject AddSerieLabel(string name, Transform parent, Font font, Color textColor, Color backgroundColor,
|
||||
int fontSize, FontStyle fontStyle, float rotate, float width, float height)
|
||||
{
|
||||
var anchorMin = new Vector2(0.5f, 0.5f);
|
||||
@@ -226,7 +236,7 @@ namespace XCharts
|
||||
return labelObj;
|
||||
}
|
||||
|
||||
public static GameObject AddTooltipLabel(string name, Transform parent, Font font, Vector2 pivot)
|
||||
internal static GameObject AddTooltipLabel(string name, Transform parent, Font font, Vector2 pivot)
|
||||
{
|
||||
var anchorMax = new Vector2(0, 0);
|
||||
var anchorMin = new Vector2(0, 0);
|
||||
|
||||
@@ -24,8 +24,8 @@ namespace XCharts
|
||||
|
||||
public class XChartsMgr : MonoBehaviour
|
||||
{
|
||||
public const string version = "1.0.1";
|
||||
public const int date = 20191026;
|
||||
public const string version = "1.0.4";
|
||||
public const int date = 20191105;
|
||||
|
||||
[SerializeField] private string m_NowVersion;
|
||||
[SerializeField] private string m_NewVersion;
|
||||
@@ -65,6 +65,10 @@ namespace XCharts
|
||||
|
||||
private XChartsMgr() { }
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
SerieLabelPool.ClearAll();
|
||||
}
|
||||
|
||||
public string changeLog { get; private set; }
|
||||
public string newVersion { get { return m_NewVersion; } }
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "com.monitor1394.xcharts",
|
||||
"displayName": "XCharts",
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.4",
|
||||
"unity": "2018.3",
|
||||
"description": "A charting and data visualization library for Unity.",
|
||||
"keywords": [
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"version": "1.0.1",
|
||||
"date": "20191026",
|
||||
"checkdate": "20191026",
|
||||
"version": "1.0.4",
|
||||
"date": "20191105",
|
||||
"checkdate": "20191105",
|
||||
"desc": "欢迎 Github 上点 Star 支持,非常感谢!",
|
||||
"homepage": "https://github.com/monitor1394/unity-ugui-XCharts"
|
||||
}
|
||||
Reference in New Issue
Block a user