diff --git a/.gitignore b/.gitignore index 289b734e..a7426974 100644 --- a/.gitignore +++ b/.gitignore @@ -11,10 +11,10 @@ /Assets/Package /Assets/Package.meta -/Assets/XCharts/Demo/demo_test.unity -/Assets/XCharts/Demo/demo_test.unity.meta -/Assets/XCharts/Demo/empty.unity -/Assets/XCharts/Demo/empty.unity.meta +/Assets/XChartsDemo/demo_test.unity +/Assets/XChartsDemo/demo_test.unity.meta +/Assets/XChartsDemo/empty.unity +/Assets/XChartsDemo/empty.unity.meta *.sln *.csproj diff --git a/Assets/XCharts/CHANGELOG.md b/Assets/XCharts/CHANGELOG.md index 034ea517..700c7317 100644 --- a/Assets/XCharts/CHANGELOG.md +++ b/Assets/XCharts/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`参数) diff --git a/Assets/XCharts/Demo.meta b/Assets/XCharts/Demo.meta index 24e0f666..2976fd1f 100644 --- a/Assets/XCharts/Demo.meta +++ b/Assets/XCharts/Demo.meta @@ -1,8 +1,6 @@ fileFormatVersion: 2 guid: 5e6b0fb015bc6524d8bab146b6f2ba3a folderAsset: yes -timeCreated: 1553641866 -licenseType: Free DefaultImporter: externalObjects: {} userData: diff --git a/Assets/XCharts/Demo/Editor/XCharts.Editor.Demo.asmdef b/Assets/XCharts/Demo/Editor/XCharts.Editor.Demo.asmdef deleted file mode 100644 index ebf6f8e5..00000000 --- a/Assets/XCharts/Demo/Editor/XCharts.Editor.Demo.asmdef +++ /dev/null @@ -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": [] -} \ No newline at end of file diff --git a/Assets/XCharts/Documentation/XChartsAPI.md b/Assets/XCharts/Documentation/XChartsAPI.md index 2ecac2ed..6e4627d8 100644 --- a/Assets/XCharts/Documentation/XChartsAPI.md +++ b/Assets/XCharts/Documentation/XChartsAPI.md @@ -8,6 +8,7 @@ --- +* `BaseChart.themeInfo`:主题组件`ThemeInfo`。 * `BaseChart.title`:标题组件`Title`。 * `BaseChart.legend`:图例组件`Legend`。 * `BaseChart.tooltip`:提示框组件`Tooltip`。 diff --git a/Assets/XCharts/Documentation/XCharts配置项手册.md b/Assets/XCharts/Documentation/XCharts配置项手册.md index 9d9ef82a..e16b85ca 100644 --- a/Assets/XCharts/Documentation/XCharts配置项手册.md +++ b/Assets/XCharts/Documentation/XCharts配置项手册.md @@ -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` --- diff --git a/Assets/XCharts/Editor/PropertyDrawers/IconStyleDrawer.cs b/Assets/XCharts/Editor/PropertyDrawers/IconStyleDrawer.cs new file mode 100644 index 00000000..b90773fc --- /dev/null +++ b/Assets/XCharts/Editor/PropertyDrawers/IconStyleDrawer.cs @@ -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 m_IconStyleToggle = new Dictionary(); + + 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; + } + } + } +} \ No newline at end of file diff --git a/Assets/XCharts/Runtime/Internal/JsonDataSupport.cs.meta b/Assets/XCharts/Editor/PropertyDrawers/IconStyleDrawer.cs.meta similarity index 71% rename from Assets/XCharts/Runtime/Internal/JsonDataSupport.cs.meta rename to Assets/XCharts/Editor/PropertyDrawers/IconStyleDrawer.cs.meta index 5f64576a..fb19ace6 100644 --- a/Assets/XCharts/Runtime/Internal/JsonDataSupport.cs.meta +++ b/Assets/XCharts/Editor/PropertyDrawers/IconStyleDrawer.cs.meta @@ -1,7 +1,5 @@ fileFormatVersion: 2 -guid: 73e326ed8a76f90408bfa9feb1797433 -timeCreated: 1555379601 -licenseType: Free +guid: 9cae26ad61d224d8a97d41bdc52ec0b7 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/XCharts/Editor/PropertyDrawers/RadarDrawer.cs b/Assets/XCharts/Editor/PropertyDrawers/RadarDrawer.cs index ab8f618e..f1132d85 100644 --- a/Assets/XCharts/Editor/PropertyDrawers/RadarDrawer.cs +++ b/Assets/XCharts/Editor/PropertyDrawers/RadarDrawer.cs @@ -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 m_RadarModuleToggle = new Dictionary(); @@ -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++) { diff --git a/Assets/XCharts/Editor/PropertyDrawers/RadarIndicatorDrawer.cs b/Assets/XCharts/Editor/PropertyDrawers/RadarIndicatorDrawer.cs index 1774c921..3330775e 100644 --- a/Assets/XCharts/Editor/PropertyDrawers/RadarIndicatorDrawer.cs +++ b/Assets/XCharts/Editor/PropertyDrawers/RadarIndicatorDrawer.cs @@ -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 { diff --git a/Assets/XCharts/Editor/PropertyDrawers/SerieDrawer.cs b/Assets/XCharts/Editor/PropertyDrawers/SerieDrawer.cs index f243e32e..367683b7 100644 --- a/Assets/XCharts/Editor/PropertyDrawers/SerieDrawer.cs +++ b/Assets/XCharts/Editor/PropertyDrawers/SerieDrawer.cs @@ -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) { diff --git a/Assets/XCharts/Editor/PropertyDrawers/TextStyleDrawer.cs b/Assets/XCharts/Editor/PropertyDrawers/TextStyleDrawer.cs new file mode 100644 index 00000000..38f9713e --- /dev/null +++ b/Assets/XCharts/Editor/PropertyDrawers/TextStyleDrawer.cs @@ -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 m_TextStyleToggle = new Dictionary(); + + 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; + } + } +} \ No newline at end of file diff --git a/Assets/XCharts/Editor/PropertyDrawers/TextStyleDrawer.cs.meta b/Assets/XCharts/Editor/PropertyDrawers/TextStyleDrawer.cs.meta new file mode 100644 index 00000000..faa64c5a --- /dev/null +++ b/Assets/XCharts/Editor/PropertyDrawers/TextStyleDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f14c425fb2bff44f2bf9ddb8d6ff1741 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XCharts/Editor/Utility/ChartEditorHelper.cs b/Assets/XCharts/Editor/Utility/ChartEditorHelper.cs index 6c86dacd..e83f4c20 100644 --- a/Assets/XCharts/Editor/Utility/ChartEditorHelper.cs +++ b/Assets/XCharts/Editor/Utility/ChartEditorHelper.cs @@ -114,7 +114,7 @@ public class ChartEditorHelper { if (showProp.propertyType == SerializedPropertyType.Boolean) { - drawRect.width = 60; + drawRect.width = 80; } else { diff --git a/Assets/XCharts/Editor/XChartEditor.cs b/Assets/XCharts/Editor/XChartEditor.cs new file mode 100644 index 00000000..a1e2bc51 --- /dev/null +++ b/Assets/XCharts/Editor/XChartEditor.cs @@ -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(); + if (canvas != null) return canvas.transform; + else + { + var canvasObject = new GameObject(); + canvasObject.name = "Canvas"; + canvas = canvasObject.AddComponent(); + canvas.renderMode = RenderMode.ScreenSpaceOverlay; + canvasObject.AddComponent(); + canvasObject.AddComponent(); + 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(string chartName) where T : BaseChart + { + var parent = GetParent(); + if (parent == null) return; + var chart = new GameObject(); + chart.name = GetName(parent, chartName); + chart.AddComponent(); + 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"); + } + + [MenuItem("GameObject/XCharts/BarChart", priority = 45)] + public static void AddBarChart() + { + AddChart("BarChart"); + } + + [MenuItem("GameObject/XCharts/PieChart", priority = 46)] + public static void AddPieChart() + { + AddChart("PieChart"); + } + + [MenuItem("GameObject/XCharts/RadarChart", priority = 47)] + public static void AddRadarChart() + { + AddChart("RadarChart"); + } + + [MenuItem("GameObject/XCharts/ScatterChart", priority = 48)] + public static void AddScatterChart() + { + AddChart("ScatterChart"); + } + + [MenuItem("GameObject/XCharts/HeatmapChart", priority = 49)] + public static void AddHeatmapChart() + { + AddChart("HeatmapChart"); + } + } +} \ No newline at end of file diff --git a/Assets/XCharts/Editor/XChartEditor.cs.meta b/Assets/XCharts/Editor/XChartEditor.cs.meta new file mode 100644 index 00000000..00e4a883 --- /dev/null +++ b/Assets/XCharts/Editor/XChartEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 941beb76fdaa64a27a2df6561893157e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XCharts/Runtime/API/BaseChart_API.cs b/Assets/XCharts/Runtime/API/BaseChart_API.cs index 1f940a15..2c499067 100644 --- a/Assets/XCharts/Runtime/API/BaseChart_API.cs +++ b/Assets/XCharts/Runtime/API/BaseChart_API.cs @@ -18,6 +18,10 @@ namespace XCharts /// public partial class BaseChart { + /// + /// The theme info. + /// + public ThemeInfo themeInfo { get { return m_ThemeInfo; } } /// /// The title setting of chart. /// 标题组件 @@ -429,6 +433,17 @@ namespace XCharts } + /// + /// Update chart theme info. + /// + /// info + public void UpdateThemeInfo(ThemeInfo info) + { + m_ThemeInfo = info; + UpdateTheme(m_ThemeInfo.theme); + } + + /// /// Whether series animation enabel. /// 启用或关闭起始动画。 diff --git a/Assets/XCharts/Runtime/Component/ChartComponent.cs b/Assets/XCharts/Runtime/Component/ChartComponent.cs index 823bd8c8..2f366b6c 100644 --- a/Assets/XCharts/Runtime/Component/ChartComponent.cs +++ b/Assets/XCharts/Runtime/Component/ChartComponent.cs @@ -21,7 +21,7 @@ namespace XCharts /// 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() { } diff --git a/Assets/XCharts/Runtime/Component/Main/Axis.cs b/Assets/XCharts/Runtime/Component/Main/Axis.cs index 0d9c501c..474c98d6 100644 --- a/Assets/XCharts/Runtime/Component/Main/Axis.cs +++ b/Assets/XCharts/Runtime/Component/Main/Axis.cs @@ -208,22 +208,22 @@ namespace XCharts /// the current minimun value. /// 当前最小值。 /// - public float minValue { get; set; } + public float runtimeMinValue { get; internal set; } /// /// the current maximum value. /// 当前最大值。 /// - public float maxValue { get; set; } + public float runtimeMaxValue { get; internal set; } /// /// the x offset of zero position. /// 坐标轴原点在X轴的偏移。 /// - public float zeroXOffset { get; set; } + public float runtimeZeroXOffset { get; internal set; } /// /// the y offset of zero position. /// 坐标轴原点在Y轴的偏移。 /// - public float zeroYOffset { get; set; } + public float runtimeZeroYOffset { get; internal set; } private int filterStart; private int filterEnd; @@ -301,7 +301,7 @@ namespace XCharts /// 类目数据索引 /// 区域缩放 /// - 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 /// /// 区域缩放 /// - public List GetDataList(DataZoom dataZoom) + internal List GetDataList(DataZoom dataZoom) { if (dataZoom != null && dataZoom.enable) { @@ -333,7 +333,7 @@ namespace XCharts /// 更新dataZoom对应的类目数据列表 /// /// - public void UpdateFilterData(DataZoom dataZoom) + internal void UpdateFilterData(DataZoom dataZoom) { if (dataZoom != null && dataZoom.enable) { @@ -366,7 +366,7 @@ namespace XCharts /// /// /// - public int GetSplitNumber(float coordinateWid, DataZoom dataZoom) + internal int GetSplitNumber(float coordinateWid, DataZoom dataZoom) { if (type == AxisType.Value) { @@ -398,7 +398,7 @@ namespace XCharts /// /// /// - 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 /// /// /// - public int GetDataNumber(DataZoom dataZoom) + internal int GetDataNumber(DataZoom dataZoom) { return GetDataList(dataZoom).Count; } @@ -422,7 +422,7 @@ namespace XCharts /// /// /// - 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 /// /// /// - 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 /// /// /// - public int GetScaleNumber(float coordinateWidth, DataZoom dataZoom) + internal int GetScaleNumber(float coordinateWidth, DataZoom dataZoom) { if (type == AxisType.Value) { @@ -508,7 +508,7 @@ namespace XCharts /// /// /// - 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 /// 更新刻度标签文字 /// /// - 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(); @@ -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().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 /// /// /// - 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(m_Data, other.data); } diff --git a/Assets/XCharts/Runtime/Component/Main/DataZoom.cs b/Assets/XCharts/Runtime/Component/Main/DataZoom.cs index e5bb8dee..dfa5f33a 100644 --- a/Assets/XCharts/Runtime/Component/Main/DataZoom.cs +++ b/Assets/XCharts/Runtime/Component/Main/DataZoom.cs @@ -208,12 +208,12 @@ namespace XCharts /// The start label. /// 组件的开始信息文本。 /// - public Text startLabel { get; set; } + private Text m_StartLabel { get; set; } /// /// The end label. /// 组件的结束信息文本。 /// - public Text endLabel { get; set; } + private Text m_EndLabel { get; set; } public static DataZoom defaultDataZoom { @@ -297,15 +297,15 @@ namespace XCharts /// 是否显示文本 /// /// - 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 /// 设置开始文本内容 /// /// - public void SetStartLabelText(string text) + internal void SetStartLabelText(string text) { - if (startLabel) startLabel.text = text; + if (m_StartLabel) m_StartLabel.text = text; } /// /// 设置结束文本内容 /// /// - public void SetEndLabelText(string text) + internal void SetEndLabelText(string text) { - if (endLabel) endLabel.text = text; + if (m_EndLabel) m_EndLabel.text = text; } /// @@ -332,7 +332,7 @@ namespace XCharts /// /// /// - 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; + } } } \ No newline at end of file diff --git a/Assets/XCharts/Runtime/Component/Main/Radar.cs b/Assets/XCharts/Runtime/Component/Main/Radar.cs index 953f64e2..0cef4db5 100644 --- a/Assets/XCharts/Runtime/Component/Main/Radar.cs +++ b/Assets/XCharts/Runtime/Component/Main/Radar.cs @@ -30,6 +30,20 @@ namespace XCharts Circle } /// + /// 显示位置。 + /// + public enum PositionType + { + /// + /// 显示在顶点处。 + /// + Vertice, + /// + /// 显示在两者之间。 + /// + Between, + } + /// /// Indicator of radar chart, which is used to assign multiple variables(dimensions) in radar chart. /// 雷达图的指示器,用来指定雷达图中的多个变量(维度)。 /// @@ -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(); + /// /// 指示器名称。 /// @@ -55,10 +70,10 @@ namespace XCharts /// public float min { get { return m_Min; } set { m_Min = value; } } /// - /// Specfy a color the the indicator. - /// 标签特定的颜色。默认取自主题的axisTextColor。 + /// the style of text. + /// 文本样式。 /// - public Color color { get { return m_Color; } set { m_Color = value; } } + public TextStyle textStyle { get { return m_TextStyle; } set { m_TextStyle = value; } } /// /// 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 m_IndicatorList = new List(); /// /// Radar render type, in which 'Polygon' and 'Circle' are supported. @@ -153,6 +170,14 @@ namespace XCharts /// public bool indicator { get { return m_Indicator; } set { m_Indicator = value; } } /// + /// 指示器和雷达的间距。 + /// + public float indicatorGap { get { return m_IndicatorGap; } set { m_IndicatorGap = value; } } + /// + /// 显示位置类型。 + /// + public PositionType positionType { get { return m_PositionType; } set { m_PositionType = value; } } + /// /// the indicator list. /// 指示器列表。 /// @@ -162,20 +187,18 @@ namespace XCharts /// the center position of radar in container. /// 雷达图在容器中的具体中心点。 /// - /// - public Vector2 centerPos { get; set; } + public Vector2 runtimeCenterPos { get; internal set; } /// /// the true radius of radar. /// 雷达图的运行时实际半径。 /// - /// - public float actualRadius { get; set; } + public float runtimeRadius { get; internal set; } + public float runtimeDataRadius { get; internal set; } /// /// the data position list of radar. /// 雷达图的所有数据坐标点列表。 /// - /// - public Dictionary> dataPosList = new Dictionary>(); + public Dictionary> runtimeDataPosList = new Dictionary>(); 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); } } diff --git a/Assets/XCharts/Runtime/Component/Main/Serie.cs b/Assets/XCharts/Runtime/Component/Main/Serie.cs index 869f1f1e..11556617 100644 --- a/Assets/XCharts/Runtime/Component/Main/Serie.cs +++ b/Assets/XCharts/Runtime/Component/Main/Serie.cs @@ -426,12 +426,12 @@ namespace XCharts /// The index of serie,start at 0. /// 系列的索引,从0开始。 /// - public int index { get; set; } + public int index { get; internal set; } /// /// Whether the serie is highlighted. /// 该系列是否高亮,一般由图例悬停触发。 /// - public bool highlighted { get; set; } + public bool highlighted { get; internal set; } /// /// the count of data list. /// 数据项个数。 @@ -444,25 +444,26 @@ namespace XCharts /// /// 饼图的中心点位置。 /// - public Vector3 pieCenterPos { get; set; } + public Vector3 runtimePieCenterPos { get; internal set; } /// /// 饼图的内径 /// - public float pieInsideRadius { get; set; } + public float runtimePieInsideRadius { get; internal set; } /// /// 饼图的外径 /// - public float pieOutsideRadius { get; set; } + public float runtimePieOutsideRadius { get; internal set; } /// /// 饼图的数据项最大值 /// - public float pieDataMax { get; set; } + public float runtimePieDataMax { get; internal set; } /// /// 饼图的数据项之和 /// - public float pieDataTotal { get; set; } + public float runtimePieDataTotal { get; internal set; } + internal int runtimeLastCheckDataCount { get; set; } - public List GetUpSmoothList(int dataIndex, int size = 100) + internal List GetUpSmoothList(int dataIndex, int size = 100) { if (m_UpSmoothPoints.ContainsKey(dataIndex)) { @@ -476,7 +477,7 @@ namespace XCharts } } - public List GetDownSmoothList(int dataIndex, int size = 100) + internal List 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更新数据列表缓存 /// /// - 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; } } diff --git a/Assets/XCharts/Runtime/Component/Main/Series.cs b/Assets/XCharts/Runtime/Component/Main/Series.cs index 72c6cf26..ca3d3a65 100644 --- a/Assets/XCharts/Runtime/Component/Main/Series.cs +++ b/Assets/XCharts/Runtime/Component/Main/Series.cs @@ -143,7 +143,7 @@ namespace XCharts /// /// /// - public Serie GetLastStackSerie(int index) + internal Serie GetLastStackSerie(int index) { var serie = GetSerie(index); return GetLastStackSerie(serie); @@ -154,7 +154,7 @@ namespace XCharts /// /// /// - 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 /// /// /// - 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由变化是更新系列的缓存数据 /// /// - public void UpdateFilterData(DataZoom dataZoom) + internal void UpdateFilterData(DataZoom dataZoom) { if (dataZoom != null && dataZoom.enable) { @@ -527,7 +527,7 @@ namespace XCharts /// /// /// - public bool IsUsedAxisIndex(int axisIndex) + internal bool IsUsedAxisIndex(int axisIndex) { foreach (var serie in list) { @@ -555,7 +555,7 @@ namespace XCharts /// /// /// - 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 /// /// /// - 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> _stackSeriesForMinMax = new Dictionary>(); private Dictionary _serieTotalValueForMinMax = new Dictionary(); - 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 /// 是否由数据堆叠 /// /// - public bool IsStack() + internal bool IsStack() { _setForStack.Clear(); foreach (var serie in m_Series) @@ -701,7 +701,7 @@ namespace XCharts /// /// /// - 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 /// /// /// - public bool IsPercentStack(SerieType type) + internal bool IsPercentStack(SerieType type) { int count = 0; bool isPercentStack = false; @@ -746,7 +746,7 @@ namespace XCharts /// /// /// - 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 /// 获得堆叠系列列表 /// /// - public Dictionary> GetStackSeries() + internal Dictionary> GetStackSeries() { int count = 0; Dictionary sets = new Dictionary(); @@ -810,7 +810,7 @@ namespace XCharts /// /// /// - public void GetStackSeries(ref Dictionary> stackSeries) + internal void GetStackSeries(ref Dictionary> stackSeries) { int count = 0; sets.Clear(); @@ -860,7 +860,7 @@ namespace XCharts /// 获得所有系列名,不包含空名字。 /// /// - public List GetSerieNameList() + internal List GetSerieNameList() { serieNameList.Clear(); for (int n = 0; n < m_Series.Count; n++) diff --git a/Assets/XCharts/Runtime/Component/Main/Tooltip.cs b/Assets/XCharts/Runtime/Component/Main/Tooltip.cs index d866672c..0a0a7a69 100644 --- a/Assets/XCharts/Runtime/Component/Main/Tooltip.cs +++ b/Assets/XCharts/Runtime/Component/Main/Tooltip.cs @@ -124,42 +124,42 @@ namespace XCharts /// The data index currently indicated by Tooltip. /// 当前提示框所指示的数据项索引。 /// - public List dataIndex { get; set; } + public List runtimeDataIndex { get; internal set; } /// /// the value for x indicator label. /// 指示器X轴上要显示的值。 /// - public float[] xValues { get; set; } + public float[] runtimeXValues { get; internal set; } /// /// the value for y indicator label. /// 指示器Y轴上要显示的值。 /// - public float[] yValues { get; set; } + public float[] runtimeYValues { get; internal set; } /// /// the current pointer position. /// 当前鼠标位置。 /// - public Vector2 pointerPos { get; set; } + public Vector2 runtimePointerPos { get; internal set; } /// /// the width of tooltip. /// 提示框宽。 /// - public float width { get { return m_ContentRect.sizeDelta.x; } } + public float runtimeWidth { get { return m_ContentRect.sizeDelta.x; } } /// /// the height of tooltip. /// 提示框高。 /// - public float height { get { return m_ContentRect.sizeDelta.y; } } + public float runtimeHeight { get { return m_ContentRect.sizeDelta.y; } } /// /// Whether the tooltip has been initialized. /// 提示框是否已初始化。 /// - public bool inited { get { return m_GameObject != null; } } + public bool runtimeInited { get { return m_GameObject != null; } } /// /// the gameObject of tooltip. /// 提示框的gameObject。 /// - 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() { -1, -1 }, + runtimeXValues = new float[2] { -1, -1 }, + runtimeYValues = new float[2] { -1, -1 }, + runtimeDataIndex = new List() { -1, -1 }, lastDataIndex = new List() { -1, -1 } }; return tooltip; @@ -214,7 +214,8 @@ namespace XCharts /// public void SetContentBackgroundColor(Color color) { - m_Content.GetComponent().color = color; + if (m_Content != null && m_Content.GetComponent() != null) + m_Content.GetComponent().color = color; } /// @@ -252,11 +253,11 @@ namespace XCharts /// /// 清除提示框指示数据 /// - 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; } /// @@ -308,17 +309,17 @@ namespace XCharts /// public bool IsDataIndexChanged() { - return dataIndex[0] != lastDataIndex[0] || - dataIndex[1] != lastDataIndex[1]; + return runtimeDataIndex[0] != lastDataIndex[0] || + runtimeDataIndex[1] != lastDataIndex[1]; } /// /// 当前索引缓存 /// - public void UpdateLastDataIndex() + internal void UpdateLastDataIndex() { - lastDataIndex[0] = dataIndex[0]; - lastDataIndex[1] = dataIndex[1]; + lastDataIndex[0] = runtimeDataIndex[0]; + lastDataIndex[1] = runtimeDataIndex[1]; } /// @@ -327,7 +328,7 @@ namespace XCharts /// public bool IsSelected() { - return dataIndex[0] >= 0 || dataIndex[1] >= 0; + return runtimeDataIndex[0] >= 0 || runtimeDataIndex[1] >= 0; } /// @@ -337,10 +338,10 @@ namespace XCharts /// 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); diff --git a/Assets/XCharts/Runtime/Component/Main/VisualMap.cs b/Assets/XCharts/Runtime/Component/Main/VisualMap.cs index 38e7f207..eb3c7d4f 100644 --- a/Assets/XCharts/Runtime/Component/Main/VisualMap.cs +++ b/Assets/XCharts/Runtime/Component/Main/VisualMap.cs @@ -164,14 +164,14 @@ namespace XCharts /// 鼠标悬停选中的index /// /// - public int rtSelectedIndex { get; set; } - public float rtSelectedValue { get; set; } + public int runtimeSelectedIndex { get; internal set; } + public float runtimeSelectedValue { get; internal set; } /// /// the current pointer position. /// 当前鼠标位置。 /// - 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 m_RtInRange = new List(); - public List rtInRange + public List 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; } diff --git a/Assets/XCharts/Runtime/Component/Sub/IconStyle.cs b/Assets/XCharts/Runtime/Component/Sub/IconStyle.cs new file mode 100644 index 00000000..8d665b0a --- /dev/null +++ b/Assets/XCharts/Runtime/Component/Sub/IconStyle.cs @@ -0,0 +1,105 @@ +/******************************************/ +/* */ +/* Copyright (c) 2018 monitor1394 */ +/* https://github.com/monitor1394 */ +/* */ +/******************************************/ + +using UnityEngine; +using UnityEngine.UI; + +namespace XCharts +{ + /// + /// 系列数据项的图标 + /// + [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; + + /// + /// Whether the data icon is show. + /// 是否显示图标。 + /// + public bool show { get { return m_Show; } set { m_Show = value; UpdateIcon(); } } + /// + /// 显示在上层还是在下层。 + /// + public Layer layer { get { return m_Layer; } set { m_Layer = value; } } + /// + /// The image of icon. + /// 图标的图片。 + /// + public Sprite sprite { get { return m_Sprite; } set { m_Sprite = value; } } + /// + /// 图标颜色。 + /// + public Color color { get { return m_Color; } set { m_Color = value; } } + /// + /// 图标宽。 + /// + public float width { get { return m_Width; } set { m_Width = value; } } + /// + /// 图标高。 + /// + public float height { get { return m_Height; } set { m_Height = value; } } + /// + /// 图标偏移。 + /// + 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(); + 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); + } + } + } +} diff --git a/Assets/XCharts/Runtime/Component/Sub/IconStyle.cs.meta b/Assets/XCharts/Runtime/Component/Sub/IconStyle.cs.meta new file mode 100644 index 00000000..53609daf --- /dev/null +++ b/Assets/XCharts/Runtime/Component/Sub/IconStyle.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 82c4d360f7b5b4ee7845e9bbe611c8a3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XCharts/Runtime/Component/Sub/Location.cs b/Assets/XCharts/Runtime/Component/Sub/Location.cs index 83621c73..19c61aff 100644 --- a/Assets/XCharts/Runtime/Component/Sub/Location.cs +++ b/Assets/XCharts/Runtime/Component/Sub/Location.cs @@ -74,25 +74,25 @@ namespace XCharts /// Location对应的Anchor锚点 /// /// - public TextAnchor textAnchor { get { return m_TextAnchor; } } + public TextAnchor runtimeTextAnchor { get { return m_TextAnchor; } } /// /// the minimum achor. /// Location对应的anchorMin。 /// /// - public Vector2 anchorMin { get { return m_AnchorMin; } } + public Vector2 runtimeAnchorMin { get { return m_AnchorMin; } } /// /// the maximun achor. /// Location对应的anchorMax. /// /// - public Vector2 anchorMax { get { return m_AnchorMax; } } + public Vector2 runtimeAnchorMax { get { return m_AnchorMax; } } /// /// the povot. /// Loation对应的中心点。 /// /// - public Vector2 pivot { get { return m_Pivot; } } + public Vector2 runtimePivot { get { return m_Pivot; } } public static Location defaultLeft { diff --git a/Assets/XCharts/Runtime/Component/Sub/SerieAnimation.cs b/Assets/XCharts/Runtime/Component/Sub/SerieAnimation.cs index 12110e0a..9f8f7073 100644 --- a/Assets/XCharts/Runtime/Component/Sub/SerieAnimation.cs +++ b/Assets/XCharts/Runtime/Component/Sub/SerieAnimation.cs @@ -37,31 +37,26 @@ namespace XCharts /// Easing method used for the first animation. /// 动画的缓动效果。 /// - /// public Easing easing { get { return m_Easting; } set { m_Easting = value; } } /// /// The milliseconds duration of the first animation. /// 设定的动画时长(毫秒)。 /// - /// public int duration { get { return m_Duration; } set { m_Duration = value; } } /// /// The milliseconds actual duration of the first animation. /// 实际的动画时长(毫秒)。 /// - /// public int actualDuration { get { return m_ActualDuration; } } /// /// Whether to set graphic number threshold to animation. Animation will be disabled when graphic number is larger than threshold. /// 是否开启动画的阈值,当单个系列显示的图形数量大于这个阈值时会关闭动画。 /// - /// public int threshold { get { return m_Threshold; } set { m_Threshold = value; } } /// /// The milliseconds delay before updating the first animation. /// 动画延时(毫秒)。 /// - /// public int delay { get { return m_Delay; } set { m_Delay = value; if (m_Delay < 0) m_Delay = 0; } } private Dictionary m_DataAnimationState = new Dictionary(); @@ -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; diff --git a/Assets/XCharts/Runtime/Component/Sub/SerieData.cs b/Assets/XCharts/Runtime/Component/Sub/SerieData.cs index 2541e98a..14be0cc4 100644 --- a/Assets/XCharts/Runtime/Component/Sub/SerieData.cs +++ b/Assets/XCharts/Runtime/Component/Sub/SerieData.cs @@ -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 m_Data = new List(); private bool m_Show = true; @@ -58,32 +53,10 @@ namespace XCharts /// public bool selected { get { return m_Selected; } set { m_Selected = value; } } /// - /// Whether the data icon is show. - /// 是否显示图标。 + /// the icon of data. + /// 数据项图标样式。 /// - public bool showIcon { get { return m_ShowIcon; } set { m_ShowIcon = value; } } - /// - /// The image of icon. - /// 图标的图片。 - /// - public Sprite iconImage { get { return m_IconImage; } set { m_IconImage = value; } } - /// - /// 图标颜色。 - /// - public Color iconColor { get { return m_IconColor; } set { m_IconColor = value; } } - /// - /// 图标宽。 - /// - public float iconWidth { get { return m_IconWidth; } set { m_IconWidth = value; } } - /// - /// 图标高。 - /// - public float iconHeight { get { return m_IconHeight; } set { m_IconHeight = value; } } - /// - /// 图标偏移。 - /// - public Vector3 iconOffset { get { return m_IconOffset; } set { m_IconOffset = value; } } - + public IconStyle iconStyle { get { return m_IconStyle; } set { m_IconStyle = value; } } /// /// An arbitrary dimension data list of data item. /// 可指定任意维数的数值列表。 @@ -124,8 +97,7 @@ namespace XCharts /// 最小值。 /// public float min { get { return m_Data.Min(); } } - public Image icon { get; private set; } - public RectTransform iconRect { get; private set; } + /// /// 关联的gameObject /// @@ -133,34 +105,34 @@ namespace XCharts /// /// 饼图数据项的开始角度(运行时自动计算) /// - public float pieStartAngle { get; set; } + public float runtimePieStartAngle { get; internal set; } /// /// 饼图数据项的结束角度(运行时自动计算) /// - public float pieToAngle { get; set; } + public float runtimePieToAngle { get; internal set; } /// /// 饼图数据项的一半时的角度(运行时自动计算) /// - public float pieHalfAngle { get; set; } + public float runtimePieHalfAngle { get; internal set; } /// /// 饼图数据项的当前角度(运行时自动计算) /// - public float pieCurrAngle { get; set; } + public float runtimePieCurrAngle { get; internal set; } /// /// 饼图数据项的内半径 /// - public float pieInsideRadius { get; set; } + public float runtimePieInsideRadius { get; internal set; } /// /// 饼图数据项的外半径 /// - 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 /// /// 饼图数据项的偏移半径 /// - 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(); - iconRect = iconObj.GetComponent(); - 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(); } } } diff --git a/Assets/XCharts/Runtime/Component/Sub/TextStyle.cs b/Assets/XCharts/Runtime/Component/Sub/TextStyle.cs new file mode 100644 index 00000000..31a68656 --- /dev/null +++ b/Assets/XCharts/Runtime/Component/Sub/TextStyle.cs @@ -0,0 +1,129 @@ +using System.Threading; +/******************************************/ +/* */ +/* Copyright (c) 2018 monitor1394 */ +/* https://github.com/monitor1394 */ +/* */ +/******************************************/ + +using System; +using UnityEngine; + +namespace XCharts +{ + /// + /// Settings related to text. + /// 文本的相关设置。 + /// + [Serializable] + public class TextStyle : SubComponent, IEquatable + { + [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; + + /// + /// Rotation of text. + /// 文本的旋转。 + /// + public float rotate { get { return m_Rotate; } set { m_Rotate = value; } } + /// + /// the offset of position. + /// 坐标偏移。 + /// + public Vector2 offset { get { return m_Offset; } set { m_Offset = value; } } + + /// + /// the color of text. + /// 文本的颜色。 + /// + public Color color { get { return m_Color; } set { m_Color = value; } } + /// + /// font size. + /// 文本字体大小。 + /// + public int fontSize { get { return m_FontSize; } set { m_FontSize = value; } } + /// + /// font style. + /// 文本字体的风格。 + /// + 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(); + } + } +} \ No newline at end of file diff --git a/Assets/XCharts/Runtime/Component/Sub/TextStyle.cs.meta b/Assets/XCharts/Runtime/Component/Sub/TextStyle.cs.meta new file mode 100644 index 00000000..c429b3bd --- /dev/null +++ b/Assets/XCharts/Runtime/Component/Sub/TextStyle.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e8f6b652968894ab195666501dda672c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XCharts/Runtime/HeatmapChart.cs b/Assets/XCharts/Runtime/HeatmapChart.cs index 280de6a1..a38c40ae 100644 --- a/Assets/XCharts/Runtime/HeatmapChart.cs +++ b/Assets/XCharts/Runtime/HeatmapChart.cs @@ -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); diff --git a/Assets/XCharts/Runtime/Internal/AxisPool.cs b/Assets/XCharts/Runtime/Internal/AxisPool.cs index 5d3afd51..e02b4d9e 100644 --- a/Assets/XCharts/Runtime/Internal/AxisPool.cs +++ b/Assets/XCharts/Runtime/Internal/AxisPool.cs @@ -7,7 +7,7 @@ namespace XCharts { - public static class XAxisPool + internal static class XAxisPool { private static readonly ObjectPool s_ListPool = new ObjectPool(null, null); @@ -22,7 +22,7 @@ namespace XCharts } } - public static class YAxisPool + internal static class YAxisPool { private static readonly ObjectPool s_ListPool = new ObjectPool(null, null); diff --git a/Assets/XCharts/Runtime/Internal/BaseChart.cs b/Assets/XCharts/Runtime/Internal/BaseChart.cs index 104811b4..0679b554 100644 --- a/Assets/XCharts/Runtime/Internal/BaseChart.cs +++ b/Assets/XCharts/Runtime/Internal/BaseChart.cs @@ -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 m_CheckSerieName = new List(); - [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 m_LegendRealShowName = new List(); 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(); + 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() diff --git a/Assets/XCharts/Runtime/Internal/CoordinateChart.cs b/Assets/XCharts/Runtime/Internal/CoordinateChart.cs index fc25a548..561555c3 100644 --- a/Assets/XCharts/Runtime/Internal/CoordinateChart.cs +++ b/Assets/XCharts/Runtime/Internal/CoordinateChart.cs @@ -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) diff --git a/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawBar.cs b/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawBar.cs index 6fefa517..8e20a161 100644 --- a/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawBar.cs +++ b/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawBar.cs @@ -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; } diff --git a/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawHeatmap.cs b/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawHeatmap.cs index a4afe6ee..859b2357 100644 --- a/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawHeatmap.cs +++ b/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawHeatmap.cs @@ -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; diff --git a/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawLine.cs b/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawLine.cs index fa0d56cc..329ee1b9 100644 --- a/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawLine.cs +++ b/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawLine.cs @@ -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; diff --git a/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawScatter.cs b/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawScatter.cs index b6feb2c7..71f6a686 100644 --- a/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawScatter.cs +++ b/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawScatter.cs @@ -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; diff --git a/Assets/XCharts/Runtime/Internal/JsonDataSupport.cs b/Assets/XCharts/Runtime/Internal/JsonDataSupport.cs deleted file mode 100644 index 46b4b2e8..00000000 --- a/Assets/XCharts/Runtime/Internal/JsonDataSupport.cs +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************/ -/* */ -/* Copyright (c) 2018 monitor1394 */ -/* https://github.com/monitor1394 */ -/* */ -/******************************************/ - -using UnityEngine; -using System; - -namespace XCharts -{ - /// - /// 支持从json格式的字符串中导入数据 - /// - public class JsonDataSupport : IJsonData, ISerializationCallbackReceiver - { - [SerializeField] protected string m_JsonData; - [SerializeField] protected bool m_DataFromJson; - - /// - /// json格式的字符串数据 - /// - /// - 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"); - } - } -} diff --git a/Assets/XCharts/Runtime/Internal/ObjectPool.cs b/Assets/XCharts/Runtime/Internal/ObjectPool.cs index e53dad38..be2bde7b 100644 --- a/Assets/XCharts/Runtime/Internal/ObjectPool.cs +++ b/Assets/XCharts/Runtime/Internal/ObjectPool.cs @@ -11,7 +11,7 @@ using UnityEngine.Events; namespace XCharts { - public class ObjectPool where T : new() + internal class ObjectPool where T : new() { private readonly Stack m_Stack = new Stack(); private readonly UnityAction m_ActionOnGet; diff --git a/Assets/XCharts/Runtime/Internal/SerieLabelPool.cs b/Assets/XCharts/Runtime/Internal/SerieLabelPool.cs new file mode 100644 index 00000000..2cbff214 --- /dev/null +++ b/Assets/XCharts/Runtime/Internal/SerieLabelPool.cs @@ -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 m_Stack = new Stack(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(); + } + } +} diff --git a/Assets/XCharts/Runtime/Internal/SerieLabelPool.cs.meta b/Assets/XCharts/Runtime/Internal/SerieLabelPool.cs.meta new file mode 100644 index 00000000..2e35ce5e --- /dev/null +++ b/Assets/XCharts/Runtime/Internal/SerieLabelPool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 340f267fa46e74d0bbbb0b75a20bd708 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XCharts/Runtime/PieChart.cs b/Assets/XCharts/Runtime/PieChart.cs index 50726fe5..9efa5f34 100644 --- a/Assets/XCharts/Runtime/PieChart.cs +++ b/Assets/XCharts/Runtime/PieChart.cs @@ -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); } diff --git a/Assets/XCharts/Runtime/RadarChart.cs b/Assets/XCharts/Runtime/RadarChart.cs index 75b2eea0..e2fc66c6 100644 --- a/Assets/XCharts/Runtime/RadarChart.cs +++ b/Assets/XCharts/Runtime/RadarChart.cs @@ -20,12 +20,10 @@ namespace XCharts { private const string INDICATOR_TEXT = "indicator"; - //[SerializeField] private Radar radar = Radar.defaultRadar; [SerializeField] private List m_Radars = new List(); private List m_CheckRadars = new List(); private bool m_IsEnterLegendButtom; - //public Radar radar { get { return radar; } } public List radars { get { return m_Radars; } } /// @@ -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().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(serieData.data.Count)); + radar.runtimeDataPosList.Add(i * 100 + j, new List(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 pointList = radar.dataPosList[key]; + List 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); } diff --git a/Assets/XCharts/Runtime/Utility/ChartCached.cs b/Assets/XCharts/Runtime/Utility/ChartCached.cs index 006fd1c9..45e53098 100644 --- a/Assets/XCharts/Runtime/Utility/ChartCached.cs +++ b/Assets/XCharts/Runtime/Utility/ChartCached.cs @@ -23,6 +23,10 @@ namespace XCharts private static Dictionary s_IntToStr = new Dictionary(1000); private static Dictionary s_IntToFn = new Dictionary(20); private static Dictionary s_ColorToStr = new Dictionary(1000); + private static Dictionary s_SerieLabelName = new Dictionary(1000); + private static Dictionary s_AxisLabelName = new Dictionary(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; + } + } } } \ No newline at end of file diff --git a/Assets/XCharts/Runtime/Utility/ChartHelper.cs b/Assets/XCharts/Runtime/Utility/ChartHelper.cs index b23f1595..c92ab1c4 100644 --- a/Assets/XCharts/Runtime/Utility/ChartHelper.cs +++ b/Assets/XCharts/Runtime/Utility/ChartHelper.cs @@ -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(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(txtObj); rect.localPosition = Vector3.zero; @@ -178,7 +188,7 @@ namespace XCharts return btnObj.GetComponent