2019-10-22 04:09:04 +08:00
|
|
|
|
/******************************************/
|
|
|
|
|
|
/* */
|
|
|
|
|
|
/* Copyright (c) 2018 monitor1394 */
|
|
|
|
|
|
/* https://github.com/monitor1394 */
|
|
|
|
|
|
/* */
|
|
|
|
|
|
/******************************************/
|
|
|
|
|
|
|
|
|
|
|
|
using System.Collections.Generic;
|
2019-05-11 04:33:54 +08:00
|
|
|
|
using System.Text;
|
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
using UnityEngine.UI;
|
|
|
|
|
|
|
|
|
|
|
|
namespace XCharts
|
|
|
|
|
|
{
|
2019-07-15 00:24:04 +08:00
|
|
|
|
[AddComponentMenu("XCharts/RadarChart", 16)]
|
|
|
|
|
|
[ExecuteInEditMode]
|
|
|
|
|
|
[RequireComponent(typeof(RectTransform))]
|
|
|
|
|
|
[DisallowMultipleComponent]
|
2019-12-20 09:17:15 +08:00
|
|
|
|
public partial class RadarChart : BaseChart
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
|
|
|
|
|
private const string INDICATOR_TEXT = "indicator";
|
2019-08-04 15:24:31 +08:00
|
|
|
|
[SerializeField] private List<Radar> m_Radars = new List<Radar>();
|
|
|
|
|
|
private bool m_IsEnterLegendButtom;
|
2020-03-05 20:25:19 +08:00
|
|
|
|
private bool m_RadarsDirty;
|
2019-05-11 04:33:54 +08:00
|
|
|
|
|
2019-08-04 15:24:31 +08:00
|
|
|
|
protected override void OnLegendButtonClick(int index, string legendName, bool show)
|
|
|
|
|
|
{
|
2020-02-26 22:52:57 +08:00
|
|
|
|
CheckDataShow(legendName, show);
|
|
|
|
|
|
UpdateLegendColor(legendName, show);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
RefreshChart();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override void OnLegendButtonEnter(int index, string legendName)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_IsEnterLegendButtom = true;
|
|
|
|
|
|
CheckDataHighlighted(legendName, true);
|
|
|
|
|
|
RefreshChart();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override void OnLegendButtonExit(int index, string legendName)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_IsEnterLegendButtom = false;
|
|
|
|
|
|
CheckDataHighlighted(legendName, false);
|
|
|
|
|
|
RefreshChart();
|
2019-07-15 00:24:04 +08:00
|
|
|
|
}
|
2019-08-04 15:24:31 +08:00
|
|
|
|
|
2019-05-11 04:33:54 +08:00
|
|
|
|
protected override void Awake()
|
|
|
|
|
|
{
|
|
|
|
|
|
base.Awake();
|
2019-07-15 00:24:04 +08:00
|
|
|
|
InitIndicator();
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override void Update()
|
|
|
|
|
|
{
|
|
|
|
|
|
base.Update();
|
2020-03-05 20:25:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override void CheckComponent()
|
|
|
|
|
|
{
|
|
|
|
|
|
var anyDirty = IsAnyRadarDirty();
|
|
|
|
|
|
if (m_RadarsDirty || anyDirty)
|
|
|
|
|
|
{
|
|
|
|
|
|
InitIndicator();
|
|
|
|
|
|
OnRadarChanged();
|
|
|
|
|
|
RefreshChart();
|
|
|
|
|
|
m_Tooltip.UpdateToTop();
|
|
|
|
|
|
if (anyDirty)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var radar in m_Radars)
|
|
|
|
|
|
{
|
|
|
|
|
|
radar.ClearDirty();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2020-03-20 08:31:22 +08:00
|
|
|
|
m_RadarsDirty = false;
|
2020-03-05 20:25:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
base.CheckComponent();
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-07-15 00:24:04 +08:00
|
|
|
|
#if UNITY_EDITOR
|
|
|
|
|
|
protected override void Reset()
|
|
|
|
|
|
{
|
|
|
|
|
|
base.Reset();
|
|
|
|
|
|
RemoveData();
|
2019-08-04 15:24:31 +08:00
|
|
|
|
m_Radars.Add(Radar.defaultRadar);
|
2019-07-15 19:21:22 +08:00
|
|
|
|
m_Title.text = "RadarChart";
|
2019-09-29 09:16:15 +08:00
|
|
|
|
var serie = AddSerie(SerieType.Radar, "serie1");
|
2019-08-04 15:24:31 +08:00
|
|
|
|
serie.symbol.type = SerieSymbolType.EmptyCircle;
|
|
|
|
|
|
serie.symbol.size = 4;
|
|
|
|
|
|
serie.symbol.selectedSize = 6;
|
2020-02-26 22:52:57 +08:00
|
|
|
|
serie.showDataName = true;
|
2019-08-04 15:24:31 +08:00
|
|
|
|
List<float> data = new List<float>();
|
2019-07-15 00:24:04 +08:00
|
|
|
|
for (int i = 0; i < 5; i++)
|
|
|
|
|
|
{
|
2019-08-04 15:24:31 +08:00
|
|
|
|
data.Add(Random.Range(20, 90));
|
2019-07-15 00:24:04 +08:00
|
|
|
|
}
|
2020-02-26 22:52:57 +08:00
|
|
|
|
AddData(0, data, "legendName");
|
2019-07-15 00:24:04 +08:00
|
|
|
|
}
|
2020-03-05 20:25:19 +08:00
|
|
|
|
|
|
|
|
|
|
protected override void OnValidate()
|
|
|
|
|
|
{
|
|
|
|
|
|
base.OnValidate();
|
|
|
|
|
|
m_RadarsDirty = true;
|
|
|
|
|
|
}
|
2019-07-15 00:24:04 +08:00
|
|
|
|
#endif
|
|
|
|
|
|
|
2019-05-11 04:33:54 +08:00
|
|
|
|
private void InitIndicator()
|
|
|
|
|
|
{
|
|
|
|
|
|
ChartHelper.HideAllObject(transform, INDICATOR_TEXT);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
for (int n = 0; n < m_Radars.Count; n++)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2019-08-04 15:24:31 +08:00
|
|
|
|
Radar radar = m_Radars[n];
|
|
|
|
|
|
radar.UpdateRadarCenter(chartWidth, chartHeight);
|
|
|
|
|
|
int indicatorNum = radar.indicatorList.Count;
|
|
|
|
|
|
float txtWid = 100;
|
|
|
|
|
|
float txtHig = 20;
|
|
|
|
|
|
for (int i = 0; i < indicatorNum; i++)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2019-08-04 15:24:31 +08:00
|
|
|
|
var indicator = radar.indicatorList[i];
|
|
|
|
|
|
var pos = radar.GetIndicatorPosition(i);
|
|
|
|
|
|
TextAnchor anchor = TextAnchor.MiddleCenter;
|
2019-11-05 18:58:32 +08:00
|
|
|
|
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),
|
2020-02-13 09:23:30 +08:00
|
|
|
|
new Vector2(txtWid, txtHig), textStyle.fontSize, textStyle.rotate, textStyle.fontStyle, textStyle.lineSpacing);
|
2019-11-05 18:58:32 +08:00
|
|
|
|
txt.text = radar.indicatorList[i].name;
|
|
|
|
|
|
txt.gameObject.SetActive(radar.indicator);
|
|
|
|
|
|
var txtWidth = txt.preferredWidth;
|
|
|
|
|
|
var sizeDelta = new Vector2(txt.preferredWidth, txt.preferredHeight);
|
|
|
|
|
|
txt.GetComponent<RectTransform>().sizeDelta = sizeDelta;
|
2019-11-02 08:24:37 +08:00
|
|
|
|
var diff = pos.x - radar.runtimeCenterPos.x;
|
2019-11-05 18:58:32 +08:00
|
|
|
|
if (diff < -1f) //left
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
2019-11-05 18:58:32 +08:00
|
|
|
|
pos = new Vector3(pos.x - txtWidth / 2, pos.y);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
}
|
2019-11-05 18:58:32 +08:00
|
|
|
|
else if (diff > 1f) //right
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
2019-11-05 18:58:32 +08:00
|
|
|
|
pos = new Vector3(pos.x + txtWidth / 2, pos.y);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2019-11-02 08:24:37 +08:00
|
|
|
|
float y = pos.y > radar.runtimeCenterPos.y ? pos.y + txtHig / 2 : pos.y - txtHig / 2;
|
2019-11-05 18:58:32 +08:00
|
|
|
|
pos = new Vector3(pos.x, y);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
}
|
2019-11-05 18:58:32 +08:00
|
|
|
|
txt.transform.localPosition = pos + new Vector3(textStyle.offset.x, textStyle.offset.y);
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-03-05 20:25:19 +08:00
|
|
|
|
private bool IsAnyRadarDirty()
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2020-03-05 20:25:19 +08:00
|
|
|
|
foreach (var radar in m_Radars)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2020-03-05 20:25:19 +08:00
|
|
|
|
if (radar.anyDirty) return true;
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
2020-03-05 20:25:19 +08:00
|
|
|
|
return false;
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-03-05 20:25:19 +08:00
|
|
|
|
protected virtual void OnRadarChanged()
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override void DrawChart(VertexHelper vh)
|
|
|
|
|
|
{
|
|
|
|
|
|
base.DrawChart(vh);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
foreach (var radar in m_Radars)
|
|
|
|
|
|
{
|
|
|
|
|
|
radar.UpdateRadarCenter(chartWidth, chartHeight);
|
|
|
|
|
|
if (radar.shape == Radar.Shape.Circle)
|
|
|
|
|
|
{
|
|
|
|
|
|
DrawCricleRadar(vh, radar);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
DrawRadar(vh, radar);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2019-05-11 04:33:54 +08:00
|
|
|
|
DrawData(vh);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override void OnThemeChanged()
|
|
|
|
|
|
{
|
|
|
|
|
|
base.OnThemeChanged();
|
2019-08-04 15:24:31 +08:00
|
|
|
|
foreach (var radar in m_Radars)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2019-08-04 15:24:31 +08:00
|
|
|
|
radar.splitArea.color.Clear();
|
|
|
|
|
|
switch (m_ThemeInfo.theme)
|
|
|
|
|
|
{
|
|
|
|
|
|
case Theme.Dark:
|
|
|
|
|
|
radar.splitArea.color.Add(ThemeInfo.GetColor("#6f6f6f"));
|
|
|
|
|
|
radar.splitArea.color.Add(ThemeInfo.GetColor("#606060"));
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Theme.Default:
|
|
|
|
|
|
radar.splitArea.color.Add(ThemeInfo.GetColor("#f6f6f6"));
|
|
|
|
|
|
radar.splitArea.color.Add(ThemeInfo.GetColor("#e7e7e7"));
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Theme.Light:
|
|
|
|
|
|
radar.splitArea.color.Add(ThemeInfo.GetColor("#f6f6f6"));
|
|
|
|
|
|
radar.splitArea.color.Add(ThemeInfo.GetColor("#e7e7e7"));
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
2020-03-05 20:25:19 +08:00
|
|
|
|
m_RadarsDirty = true;
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-08-04 15:24:31 +08:00
|
|
|
|
Dictionary<string, int> serieNameSet = new Dictionary<string, int>();
|
2019-05-11 04:33:54 +08:00
|
|
|
|
private void DrawData(VertexHelper vh)
|
|
|
|
|
|
{
|
2019-07-23 21:43:01 +08:00
|
|
|
|
serieNameSet.Clear();
|
2019-05-11 04:33:54 +08:00
|
|
|
|
for (int i = 0; i < m_Series.Count; i++)
|
|
|
|
|
|
{
|
2019-10-01 13:52:02 +08:00
|
|
|
|
var serie = m_Series.list[i];
|
2020-03-20 08:31:22 +08:00
|
|
|
|
serie.index = i;
|
|
|
|
|
|
switch (serie.radarType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case RadarType.Multiple:
|
|
|
|
|
|
DrawMutipleRadar(vh, serie, i);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case RadarType.Single:
|
|
|
|
|
|
DrawSingleRadar(vh, serie, i);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void DrawMutipleRadar(VertexHelper vh, Serie serie, int i)
|
|
|
|
|
|
{
|
|
|
|
|
|
var startPoint = Vector3.zero;
|
|
|
|
|
|
var toPoint = Vector3.zero;
|
|
|
|
|
|
var firstPoint = Vector3.zero;
|
|
|
|
|
|
|
|
|
|
|
|
var radar = m_Radars[serie.radarIndex];
|
|
|
|
|
|
var indicatorNum = radar.indicatorList.Count;
|
|
|
|
|
|
var angle = 2 * Mathf.PI / indicatorNum;
|
|
|
|
|
|
var centerPos = radar.runtimeCenterPos;
|
|
|
|
|
|
var serieNameCount = -1;
|
|
|
|
|
|
serie.animation.InitProgress(1, 0, 1);
|
|
|
|
|
|
if (!IsActive(i) || serie.animation.HasFadeOut())
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
var rate = serie.animation.GetCurrRate();
|
|
|
|
|
|
var dataChanging = false;
|
|
|
|
|
|
var dataChangeDuration = serie.animation.GetUpdateAnimationDuration();
|
|
|
|
|
|
for (int j = 0; j < serie.data.Count; j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
var serieData = serie.data[j];
|
|
|
|
|
|
int key = i * 1000 + j;
|
|
|
|
|
|
if (!radar.runtimeDataPosList.ContainsKey(key))
|
|
|
|
|
|
{
|
|
|
|
|
|
radar.runtimeDataPosList.Add(i * 1000 + j, new List<Vector3>(serieData.data.Count));
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
radar.runtimeDataPosList[key].Clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
string dataName = serieData.name;
|
|
|
|
|
|
int serieIndex = 0;
|
|
|
|
|
|
if (string.IsNullOrEmpty(dataName))
|
|
|
|
|
|
{
|
|
|
|
|
|
serieNameCount++;
|
|
|
|
|
|
serieIndex = serieNameCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!serieNameSet.ContainsKey(dataName))
|
|
|
|
|
|
{
|
|
|
|
|
|
serieNameSet.Add(dataName, serieNameCount);
|
|
|
|
|
|
serieNameCount++;
|
|
|
|
|
|
serieIndex = serieNameCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
serieIndex = serieNameSet[dataName];
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!serieData.show)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2020-03-20 08:31:22 +08:00
|
|
|
|
var isHighlight = serie.highlighted || serieData.highlighted ||
|
|
|
|
|
|
(m_Tooltip.show && m_Tooltip.runtimeDataIndex[0] == i && m_Tooltip.runtimeDataIndex[1] == j);
|
|
|
|
|
|
var areaColor = SerieHelper.GetAreaColor(serie, m_ThemeInfo, serieIndex, isHighlight);
|
|
|
|
|
|
var areaToColor = SerieHelper.GetAreaToColor(serie, m_ThemeInfo, serieIndex, isHighlight);
|
|
|
|
|
|
var lineColor = SerieHelper.GetLineColor(serie, m_ThemeInfo, serieIndex, isHighlight);
|
|
|
|
|
|
int dataCount = radar.indicatorList.Count;
|
|
|
|
|
|
List<Vector3> pointList = radar.runtimeDataPosList[key];
|
|
|
|
|
|
for (int n = 0; n < dataCount; n++)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2020-03-20 08:31:22 +08:00
|
|
|
|
if (n >= serieData.data.Count) break;
|
|
|
|
|
|
float min = radar.GetIndicatorMin(n);
|
|
|
|
|
|
float max = radar.GetIndicatorMax(n);
|
|
|
|
|
|
float value = serieData.GetCurrData(n, dataChangeDuration);
|
|
|
|
|
|
if (serieData.IsDataChanged()) dataChanging = true;
|
|
|
|
|
|
if (max == 0)
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
2020-03-20 08:31:22 +08:00
|
|
|
|
serie.GetMinMaxData(n, out min, out max);
|
|
|
|
|
|
min = radar.GetIndicatorMin(n);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
}
|
2020-03-20 08:31:22 +08:00
|
|
|
|
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)
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
2020-03-20 08:31:22 +08:00
|
|
|
|
startPoint = new Vector3(centerPos.x + radius * Mathf.Sin(currAngle),
|
|
|
|
|
|
centerPos.y + radius * Mathf.Cos(currAngle));
|
|
|
|
|
|
firstPoint = startPoint;
|
2019-08-04 15:24:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2020-03-20 08:31:22 +08:00
|
|
|
|
toPoint = new Vector3(centerPos.x + radius * Mathf.Sin(currAngle),
|
|
|
|
|
|
centerPos.y + radius * Mathf.Cos(currAngle));
|
|
|
|
|
|
if (serie.areaStyle.show)
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
2020-03-20 08:31:22 +08:00
|
|
|
|
ChartDrawer.DrawTriangle(vh, startPoint, toPoint, centerPos, areaColor, areaColor, areaToColor);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
}
|
2020-03-20 08:31:22 +08:00
|
|
|
|
if (serie.lineStyle.show)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2020-03-20 08:31:22 +08:00
|
|
|
|
DrawLineStyle(vh, serie.lineStyle, startPoint, toPoint, lineColor);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
}
|
2020-03-20 08:31:22 +08:00
|
|
|
|
startPoint = toPoint;
|
2019-08-04 15:24:31 +08:00
|
|
|
|
}
|
2020-03-20 08:31:22 +08:00
|
|
|
|
pointList.Add(startPoint);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (serie.areaStyle.show)
|
|
|
|
|
|
{
|
|
|
|
|
|
ChartDrawer.DrawTriangle(vh, startPoint, firstPoint, centerPos, areaColor, areaColor, areaToColor);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (serie.lineStyle.show)
|
|
|
|
|
|
{
|
|
|
|
|
|
DrawLineStyle(vh, serie.lineStyle, startPoint, firstPoint, lineColor);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (serie.symbol.type != SerieSymbolType.None)
|
|
|
|
|
|
{
|
|
|
|
|
|
var symbolSize = (isHighlight ? serie.symbol.selectedSize : serie.symbol.size);
|
|
|
|
|
|
var symbolColor = SerieHelper.GetItemColor(serie, serieData, m_ThemeInfo, serieIndex, isHighlight);
|
|
|
|
|
|
var symbolToColor = SerieHelper.GetItemToColor(serie, serieData, m_ThemeInfo, serieIndex, isHighlight);
|
|
|
|
|
|
var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, isHighlight);
|
2020-03-29 10:57:59 +08:00
|
|
|
|
var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, isHighlight);
|
2020-03-20 08:31:22 +08:00
|
|
|
|
foreach (var point in pointList)
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
2020-03-20 08:31:22 +08:00
|
|
|
|
DrawSymbol(vh, serie.symbol.type, symbolSize, symbolBorder, point, symbolColor,
|
2020-03-29 10:57:59 +08:00
|
|
|
|
symbolToColor, serie.symbol.gap, cornerRadius);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
}
|
2020-03-20 08:31:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!serie.animation.IsFinish())
|
|
|
|
|
|
{
|
|
|
|
|
|
serie.animation.CheckProgress(1);
|
|
|
|
|
|
RefreshChart();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (dataChanging)
|
|
|
|
|
|
{
|
|
|
|
|
|
RefreshChart();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void DrawSingleRadar(VertexHelper vh, Serie serie, int i)
|
|
|
|
|
|
{
|
|
|
|
|
|
var startPoint = Vector3.zero;
|
|
|
|
|
|
var toPoint = Vector3.zero;
|
|
|
|
|
|
var firstPoint = Vector3.zero;
|
|
|
|
|
|
|
|
|
|
|
|
var radar = m_Radars[serie.radarIndex];
|
|
|
|
|
|
var indicatorNum = radar.indicatorList.Count;
|
|
|
|
|
|
var angle = 2 * Mathf.PI / indicatorNum;
|
|
|
|
|
|
var centerPos = radar.runtimeCenterPos;
|
|
|
|
|
|
var serieNameCount = -1;
|
|
|
|
|
|
serie.animation.InitProgress(1, 0, 1);
|
|
|
|
|
|
if (!IsActive(i) || serie.animation.HasFadeOut())
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
var rate = serie.animation.GetCurrRate();
|
|
|
|
|
|
var dataChanging = false;
|
|
|
|
|
|
var dataChangeDuration = serie.animation.GetUpdateAnimationDuration();
|
|
|
|
|
|
int key = i * 1000;
|
|
|
|
|
|
if (!radar.runtimeDataPosList.ContainsKey(key))
|
|
|
|
|
|
{
|
|
|
|
|
|
radar.runtimeDataPosList.Add(i * 1000, new List<Vector3>(serie.dataCount));
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
radar.runtimeDataPosList[key].Clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
var pointList = radar.runtimeDataPosList[key];
|
|
|
|
|
|
var startIndex = GetStartShowIndex(serie);
|
|
|
|
|
|
var endIndex = GetEndShowIndex(serie);
|
|
|
|
|
|
for (int j = 0; j < serie.data.Count; j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
var serieData = serie.data[j];
|
|
|
|
|
|
serieData.index = j;
|
|
|
|
|
|
string dataName = serieData.name;
|
|
|
|
|
|
int serieIndex = 0;
|
|
|
|
|
|
if (string.IsNullOrEmpty(dataName))
|
|
|
|
|
|
{
|
|
|
|
|
|
serieNameCount++;
|
|
|
|
|
|
serieIndex = serieNameCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!serieNameSet.ContainsKey(dataName))
|
|
|
|
|
|
{
|
|
|
|
|
|
serieNameSet.Add(dataName, serieNameCount);
|
|
|
|
|
|
serieNameCount++;
|
|
|
|
|
|
serieIndex = serieNameCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
serieIndex = serieNameSet[dataName];
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!serieData.show)
|
|
|
|
|
|
{
|
|
|
|
|
|
serieData.labelPosition = Vector3.zero;
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
var isHighlight = serie.highlighted || serieData.highlighted ||
|
|
|
|
|
|
(m_Tooltip.show && m_Tooltip.runtimeDataIndex[0] == i && m_Tooltip.runtimeDataIndex[1] == j);
|
|
|
|
|
|
var areaColor = SerieHelper.GetAreaColor(serie, m_ThemeInfo, serieIndex, isHighlight);
|
|
|
|
|
|
var areaToColor = SerieHelper.GetAreaToColor(serie, m_ThemeInfo, serieIndex, isHighlight);
|
|
|
|
|
|
var lineColor = SerieHelper.GetLineColor(serie, m_ThemeInfo, serieIndex, isHighlight);
|
|
|
|
|
|
int dataCount = radar.indicatorList.Count;
|
|
|
|
|
|
var index = serieData.index;
|
|
|
|
|
|
var p = radar.runtimeCenterPos;
|
|
|
|
|
|
var min = radar.GetIndicatorMin(index);
|
|
|
|
|
|
var max = radar.GetIndicatorMax(index);
|
|
|
|
|
|
var value = serieData.GetCurrData(1, dataChangeDuration);
|
|
|
|
|
|
if (serieData.IsDataChanged()) dataChanging = true;
|
|
|
|
|
|
if (max == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
serie.GetMinMaxData(index, out min, out max);
|
|
|
|
|
|
min = radar.GetIndicatorMin(index);
|
|
|
|
|
|
}
|
|
|
|
|
|
var radius = max < 0 ? radar.runtimeDataRadius - radar.runtimeDataRadius * value / max
|
|
|
|
|
|
: radar.runtimeDataRadius * value / max;
|
|
|
|
|
|
var currAngle = (index + (radar.positionType == Radar.PositionType.Between ? 0.5f : 0)) * angle;
|
|
|
|
|
|
radius *= rate;
|
|
|
|
|
|
if (index == startIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
startPoint = new Vector3(p.x + radius * Mathf.Sin(currAngle),
|
|
|
|
|
|
p.y + radius * Mathf.Cos(currAngle));
|
|
|
|
|
|
firstPoint = startPoint;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
toPoint = new Vector3(p.x + radius * Mathf.Sin(currAngle),
|
|
|
|
|
|
p.y + radius * Mathf.Cos(currAngle));
|
|
|
|
|
|
if (serie.areaStyle.show)
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
2020-03-20 08:31:22 +08:00
|
|
|
|
ChartDrawer.DrawTriangle(vh, startPoint, toPoint, p, areaColor, areaColor, areaToColor);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
}
|
2020-03-20 08:31:22 +08:00
|
|
|
|
if (serie.lineStyle.show)
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
2020-03-20 08:31:22 +08:00
|
|
|
|
DrawLineStyle(vh, serie.lineStyle, startPoint, toPoint, lineColor);
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
2020-03-20 08:31:22 +08:00
|
|
|
|
startPoint = toPoint;
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
2020-03-20 08:31:22 +08:00
|
|
|
|
serieData.labelPosition = startPoint;
|
|
|
|
|
|
pointList.Add(startPoint);
|
|
|
|
|
|
|
|
|
|
|
|
if (serie.areaStyle.show && j == endIndex)
|
2019-10-14 19:22:30 +08:00
|
|
|
|
{
|
2020-03-20 08:31:22 +08:00
|
|
|
|
ChartDrawer.DrawTriangle(vh, startPoint, firstPoint, centerPos, areaColor, areaColor, areaToColor);
|
2019-10-14 19:22:30 +08:00
|
|
|
|
}
|
2020-03-20 08:31:22 +08:00
|
|
|
|
if (serie.lineStyle.show && j == endIndex)
|
2019-12-03 07:49:37 +08:00
|
|
|
|
{
|
2020-03-20 08:31:22 +08:00
|
|
|
|
DrawLineStyle(vh, serie.lineStyle, startPoint, firstPoint, lineColor);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (serie.symbol.type != SerieSymbolType.None)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int j = 0; j < serie.data.Count; j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
var serieData = serie.data[j];
|
|
|
|
|
|
if (!serieData.show) continue;
|
|
|
|
|
|
var isHighlight = serie.highlighted || serieData.highlighted ||
|
|
|
|
|
|
(m_Tooltip.show && m_Tooltip.runtimeDataIndex[0] == i && m_Tooltip.runtimeDataIndex[1] == j);
|
|
|
|
|
|
var serieIndex = serieData.index;
|
|
|
|
|
|
var symbolSize = (isHighlight ? serie.symbol.selectedSize : serie.symbol.size);
|
|
|
|
|
|
var symbolColor = SerieHelper.GetItemColor(serie, serieData, m_ThemeInfo, serieIndex, isHighlight);
|
|
|
|
|
|
var symbolToColor = SerieHelper.GetItemToColor(serie, serieData, m_ThemeInfo, serieIndex, isHighlight);
|
|
|
|
|
|
var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, isHighlight);
|
2020-03-29 10:57:59 +08:00
|
|
|
|
var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, isHighlight);
|
2020-03-20 08:31:22 +08:00
|
|
|
|
DrawSymbol(vh, serie.symbol.type, symbolSize, symbolBorder, serieData.labelPosition, symbolColor,
|
2020-03-29 10:57:59 +08:00
|
|
|
|
symbolToColor, serie.symbol.gap, cornerRadius);
|
2020-03-20 08:31:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!serie.animation.IsFinish())
|
|
|
|
|
|
{
|
|
|
|
|
|
serie.animation.CheckProgress(1);
|
|
|
|
|
|
RefreshChart();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (dataChanging)
|
|
|
|
|
|
{
|
|
|
|
|
|
RefreshChart();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private int GetStartShowIndex(Serie serie)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < serie.dataCount; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (serie.data[i].show) return i;
|
|
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
private int GetEndShowIndex(Serie serie)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = serie.dataCount - 1; i >= 0; i--)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (serie.data[i].show) return i;
|
|
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void DrawRadarSymbol(VertexHelper vh, Serie serie, SerieData serieData, int serieIndex, bool isHighlight,
|
|
|
|
|
|
List<Vector3> pointList)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (serie.symbol.type != SerieSymbolType.None)
|
|
|
|
|
|
{
|
|
|
|
|
|
var symbolSize = (isHighlight ? serie.symbol.selectedSize : serie.symbol.size);
|
|
|
|
|
|
var symbolColor = SerieHelper.GetItemColor(serie, serieData, m_ThemeInfo, serieIndex, isHighlight);
|
|
|
|
|
|
var symbolToColor = SerieHelper.GetItemToColor(serie, serieData, m_ThemeInfo, serieIndex, isHighlight);
|
|
|
|
|
|
var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, isHighlight);
|
2020-03-29 10:57:59 +08:00
|
|
|
|
var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, isHighlight);
|
2020-03-20 08:31:22 +08:00
|
|
|
|
foreach (var point in pointList)
|
|
|
|
|
|
{
|
|
|
|
|
|
DrawSymbol(vh, serie.symbol.type, symbolSize, symbolBorder, point, symbolColor,
|
2020-03-29 10:57:59 +08:00
|
|
|
|
symbolToColor, serie.symbol.gap, cornerRadius);
|
2019-12-03 07:49:37 +08:00
|
|
|
|
}
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2019-08-04 15:24:31 +08:00
|
|
|
|
private void DrawRadar(VertexHelper vh, Radar radar)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2020-02-12 19:13:44 +08:00
|
|
|
|
if (!radar.splitLine.show && !radar.splitArea.show)
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2019-05-11 04:33:54 +08:00
|
|
|
|
float insideRadius = 0, outsideRadius = 0;
|
2019-11-02 08:24:37 +08:00
|
|
|
|
float block = radar.runtimeRadius / radar.splitNumber;
|
2019-08-04 15:24:31 +08:00
|
|
|
|
int indicatorNum = radar.indicatorList.Count;
|
2019-05-11 04:33:54 +08:00
|
|
|
|
Vector3 p1, p2, p3, p4;
|
2019-11-02 08:24:37 +08:00
|
|
|
|
Vector3 p = radar.runtimeCenterPos;
|
2019-05-11 04:33:54 +08:00
|
|
|
|
float angle = 2 * Mathf.PI / indicatorNum;
|
2019-08-04 15:24:31 +08:00
|
|
|
|
var lineColor = GetLineColor(radar);
|
|
|
|
|
|
for (int i = 0; i < radar.splitNumber; i++)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2019-08-04 15:24:31 +08:00
|
|
|
|
Color color = radar.splitArea.color[i % radar.splitArea.color.Count];
|
2019-05-11 04:33:54 +08:00
|
|
|
|
outsideRadius = insideRadius + block;
|
|
|
|
|
|
p1 = new Vector3(p.x + insideRadius * Mathf.Sin(0), p.y + insideRadius * Mathf.Cos(0));
|
|
|
|
|
|
p2 = new Vector3(p.x + outsideRadius * Mathf.Sin(0), p.y + outsideRadius * Mathf.Cos(0));
|
|
|
|
|
|
for (int j = 0; j <= indicatorNum; j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
float currAngle = j * angle;
|
|
|
|
|
|
p3 = new Vector3(p.x + outsideRadius * Mathf.Sin(currAngle),
|
|
|
|
|
|
p.y + outsideRadius * Mathf.Cos(currAngle));
|
|
|
|
|
|
p4 = new Vector3(p.x + insideRadius * Mathf.Sin(currAngle),
|
|
|
|
|
|
p.y + insideRadius * Mathf.Cos(currAngle));
|
2019-08-04 15:24:31 +08:00
|
|
|
|
if (radar.splitArea.show)
|
|
|
|
|
|
{
|
2019-10-01 13:31:34 +08:00
|
|
|
|
ChartDrawer.DrawPolygon(vh, p1, p2, p3, p4, color);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
}
|
2020-02-12 19:13:44 +08:00
|
|
|
|
if (radar.splitLine.NeedShow(i))
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
2020-02-12 19:13:44 +08:00
|
|
|
|
DrawLineStyle(vh, radar.splitLine.lineStyle, p2, p3, lineColor);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
}
|
2019-05-11 04:33:54 +08:00
|
|
|
|
p1 = p4;
|
|
|
|
|
|
p2 = p3;
|
|
|
|
|
|
}
|
|
|
|
|
|
insideRadius = outsideRadius;
|
|
|
|
|
|
}
|
|
|
|
|
|
for (int j = 0; j <= indicatorNum; j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
float currAngle = j * angle;
|
|
|
|
|
|
p3 = new Vector3(p.x + outsideRadius * Mathf.Sin(currAngle),
|
|
|
|
|
|
p.y + outsideRadius * Mathf.Cos(currAngle));
|
2020-02-12 19:13:44 +08:00
|
|
|
|
if (radar.splitLine.show)
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
2020-02-12 19:13:44 +08:00
|
|
|
|
DrawLineStyle(vh, radar.splitLine.lineStyle, p, p3, lineColor);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
}
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2019-08-04 15:24:31 +08:00
|
|
|
|
private void DrawCricleRadar(VertexHelper vh, Radar radar)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2020-02-12 19:13:44 +08:00
|
|
|
|
if (!radar.splitLine.show && !radar.splitArea.show)
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2019-05-11 04:33:54 +08:00
|
|
|
|
float insideRadius = 0, outsideRadius = 0;
|
2019-11-02 08:24:37 +08:00
|
|
|
|
float block = radar.runtimeRadius / radar.splitNumber;
|
2019-08-04 15:24:31 +08:00
|
|
|
|
int indicatorNum = radar.indicatorList.Count;
|
2019-11-02 08:24:37 +08:00
|
|
|
|
Vector3 p = radar.runtimeCenterPos;
|
2019-05-11 04:33:54 +08:00
|
|
|
|
Vector3 p1;
|
|
|
|
|
|
float angle = 2 * Mathf.PI / indicatorNum;
|
2019-08-04 15:24:31 +08:00
|
|
|
|
var lineColor = GetLineColor(radar);
|
|
|
|
|
|
for (int i = 0; i < radar.splitNumber; i++)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2019-08-04 15:24:31 +08:00
|
|
|
|
Color color = radar.splitArea.color[i % radar.splitArea.color.Count];
|
2019-05-11 04:33:54 +08:00
|
|
|
|
outsideRadius = insideRadius + block;
|
2019-08-04 15:24:31 +08:00
|
|
|
|
if (radar.splitArea.show)
|
|
|
|
|
|
{
|
2019-10-10 09:01:16 +08:00
|
|
|
|
ChartDrawer.DrawDoughnut(vh, p, insideRadius, outsideRadius, color, Color.clear,
|
|
|
|
|
|
m_Settings.cicleSmoothness, 0, 360);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
}
|
2020-02-12 19:13:44 +08:00
|
|
|
|
if (radar.splitLine.show)
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
2020-02-12 19:13:44 +08:00
|
|
|
|
ChartDrawer.DrawEmptyCricle(vh, p, outsideRadius, radar.splitLine.lineStyle.width, lineColor,
|
2019-10-10 09:01:16 +08:00
|
|
|
|
Color.clear, m_Settings.cicleSmoothness);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
}
|
2019-05-11 04:33:54 +08:00
|
|
|
|
insideRadius = outsideRadius;
|
|
|
|
|
|
}
|
|
|
|
|
|
for (int j = 0; j <= indicatorNum; j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
float currAngle = j * angle;
|
|
|
|
|
|
p1 = new Vector3(p.x + outsideRadius * Mathf.Sin(currAngle),
|
|
|
|
|
|
p.y + outsideRadius * Mathf.Cos(currAngle));
|
2020-02-12 19:13:44 +08:00
|
|
|
|
if (radar.splitLine.show)
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
2020-02-12 19:13:44 +08:00
|
|
|
|
ChartDrawer.DrawLine(vh, p, p1, radar.splitLine.lineStyle.width / 2, lineColor);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
}
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2019-08-04 15:24:31 +08:00
|
|
|
|
private Color GetLineColor(Radar radar)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2020-02-12 19:13:44 +08:00
|
|
|
|
return radar.splitLine.GetColor(m_ThemeInfo);
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override void CheckTootipArea(Vector2 local)
|
|
|
|
|
|
{
|
2019-08-04 15:24:31 +08:00
|
|
|
|
if (m_IsEnterLegendButtom) return;
|
|
|
|
|
|
|
|
|
|
|
|
bool highlight = false;
|
2019-05-11 04:33:54 +08:00
|
|
|
|
for (int i = 0; i < m_Series.Count; i++)
|
|
|
|
|
|
{
|
2019-05-15 09:44:18 +08:00
|
|
|
|
if (!IsActive(i)) continue;
|
2019-08-04 15:24:31 +08:00
|
|
|
|
var serie = m_Series.GetSerie(i);
|
|
|
|
|
|
var radar = m_Radars[serie.radarIndex];
|
2019-11-02 08:24:37 +08:00
|
|
|
|
var dist = Vector2.Distance(radar.runtimeCenterPos, local);
|
|
|
|
|
|
if (dist > radar.runtimeRadius + serie.symbol.size)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2019-08-04 15:24:31 +08:00
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2020-03-20 08:31:22 +08:00
|
|
|
|
switch (serie.radarType)
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
2020-03-20 08:31:22 +08:00
|
|
|
|
case RadarType.Multiple:
|
|
|
|
|
|
for (int n = 0; n < serie.data.Count; n++)
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
2020-03-20 08:31:22 +08:00
|
|
|
|
var posKey = i * 1000 + n;
|
|
|
|
|
|
if (radar.runtimeDataPosList.ContainsKey(posKey))
|
|
|
|
|
|
{
|
|
|
|
|
|
var posList = radar.runtimeDataPosList[posKey];
|
|
|
|
|
|
foreach (var pos in posList)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (Vector2.Distance(pos, local) <= serie.symbol.size * 1.2f)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Tooltip.runtimeDataIndex[0] = i;
|
|
|
|
|
|
m_Tooltip.runtimeDataIndex[1] = n;
|
|
|
|
|
|
highlight = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case RadarType.Single:
|
|
|
|
|
|
for (int n = 0; n < serie.data.Count; n++)
|
|
|
|
|
|
{
|
|
|
|
|
|
var serieData = serie.data[n];
|
|
|
|
|
|
if (Vector2.Distance(serieData.labelPosition, local) <= serie.symbol.size * 1.2f)
|
2019-08-04 15:24:31 +08:00
|
|
|
|
{
|
2019-11-02 08:24:37 +08:00
|
|
|
|
m_Tooltip.runtimeDataIndex[0] = i;
|
|
|
|
|
|
m_Tooltip.runtimeDataIndex[1] = n;
|
2019-08-04 15:24:31 +08:00
|
|
|
|
highlight = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2020-03-20 08:31:22 +08:00
|
|
|
|
break;
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
2020-03-20 08:31:22 +08:00
|
|
|
|
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
2019-08-07 23:33:27 +08:00
|
|
|
|
|
2019-08-04 15:24:31 +08:00
|
|
|
|
if (!highlight)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2019-08-04 15:24:31 +08:00
|
|
|
|
if (m_Tooltip.IsActive())
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Tooltip.SetActive(false);
|
|
|
|
|
|
RefreshChart();
|
|
|
|
|
|
}
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2019-08-04 15:24:31 +08:00
|
|
|
|
m_Tooltip.UpdateContentPos(new Vector2(local.x + 18, local.y - 25));
|
2020-02-13 09:23:30 +08:00
|
|
|
|
UpdateTooltip();
|
2019-08-04 15:24:31 +08:00
|
|
|
|
RefreshChart();
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-02-13 09:23:30 +08:00
|
|
|
|
protected override void UpdateTooltip()
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2020-02-13 09:23:30 +08:00
|
|
|
|
base.UpdateTooltip();
|
2019-11-02 08:24:37 +08:00
|
|
|
|
int serieIndex = m_Tooltip.runtimeDataIndex[0];
|
2019-08-04 15:24:31 +08:00
|
|
|
|
if (serieIndex < 0)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2019-09-20 08:55:52 +08:00
|
|
|
|
if (m_Tooltip.IsActive())
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Tooltip.SetActive(false);
|
|
|
|
|
|
RefreshChart();
|
|
|
|
|
|
}
|
2019-05-11 04:33:54 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
m_Tooltip.SetActive(true);
|
2019-08-04 15:24:31 +08:00
|
|
|
|
var serie = m_Series.GetSerie(serieIndex);
|
|
|
|
|
|
var radar = m_Radars[serie.radarIndex];
|
2020-03-20 08:31:22 +08:00
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2020-03-21 11:26:50 +08:00
|
|
|
|
TooltipHelper.InitRadarTooltip(ref sb, tooltip, serie, radar, themeInfo);
|
2019-05-29 09:53:30 +08:00
|
|
|
|
m_Tooltip.UpdateContentText(sb.ToString());
|
|
|
|
|
|
var pos = m_Tooltip.GetContentPos();
|
2019-11-02 08:24:37 +08:00
|
|
|
|
if (pos.x + m_Tooltip.runtimeWidth > chartWidth)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2019-11-02 08:24:37 +08:00
|
|
|
|
pos.x = chartWidth - m_Tooltip.runtimeWidth;
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
2019-11-02 08:24:37 +08:00
|
|
|
|
if (pos.y - m_Tooltip.runtimeHeight < 0)
|
2019-05-11 04:33:54 +08:00
|
|
|
|
{
|
2019-11-02 08:24:37 +08:00
|
|
|
|
pos.y = m_Tooltip.runtimeHeight;
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
2019-05-29 09:53:30 +08:00
|
|
|
|
m_Tooltip.UpdateContentPos(pos);
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
2020-03-20 08:31:22 +08:00
|
|
|
|
|
|
|
|
|
|
protected override void OnRefreshLabel()
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < m_Series.Count; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
var serie = m_Series.GetSerie(i);
|
|
|
|
|
|
if (!serie.show && serie.radarType != RadarType.Single) continue;
|
|
|
|
|
|
var radar = m_Radars[serie.radarIndex];
|
|
|
|
|
|
var center = radar.runtimeCenterPos;
|
|
|
|
|
|
for (int n = 0; n < serie.dataCount; n++)
|
|
|
|
|
|
{
|
|
|
|
|
|
var serieData = serie.data[n];
|
|
|
|
|
|
var serieLabel = SerieHelper.GetSerieLabel(serie, serieData);
|
|
|
|
|
|
var labelPos = serieData.labelPosition;
|
|
|
|
|
|
if (serieLabel.margin != 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
labelPos += serieLabel.margin * (labelPos - center).normalized;
|
|
|
|
|
|
}
|
|
|
|
|
|
serieData.SetGameObjectPosition(labelPos);
|
|
|
|
|
|
serieData.UpdateIcon();
|
|
|
|
|
|
if (serie.show && serieLabel.show && serieData.canShowLabel)
|
|
|
|
|
|
{
|
|
|
|
|
|
var value = serieData.GetCurrData(1);
|
|
|
|
|
|
var max = radar.GetIndicatorMax(n);
|
|
|
|
|
|
SerieLabelHelper.ResetLabel(serieData, serieLabel, themeInfo, i);
|
|
|
|
|
|
serieData.SetLabelActive(serieData.labelPosition != Vector3.zero);
|
|
|
|
|
|
serieData.SetLabelPosition(serieLabel.offset);
|
|
|
|
|
|
var content = serieLabel.GetFormatterContent(serie.name, serieData.name, value, max);
|
|
|
|
|
|
if (serieData.SetLabelText(content)) RefreshChart();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
serieData.SetLabelActive(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2019-05-11 04:33:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|