985 lines
34 KiB
C#
985 lines
34 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Reflection;
|
||
using UnityEngine;
|
||
|
||
namespace XCharts.Runtime
|
||
{
|
||
public partial class BaseChart
|
||
{
|
||
public T AddSerie<T>(string serieName = null, bool show = true, bool addToHead = false) where T : Serie
|
||
{
|
||
if (!CanAddSerie<T>()) return null;
|
||
var index = -1;
|
||
var serie = InsertSerie(index, typeof(T), serieName, show, addToHead) as T;
|
||
CreateSerieHandler(serie);
|
||
return serie;
|
||
}
|
||
|
||
public T InsertSerie<T>(int index, string serieName = null, bool show = true) where T : Serie
|
||
{
|
||
if (!CanAddSerie<T>()) return null;
|
||
return InsertSerie(index, typeof(T), serieName, show) as T;
|
||
}
|
||
|
||
public void InsertSerie(Serie serie, int index = -1, bool addToHead = false)
|
||
{
|
||
serie.AnimationRestart();
|
||
AnimationStyleHelper.UpdateSerieAnimation(serie);
|
||
if (addToHead) m_Series.Insert(0, serie);
|
||
else if (index >= 0) m_Series.Insert(index, serie);
|
||
else m_Series.Add(serie);
|
||
ResetSeriesIndex();
|
||
SeriesHelper.UpdateSerieNameList(this, ref m_LegendRealShowName);
|
||
}
|
||
|
||
public bool MoveUpSerie(int serieIndex)
|
||
{
|
||
if (serieIndex < 0 || serieIndex > m_Series.Count - 1) return false;
|
||
if (serieIndex == 0) return false;
|
||
var up = GetSerie(serieIndex - 1);
|
||
var temp = GetSerie(serieIndex);
|
||
m_Series[serieIndex - 1] = temp;
|
||
m_Series[serieIndex] = up;
|
||
ResetSeriesIndex();
|
||
InitSerieHandlers();
|
||
RefreshChart();
|
||
return true;
|
||
}
|
||
|
||
public bool MoveDownSerie(int serieIndex)
|
||
{
|
||
if (serieIndex < 0 || serieIndex > m_Series.Count - 1) return false;
|
||
if (serieIndex == m_Series.Count - 1) return false;
|
||
var down = GetSerie(serieIndex + 1);
|
||
var temp = GetSerie(serieIndex);
|
||
m_Series[serieIndex + 1] = temp;
|
||
m_Series[serieIndex] = down;
|
||
ResetSeriesIndex();
|
||
InitSerieHandlers();
|
||
RefreshChart();
|
||
return true;
|
||
}
|
||
|
||
public bool CanAddSerie<T>() where T : Serie
|
||
{
|
||
return CanAddSerie(typeof(T));
|
||
}
|
||
|
||
public bool CanAddSerie(Type type)
|
||
{
|
||
return m_TypeListForSerie.ContainsKey(type);
|
||
}
|
||
|
||
public bool HasSerie<T>() where T : Serie
|
||
{
|
||
return HasSerie(typeof(T));
|
||
}
|
||
|
||
public bool HasSerie(Type type)
|
||
{
|
||
if (!type.IsSubclassOf(typeof(Serie))) return false;
|
||
foreach (var serie in m_Series)
|
||
{
|
||
if (serie.GetType() == type)
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
public T GetSerie<T>() where T : Serie
|
||
{
|
||
foreach (var serie in m_Series)
|
||
{
|
||
if (serie is T) return serie as T;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
public Serie GetSerie(string serieName)
|
||
{
|
||
foreach (var serie in m_Series)
|
||
{
|
||
if (serie.serieName.Equals(serieName)) return serie;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
public Serie GetSerie(int serieIndex)
|
||
{
|
||
if (serieIndex < 0 || serieIndex > m_Series.Count - 1) return null;
|
||
return m_Series[serieIndex];
|
||
}
|
||
|
||
public T GetSerie<T>(int serieIndex) where T : Serie
|
||
{
|
||
if (serieIndex < 0 || serieIndex > m_Series.Count - 1) return null;
|
||
return m_Series[serieIndex] as T;
|
||
}
|
||
|
||
public void RemoveSerie(string serieName)
|
||
{
|
||
for (int i = m_Series.Count - 1; i >= 0; i--)
|
||
{
|
||
var serie = m_Series[i];
|
||
if (string.IsNullOrEmpty(serie.serieName) && serie.serieName.Equals(serieName))
|
||
RemoveSerie(serie);
|
||
}
|
||
}
|
||
|
||
public void RemoveSerie(int serieIndex)
|
||
{
|
||
if (serieIndex < 0 || serieIndex > m_Series.Count - 1) return;
|
||
RemoveSerie(m_Series[serieIndex]);
|
||
}
|
||
|
||
public void RemoveSerie<T>() where T : Serie
|
||
{
|
||
for (int i = m_Series.Count - 1; i >= 0; i--)
|
||
{
|
||
var serie = m_Series[i];
|
||
if (serie is T)
|
||
RemoveSerie(serie);
|
||
}
|
||
}
|
||
|
||
public void RemoveSerie(Serie serie)
|
||
{
|
||
serie.OnRemove();
|
||
m_SerieHandlers.Remove(serie.handler);
|
||
m_Series.Remove(serie);
|
||
RefreshChart();
|
||
}
|
||
|
||
public bool CovertSerie<T>(Serie serie) where T : Serie
|
||
{
|
||
return CovertSerie(serie, typeof(T));
|
||
}
|
||
|
||
public bool CovertSerie(Serie serie, Type type)
|
||
{
|
||
try
|
||
{
|
||
var newSerie = type.InvokeMember("CovertSerie",
|
||
BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null,
|
||
new object[] { serie }) as Serie;
|
||
return ReplaceSerie(serie, newSerie);
|
||
}
|
||
catch
|
||
{
|
||
Debug.LogError(string.Format("CovertSerie Failed: can't found {0}.CovertSerie(Serie serie)", type.Name));
|
||
return false;
|
||
}
|
||
}
|
||
|
||
public bool ReplaceSerie(Serie oldSerie, Serie newSerie)
|
||
{
|
||
if (oldSerie == null || newSerie == null)
|
||
return false;
|
||
|
||
var index = m_Series.IndexOf(oldSerie);
|
||
if (index < 0)
|
||
return false;
|
||
AnimationStyleHelper.UpdateSerieAnimation(newSerie);
|
||
oldSerie.OnRemove();
|
||
m_Series.RemoveAt(index);
|
||
m_Series.Insert(index, newSerie);
|
||
ResetSeriesIndex();
|
||
InitSerieHandlers();
|
||
RefreshAllComponent();
|
||
RefreshChart();
|
||
return true;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Add a data to serie.
|
||
/// |If serieName doesn't exist in legend,will be add to legend.
|
||
/// |添加一个数据到指定的系列中。
|
||
/// </summary>
|
||
/// <param name="serieName">the name of serie</param>
|
||
/// <param name="data">the data to add</param>
|
||
/// <param name="dataName">the name of data</param>
|
||
/// <param name="dataId">the unique id of data</param>
|
||
/// <returns>Returns True on success</returns>
|
||
public SerieData AddData(string serieName, double data, string dataName = null, string dataId = null)
|
||
{
|
||
var serie = GetSerie(serieName);
|
||
if (serie != null)
|
||
{
|
||
var serieData = serie.AddYData(data, dataName, dataId);
|
||
RefreshPainter(serie.painter);
|
||
return serieData;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Add a data to serie.
|
||
/// |添加一个数据到指定的系列中。
|
||
/// </summary>
|
||
/// <param name="serieIndex">the index of serie</param>
|
||
/// <param name="data">the data to add</param>
|
||
/// <param name="dataName">the name of data</param>
|
||
/// <param name="dataId">the unique id of data</param>
|
||
/// <returns>Returns True on success</returns>
|
||
public SerieData AddData(int serieIndex, double data, string dataName = null, string dataId = null)
|
||
{
|
||
var serie = GetSerie(serieIndex);
|
||
if (serie != null)
|
||
{
|
||
var serieData = serie.AddYData(data, dataName, dataId);
|
||
RefreshPainter(serie.painter);
|
||
return serieData;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Add an arbitray dimension data to serie,such as (x,y,z,...).
|
||
/// |添加多维数据(x,y,z...)到指定的系列中。
|
||
/// </summary>
|
||
/// <param name="serieName">the name of serie</param>
|
||
/// <param name="multidimensionalData">the (x,y,z,...) data</param>
|
||
/// <param name="dataName">the name of data</param>
|
||
/// <param name="dataId">the unique id of data</param>
|
||
/// <returns>Returns True on success</returns>
|
||
public SerieData AddData(string serieName, List<double> multidimensionalData, string dataName = null, string dataId = null)
|
||
{
|
||
var serie = GetSerie(serieName);
|
||
if (serie != null)
|
||
{
|
||
var serieData = serie.AddData(multidimensionalData, dataName, dataId);
|
||
RefreshPainter(serie.painter);
|
||
return serieData;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Add an arbitray dimension data to serie,such as (x,y,z,...).
|
||
/// |添加多维数据(x,y,z...)到指定的系列中。
|
||
/// </summary>
|
||
/// <param name="serieIndex">the index of serie,index starts at 0</param>
|
||
/// <param name="multidimensionalData">the (x,y,z,...) data</param>
|
||
/// <param name="dataName">the name of data</param>
|
||
/// <param name="dataId">the unique id of data</param>
|
||
/// <returns>Returns True on success</returns>
|
||
public SerieData AddData(int serieIndex, List<double> multidimensionalData, string dataName = null, string dataId = null)
|
||
{
|
||
var serie = GetSerie(serieIndex);
|
||
if (serie != null)
|
||
{
|
||
var serieData = serie.AddData(multidimensionalData, dataName, dataId);
|
||
RefreshPainter(serie.painter);
|
||
return serieData;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Add a (x,y) data to serie.
|
||
/// |添加(x,y)数据到指定系列中。
|
||
/// </summary>
|
||
/// <param name="serieName">the name of serie</param>
|
||
/// <param name="xValue">x data</param>
|
||
/// <param name="yValue">y data</param>
|
||
/// <param name="dataName">the name of data</param>
|
||
/// <param name="dataId">the unique id of data</param>
|
||
/// <returns>Returns True on success</returns>
|
||
public SerieData AddData(string serieName, double xValue, double yValue, string dataName = null, string dataId = null)
|
||
{
|
||
var serie = GetSerie(serieName);
|
||
if (serie != null)
|
||
{
|
||
var serieData = serie.AddXYData(xValue, yValue, dataName, dataId);
|
||
RefreshPainter(serie.painter);
|
||
return serieData;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Add a (x,y) data to serie.
|
||
/// |添加(x,y)数据到指定系列中。
|
||
/// </summary>
|
||
/// <param name="serieIndex">the index of serie</param>
|
||
/// <param name="xValue">x data</param>
|
||
/// <param name="yValue">y data</param>
|
||
/// <param name="dataName">the name of data</param>
|
||
/// <param name="dataId">the unique id of data</param>
|
||
/// <returns>Returns True on success</returns>
|
||
public SerieData AddData(int serieIndex, double xValue, double yValue, string dataName = null, string dataId = null)
|
||
{
|
||
var serie = GetSerie(serieIndex);
|
||
if (serie != null)
|
||
{
|
||
var serieData = serie.AddXYData(xValue, yValue, dataName, dataId);
|
||
RefreshPainter(serie.painter);
|
||
return serieData;
|
||
}
|
||
return null;
|
||
}
|
||
/// <summary>
|
||
/// Add a (time,y) data to serie.
|
||
/// |添加(time,y)数据到指定的系列中。
|
||
/// </summary>
|
||
/// <param name="serieName"></param>
|
||
/// <param name="time"></param>
|
||
/// <param name="yValue"></param>
|
||
/// <param name="dataName"></param>
|
||
/// <param name="dataId"></param>
|
||
/// <returns></returns>
|
||
public SerieData AddData(string serieName, DateTime time, double yValue, string dataName = null, string dataId = null)
|
||
{
|
||
var xValue = DateTimeUtil.GetTimestamp(time);
|
||
return AddData(serieName, xValue, yValue, dataName, dataId);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Add a (time,y) data to serie.
|
||
/// |添加(time,y)数据到指定的系列中。
|
||
/// </summary>
|
||
/// <param name="serieIndex"></param>
|
||
/// <param name="time"></param>
|
||
/// <param name="yValue"></param>
|
||
/// <param name="dataName"></param>
|
||
/// <param name="dataId"></param>
|
||
/// <returns></returns>
|
||
public SerieData AddData(int serieIndex, DateTime time, double yValue, string dataName = null, string dataId = null)
|
||
{
|
||
var xValue = DateTimeUtil.GetTimestamp(time);
|
||
return AddData(serieIndex, xValue, yValue, dataName, dataId);
|
||
}
|
||
|
||
public SerieData AddData(int serieIndex, double open, double close, double lowest, double heighest, string dataName = null, string dataId = null)
|
||
{
|
||
var serie = GetSerie(serieIndex);
|
||
if (serie != null)
|
||
{
|
||
var serieData = serie.AddData(open, close, lowest, heighest, dataName, dataId);
|
||
RefreshPainter(serie.painter);
|
||
return serieData;
|
||
}
|
||
return null;
|
||
}
|
||
public SerieData AddData(string serieName, double open, double close, double lowest, double heighest, string dataName = null, string dataId = null)
|
||
{
|
||
var serie = GetSerie(serieName);
|
||
if (serie != null)
|
||
{
|
||
var serieData = serie.AddData(open, close, lowest, heighest, dataName, dataId);
|
||
RefreshPainter(serie.painter);
|
||
return serieData;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Update serie data by serie name.
|
||
/// |更新指定系列中的指定索引数据。
|
||
/// </summary>
|
||
/// <param name="serieName">the name of serie</param>
|
||
/// <param name="dataIndex">the index of data</param>
|
||
/// <param name="value">the data will be update</param>
|
||
public bool UpdateData(string serieName, int dataIndex, double value)
|
||
{
|
||
var serie = GetSerie(serieName);
|
||
if (serie != null)
|
||
{
|
||
serie.UpdateYData(dataIndex, value);
|
||
RefreshPainter(serie);
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Update serie data by serie index.
|
||
/// |更新指定系列中的指定索引数据。
|
||
/// </summary>
|
||
/// <param name="serieIndex">the index of serie</param>
|
||
/// <param name="dataIndex">the index of data</param>
|
||
/// <param name="value">the data will be update</param>
|
||
public bool UpdateData(int serieIndex, int dataIndex, double value)
|
||
{
|
||
var serie = GetSerie(serieIndex);
|
||
if (serie != null)
|
||
{
|
||
serie.UpdateYData(dataIndex, value);
|
||
RefreshPainter(serie);
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新指定系列指定索引的数据项的多维数据。
|
||
/// </summary>
|
||
/// <param name="serieName"></param>
|
||
/// <param name="dataIndex"></param>
|
||
/// <param name="multidimensionalData">一个数据项的多维数据列表,而不是多个数据项的数据</param>
|
||
public bool UpdateData(string serieName, int dataIndex, List<double> multidimensionalData)
|
||
{
|
||
var serie = GetSerie(serieName);
|
||
if (serie != null)
|
||
{
|
||
serie.UpdateData(dataIndex, multidimensionalData);
|
||
RefreshPainter(serie);
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新指定系列指定索引的数据项的多维数据。
|
||
/// </summary>
|
||
/// <param name="serieIndex"></param>
|
||
/// <param name="dataIndex"></param>
|
||
/// <param name="multidimensionalData">一个数据项的多维数据列表,而不是多个数据项的数据</param>
|
||
public bool UpdateData(int serieIndex, int dataIndex, List<double> multidimensionalData)
|
||
{
|
||
var serie = GetSerie(serieIndex);
|
||
if (serie != null)
|
||
{
|
||
serie.UpdateData(dataIndex, multidimensionalData);
|
||
RefreshPainter(serie);
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新指定系列指定索引指定维数的数据。维数从0开始。
|
||
/// </summary>
|
||
/// <param name="serieName"></param>
|
||
/// <param name="dataIndex"></param>
|
||
/// <param name="dimension">指定维数,从0开始</param>
|
||
/// <param name="value"></param>
|
||
public bool UpdateData(string serieName, int dataIndex, int dimension, double value)
|
||
{
|
||
var serie = GetSerie(serieName);
|
||
if (serie != null)
|
||
{
|
||
serie.UpdateData(dataIndex, dimension, value);
|
||
RefreshPainter(serie);
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新指定系列指定索引指定维数的数据。维数从0开始。
|
||
/// </summary>
|
||
/// <param name="serieIndex"></param>
|
||
/// <param name="dataIndex"></param>
|
||
/// <param name="dimension">指定维数,从0开始</param>
|
||
/// <param name="value"></param>
|
||
public bool UpdateData(int serieIndex, int dataIndex, int dimension, double value)
|
||
{
|
||
var serie = GetSerie(serieIndex);
|
||
if (serie != null)
|
||
{
|
||
serie.UpdateData(dataIndex, dimension, value);
|
||
RefreshPainter(serie);
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Update serie data name.
|
||
/// |更新指定系列中的指定索引数据名称。
|
||
/// </summary>
|
||
/// <param name="serieName"></param>
|
||
/// <param name="dataIndex"></param>
|
||
/// <param name="dataName"></param>
|
||
public bool UpdateDataName(string serieName, int dataIndex, string dataName)
|
||
{
|
||
var serie = GetSerie(serieName);
|
||
if (serie != null)
|
||
{
|
||
serie.UpdateDataName(dataIndex, dataName);
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Update serie data name.
|
||
/// |更新指定系列中的指定索引数据名称。
|
||
/// </summary>
|
||
/// <param name="serieIndex"></param>
|
||
/// <param name="dataName"></param>
|
||
/// <param name="dataIndex"></param>
|
||
public bool UpdateDataName(int serieIndex, int dataIndex, string dataName)
|
||
{
|
||
var serie = GetSerie(serieIndex);
|
||
if (serie != null)
|
||
{
|
||
serie.UpdateDataName(dataIndex, dataName);
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
public double GetData(string serieName, int dataIndex, int dimension = 1)
|
||
{
|
||
var serie = GetSerie(serieName);
|
||
if (serie != null)
|
||
{
|
||
return serie.GetData(dataIndex, dimension);
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
public double GetData(int serieIndex, int dataIndex, int dimension = 1)
|
||
{
|
||
var serie = GetSerie(serieIndex);
|
||
if (serie != null)
|
||
{
|
||
return serie.GetData(dataIndex, dimension);
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
public int GetAllSerieDataCount()
|
||
{
|
||
var total = 0;
|
||
foreach (var serie in m_Series)
|
||
total += serie.dataCount;
|
||
return total;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Whether to show serie.
|
||
/// |设置指定系列是否显示。
|
||
/// </summary>
|
||
/// <param name="serieName">the name of serie</param>
|
||
/// <param name="active">Active or not</param>
|
||
public void SetSerieActive(string serieName, bool active)
|
||
{
|
||
var serie = GetSerie(serieName);
|
||
if (serie != null)
|
||
SetSerieActive(serie, active);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Whether to show serie.
|
||
/// |设置指定系列是否显示。
|
||
/// </summary>
|
||
/// <param name="serieIndex">the index of serie</param>
|
||
/// <param name="active">Active or not</param>
|
||
public void SetSerieActive(int serieIndex, bool active)
|
||
{
|
||
var serie = GetSerie(serieIndex);
|
||
if (serie != null)
|
||
SetSerieActive(serie, active);
|
||
}
|
||
|
||
public void SetSerieActive(Serie serie, bool active)
|
||
{
|
||
serie.show = active;
|
||
serie.AnimationReset();
|
||
if (active) serie.AnimationFadeIn();
|
||
UpdateLegendColor(serie.serieName, active);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Add a category data to xAxis.
|
||
/// |添加一个类目数据到指定的x轴。
|
||
/// </summary>
|
||
/// <param name="category">the category data</param>
|
||
/// <param name="xAxisIndex">which xAxis should category add to</param>
|
||
public void AddXAxisData(string category, int xAxisIndex = 0)
|
||
{
|
||
var xAxis = GetChartComponent<XAxis>(xAxisIndex);
|
||
if (xAxis != null)
|
||
{
|
||
xAxis.AddData(category);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Update category data.
|
||
/// |更新X轴类目数据。
|
||
/// </summary>
|
||
/// <param name="index">the index of category data</param>
|
||
/// <param name="category"></param>
|
||
/// <param name="xAxisIndex">which xAxis index to update to</param>
|
||
public void UpdateXAxisData(int index, string category, int xAxisIndex = 0)
|
||
{
|
||
var xAxis = GetChartComponent<XAxis>(xAxisIndex);
|
||
if (xAxis != null)
|
||
{
|
||
xAxis.UpdateData(index, category);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Add an icon to xAxis.
|
||
/// |添加一个图标到指定的x轴。
|
||
/// </summary>
|
||
/// <param name="icon"></param>
|
||
/// <param name="xAxisIndex"></param>
|
||
public void AddXAxisIcon(Sprite icon, int xAxisIndex = 0)
|
||
{
|
||
var xAxis = GetChartComponent<XAxis>(xAxisIndex);
|
||
if (xAxis != null)
|
||
{
|
||
xAxis.AddIcon(icon);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Update xAxis icon.
|
||
/// |更新X轴图标。
|
||
/// </summary>
|
||
/// <param name="index"></param>
|
||
/// <param name="icon"></param>
|
||
/// <param name="xAxisIndex"></param>
|
||
public void UdpateXAxisIcon(int index, Sprite icon, int xAxisIndex = 0)
|
||
{
|
||
var xAxis = GetChartComponent<XAxis>(xAxisIndex);
|
||
if (xAxis != null)
|
||
{
|
||
xAxis.UpdateIcon(index, icon);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Add a category data to yAxis.
|
||
/// |添加一个类目数据到指定的y轴。
|
||
/// </summary>
|
||
/// <param name="category">the category data</param>
|
||
/// <param name="yAxisIndex">which yAxis should category add to</param>
|
||
public void AddYAxisData(string category, int yAxisIndex = 0)
|
||
{
|
||
var yAxis = GetChartComponent<YAxis>(yAxisIndex);
|
||
if (yAxis != null)
|
||
{
|
||
yAxis.AddData(category);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Update category data.
|
||
/// |更新Y轴类目数据。
|
||
/// </summary>
|
||
/// <param name="index">the index of category data</param>
|
||
/// <param name="category"></param>
|
||
/// <param name="yAxisIndex">which yAxis index to update to</param>
|
||
public void UpdateYAxisData(int index, string category, int yAxisIndex = 0)
|
||
{
|
||
var yAxis = GetChartComponent<YAxis>(yAxisIndex);
|
||
if (yAxis != null)
|
||
{
|
||
yAxis.UpdateData(index, category);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Add an icon to yAxis.
|
||
/// |添加一个图标到指定的y轴。
|
||
/// </summary>
|
||
/// <param name="icon"></param>
|
||
/// <param name="yAxisIndex"></param>
|
||
public void AddYAxisIcon(Sprite icon, int yAxisIndex = 0)
|
||
{
|
||
var yAxis = GetChartComponent<YAxis>(yAxisIndex);
|
||
if (yAxis != null)
|
||
{
|
||
yAxis.AddIcon(icon);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新Y轴图标。
|
||
/// </summary>
|
||
/// <param name="index"></param>
|
||
/// <param name="icon"></param>
|
||
/// <param name="yAxisIndex"></param>
|
||
public void UpdateYAxisIcon(int index, Sprite icon, int yAxisIndex = 0)
|
||
{
|
||
var yAxis = GetChartComponent<YAxis>(yAxisIndex);
|
||
if (yAxis != null)
|
||
{
|
||
yAxis.UpdateIcon(index, icon);
|
||
}
|
||
}
|
||
|
||
public float GetSerieBarGap<T>() where T : Serie
|
||
{
|
||
float gap = 0f;
|
||
for (int i = 0; i < m_Series.Count; i++)
|
||
{
|
||
var serie = m_Series[i];
|
||
if (serie is T)
|
||
{
|
||
if (serie.barGap != 0)
|
||
{
|
||
gap = serie.barGap;
|
||
}
|
||
}
|
||
}
|
||
return gap;
|
||
}
|
||
|
||
public double GetSerieSameStackTotalValue<T>(string stack, int dataIndex) where T : Serie
|
||
{
|
||
if (string.IsNullOrEmpty(stack)) return 0;
|
||
double total = 0;
|
||
foreach (var serie in m_Series)
|
||
{
|
||
if (serie is T)
|
||
{
|
||
if (stack.Equals(serie.stack))
|
||
{
|
||
total += serie.data[dataIndex].data[1];
|
||
}
|
||
}
|
||
}
|
||
return total;
|
||
}
|
||
|
||
public int GetSerieBarRealCount<T>() where T : Serie
|
||
{
|
||
var count = 0;
|
||
barStackSet.Clear();
|
||
for (int i = 0; i < m_Series.Count; i++)
|
||
{
|
||
var serie = m_Series[i];
|
||
if (!serie.show) continue;
|
||
if (serie is T)
|
||
{
|
||
if (!string.IsNullOrEmpty(serie.stack))
|
||
{
|
||
if (barStackSet.Contains(serie.stack)) continue;
|
||
barStackSet.Add(serie.stack);
|
||
}
|
||
count++;
|
||
|
||
}
|
||
}
|
||
return count;
|
||
}
|
||
|
||
private HashSet<string> barStackSet = new HashSet<string>();
|
||
public float GetSerieTotalWidth<T>(float categoryWidth, float gap, int realBarCount) where T : Serie
|
||
{
|
||
float total = 0;
|
||
float lastGap = 0;
|
||
barStackSet.Clear();
|
||
for (int i = 0; i < m_Series.Count; i++)
|
||
{
|
||
var serie = m_Series[i];
|
||
if (!serie.show) continue;
|
||
if (serie is T)
|
||
{
|
||
if (!string.IsNullOrEmpty(serie.stack))
|
||
{
|
||
if (barStackSet.Contains(serie.stack)) continue;
|
||
barStackSet.Add(serie.stack);
|
||
}
|
||
var width = GetStackBarWidth<T>(categoryWidth, serie, realBarCount);
|
||
if (gap == -1)
|
||
{
|
||
if (width > total) total = width;
|
||
}
|
||
else
|
||
{
|
||
lastGap = ChartHelper.GetActualValue(gap, width);
|
||
total += width;
|
||
total += lastGap;
|
||
}
|
||
}
|
||
}
|
||
if (total > 0 && gap != -1) total -= lastGap;
|
||
return total;
|
||
}
|
||
|
||
public float GetSerieTotalGap<T>(float categoryWidth, float gap, int index) where T : Serie
|
||
{
|
||
if (index <= 0) return 0;
|
||
var total = 0f;
|
||
var count = 0;
|
||
var totalRealBarCount = GetSerieBarRealCount<T>();
|
||
barStackSet.Clear();
|
||
for (int i = 0; i < m_Series.Count; i++)
|
||
{
|
||
var serie = m_Series[i];
|
||
if (!serie.show) continue;
|
||
if (serie is T)
|
||
{
|
||
if (!string.IsNullOrEmpty(serie.stack))
|
||
{
|
||
if (barStackSet.Contains(serie.stack)) continue;
|
||
barStackSet.Add(serie.stack);
|
||
}
|
||
var width = GetStackBarWidth<T>(categoryWidth, serie, totalRealBarCount);
|
||
if (gap == -1)
|
||
{
|
||
if (width > total) total = width;
|
||
}
|
||
else
|
||
{
|
||
total += width + ChartHelper.GetActualValue(gap, width);
|
||
}
|
||
if (count + 1 >= index)
|
||
break;
|
||
else
|
||
count++;
|
||
}
|
||
}
|
||
return total;
|
||
}
|
||
|
||
private float GetStackBarWidth<T>(float categoryWidth, Serie now, int realBarCount) where T : Serie
|
||
{
|
||
if (string.IsNullOrEmpty(now.stack)) return now.GetBarWidth(categoryWidth, realBarCount);
|
||
float barWidth = 0;
|
||
for (int i = 0; i < m_Series.Count; i++)
|
||
{
|
||
var serie = m_Series[i];
|
||
if ((serie is T) &&
|
||
serie.show && now.stack.Equals(serie.stack))
|
||
{
|
||
if (serie.barWidth > barWidth) barWidth = serie.barWidth;
|
||
}
|
||
}
|
||
if (barWidth == 0)
|
||
{
|
||
var width = ChartHelper.GetActualValue(0.6f, categoryWidth);
|
||
if (realBarCount == 0)
|
||
return width < 1 ? categoryWidth : width;
|
||
else
|
||
return width / realBarCount;
|
||
}
|
||
else
|
||
return ChartHelper.GetActualValue(barWidth, categoryWidth);
|
||
}
|
||
|
||
private List<string> tempList = new List<string>();
|
||
public int GetSerieIndexIfStack<T>(Serie currSerie) where T : Serie
|
||
{
|
||
tempList.Clear();
|
||
int index = 0;
|
||
for (int i = 0; i < m_Series.Count; i++)
|
||
{
|
||
var serie = m_Series[i];
|
||
if (!(serie is T)) continue;
|
||
if (string.IsNullOrEmpty(serie.stack))
|
||
{
|
||
if (serie.index == currSerie.index) return index;
|
||
tempList.Add(string.Empty);
|
||
index++;
|
||
}
|
||
else
|
||
{
|
||
if (!tempList.Contains(serie.stack))
|
||
{
|
||
if (serie.index == currSerie.index) return index;
|
||
tempList.Add(serie.stack);
|
||
index++;
|
||
}
|
||
else
|
||
{
|
||
if (serie.index == currSerie.index) return tempList.IndexOf(serie.stack);
|
||
}
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
internal void InitSerieHandlers()
|
||
{
|
||
m_SerieHandlers.Clear();
|
||
for (int i = 0; i < m_Series.Count; i++)
|
||
{
|
||
var serie = m_Series[i];
|
||
serie.index = i;
|
||
CreateSerieHandler(serie);
|
||
}
|
||
}
|
||
|
||
private void CreateSerieHandler(Serie serie)
|
||
{
|
||
if (serie == null)
|
||
throw new ArgumentNullException("serie is null");
|
||
|
||
if (!serie.GetType().IsDefined(typeof(SerieHandlerAttribute), false))
|
||
{
|
||
Debug.LogError("Serie no Handler:" + serie.GetType());
|
||
return;
|
||
}
|
||
var attribute = serie.GetType().GetAttribute<SerieHandlerAttribute>();
|
||
var handler = (SerieHandler) Activator.CreateInstance(attribute.handler);
|
||
handler.attribute = attribute;
|
||
handler.chart = this;
|
||
handler.defaultDimension = 1;
|
||
handler.SetSerie(serie);
|
||
serie.handler = handler;
|
||
m_SerieHandlers.Add(handler);
|
||
}
|
||
|
||
private Serie InsertSerie(int index, Type type, string serieName, bool show = true, bool addToHead = false)
|
||
{
|
||
CheckAddRequireChartComponent(type);
|
||
var serie = Activator.CreateInstance(type) as Serie;
|
||
serie.show = show;
|
||
serie.serieName = serieName;
|
||
serie.serieType = type.Name;
|
||
serie.index = m_Series.Count;
|
||
|
||
if (type == typeof(Scatter))
|
||
{
|
||
serie.symbol.show = true;
|
||
serie.symbol.type = SymbolType.Circle;
|
||
}
|
||
else if (type == typeof(Line))
|
||
{
|
||
serie.symbol.show = true;
|
||
serie.symbol.type = SymbolType.EmptyCircle;
|
||
}
|
||
else
|
||
{
|
||
serie.symbol.show = false;
|
||
}
|
||
InsertSerie(serie, index, addToHead);
|
||
return serie;
|
||
}
|
||
|
||
private void ResetSeriesIndex()
|
||
{
|
||
#if UNITY_EDITOR && UNITY_2019_1_OR_NEWER
|
||
UnityEditor.EditorUtility.SetDirty(this);
|
||
#endif
|
||
for (int i = 0; i < m_Series.Count; i++)
|
||
{
|
||
m_Series[i].index = i;
|
||
}
|
||
}
|
||
|
||
private void AddSerieAfterDeserialize(Serie serie)
|
||
{
|
||
serie.OnAfterDeserialize();
|
||
m_Series.Add(serie);
|
||
}
|
||
|
||
public string GenerateDefaultSerieName()
|
||
{
|
||
return "serie" + m_Series.Count;
|
||
}
|
||
|
||
public bool IsSerieName(string name)
|
||
{
|
||
if (string.IsNullOrEmpty(name))
|
||
return false;
|
||
foreach (var serie in m_Series)
|
||
{
|
||
if (name.Equals(serie.serieName))
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
}
|
||
} |