| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 | using System;using System.Collections.Generic;using System.Reflection;using UnityEngine;namespace XCharts.Runtime{    public partial class Serie    {        public static Dictionary<Type, string> extraComponentMap = new Dictionary<Type, string>        {            { typeof(LabelStyle), "m_Labels" },            { typeof(LabelLine), "m_LabelLines" },            { typeof(EndLabelStyle), "m_EndLabels" },            { typeof(LineArrow), "m_LineArrows" },            { typeof(AreaStyle), "m_AreaStyles" },            { typeof(TitleStyle), "m_TitleStyles" },            { typeof(EmphasisStyle), "m_EmphasisStyles" },            { typeof(BlurStyle), "m_BlurStyles" },            { typeof(SelectStyle), "m_SelectStyles" },        };        [SerializeField][IgnoreDoc] private List<LabelStyle> m_Labels = new List<LabelStyle>();        [SerializeField][IgnoreDoc] private List<LabelLine> m_LabelLines = new List<LabelLine>();        [SerializeField][IgnoreDoc] private List<EndLabelStyle> m_EndLabels = new List<EndLabelStyle>();        [SerializeField][IgnoreDoc] private List<LineArrow> m_LineArrows = new List<LineArrow>();        [SerializeField][IgnoreDoc] private List<AreaStyle> m_AreaStyles = new List<AreaStyle>();        [SerializeField][IgnoreDoc] private List<TitleStyle> m_TitleStyles = new List<TitleStyle>();        [SerializeField][IgnoreDoc] private List<EmphasisStyle> m_EmphasisStyles = new List<EmphasisStyle>();        [SerializeField][IgnoreDoc] private List<BlurStyle> m_BlurStyles = new List<BlurStyle>();        [SerializeField][IgnoreDoc] private List<SelectStyle> m_SelectStyles = new List<SelectStyle>();        /// <summary>        /// The style of area.        /// ||区域填充样式。        /// </summary>        public AreaStyle areaStyle { get { return m_AreaStyles.Count > 0 ? m_AreaStyles[0] : null; } }        /// <summary>        /// Text label of graphic element,to explain some data information about graphic item like value, name and so on.        /// ||图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。        /// </summary>        public LabelStyle label { get { return m_Labels.Count > 0 ? m_Labels[0] : null; } }        public LabelStyle endLabel { get { return m_EndLabels.Count > 0 ? m_EndLabels[0] : null; } }        /// <summary>        /// The line of label.        /// ||标签上的视觉引导线。        /// </summary>        public LabelLine labelLine { get { return m_LabelLines.Count > 0 ? m_LabelLines[0] : null; } }        /// <summary>        /// The arrow of line.        /// ||折线图的箭头。        /// </summary>        public LineArrow lineArrow { get { return m_LineArrows.Count > 0 ? m_LineArrows[0] : null; } }        /// <summary>        /// the icon of data.        /// ||数据项标题样式。        /// </summary>        public TitleStyle titleStyle { get { return m_TitleStyles.Count > 0 ? m_TitleStyles[0] : null; } }        /// <summary>        /// style of emphasis state.        /// ||高亮状态的样式。        /// </summary>        public EmphasisStyle emphasisStyle { get { return m_EmphasisStyles.Count > 0 ? m_EmphasisStyles[0] : null; } }        /// <summary>        /// style of blur state.        /// ||淡出状态的样式。        /// </summary>        public BlurStyle blurStyle { get { return m_BlurStyles.Count > 0 ? m_BlurStyles[0] : null; } }        /// <summary>        /// style of select state.        /// ||选中状态的样式。        /// </summary>        public SelectStyle selectStyle { get { return m_SelectStyles.Count > 0 ? m_SelectStyles[0] : null; } }        /// <summary>        /// Remove all extra components.        /// ||移除所有额外组件。        /// </summary>        public void RemoveAllComponents()        {            var serieType = GetType();            foreach (var kv in extraComponentMap)            {                ReflectionUtil.InvokeListClear(this, serieType.GetField(kv.Value));            }            SetAllDirty();        }        [Obsolete("Use EnsureComponent<T>() instead.")]        public T AddExtraComponent<T>() where T : ChildComponent, ISerieComponent        {            return EnsureComponent<T>();        }        public T GetComponent<T>() where T : ChildComponent, ISerieComponent        {            return GetComponent(typeof(T)) as T;        }        /// <summary>        /// Ensure the serie has the component. If not, add it.        /// ||确保系列有该组件。如果没有,则添加。        /// </summary>        /// <typeparam name="T"></typeparam>        /// <returns>component or null</returns>        public T EnsureComponent<T>() where T : ChildComponent, ISerieComponent        {            return EnsureComponent(typeof(T)) as T;        }        public bool CanAddComponent<T>() where T : ChildComponent, ISerieComponent        {            return CanAddComponent(typeof(T));        }        public bool CanAddComponent(Type type)        {            if (GetType().IsDefined(typeof(SerieComponentAttribute), false))            {                var attr = GetType().GetAttribute<SerieComponentAttribute>();                if (attr.Contains(type))                {                    return true;                }            }            return false;        }        public ISerieComponent GetComponent(Type type)        {            if (GetType().IsDefined(typeof(SerieComponentAttribute), false))            {                var attr = GetType().GetAttribute<SerieComponentAttribute>();                if (attr.Contains(type))                {                    var fieldName = string.Empty;                    if (extraComponentMap.TryGetValue(type, out fieldName))                    {                        var field = typeof(Serie).GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic);                        if (ReflectionUtil.InvokeListCount(this, field) > 0)                        {                            return ReflectionUtil.InvokeListGet<ISerieComponent>(this, field, 0);                        }                    }                }            }            return null;        }        public ISerieComponent EnsureComponent(Type type)        {            if (GetType().IsDefined(typeof(SerieComponentAttribute), false))            {                var attr = GetType().GetAttribute<SerieComponentAttribute>();                if (attr.Contains(type))                {                    var fieldName = string.Empty;                    if (extraComponentMap.TryGetValue(type, out fieldName))                    {                        var field = typeof(Serie).GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic);                        if (ReflectionUtil.InvokeListCount(this, field) <= 0)                        {                            var extraComponent = Activator.CreateInstance(type) as ISerieComponent;                            ReflectionUtil.InvokeListAdd(this, field, extraComponent);                            SetAllDirty();                            return extraComponent;                        }                        else                        {                            return ReflectionUtil.InvokeListGet<ISerieComponent>(this, field, 0);                        }                    }                }            }            throw new System.Exception(string.Format("Serie {0} not support component: {1}",                GetType().Name, type.Name));        }        public void RemoveComponent<T>() where T : ISerieComponent        {            RemoveComponent(typeof(T));        }        public void RemoveComponent(Type type)        {            if (GetType().IsDefined(typeof(SerieComponentAttribute), false))            {                var attr = GetType().GetAttribute<SerieComponentAttribute>();                if (attr.Contains(type))                {                    var fieldName = string.Empty;                    if (extraComponentMap.TryGetValue(type, out fieldName))                    {                        var field = typeof(Serie).GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic);                        ReflectionUtil.InvokeListClear(this, field);                        SetAllDirty();                        return;                    }                }            }        }    }}
 |