| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 | using System;using System.Collections.Generic;using System.Text;using UnityEditor;using UnityEngine;using XCharts.Runtime;namespace XCharts.Editor{    [CustomEditor(typeof(BaseChart), true)]    public class BaseChartEditor : UnityEditor.Editor    {        class Styles        {            public static readonly GUIContent btnAddSerie = new GUIContent("Add Serie", "");            public static readonly GUIContent btnAddComponent = new GUIContent("Add Main Component", "");            public static readonly GUIContent btnConvertXYAxis = new GUIContent("Convert XY Axis", "");            public static readonly GUIContent btnRebuildChartObject = new GUIContent("Rebuild Chart Object", "");            public static readonly GUIContent btnSaveAsImage = new GUIContent("Save As Image", "");            public static readonly GUIContent btnCheckWarning = new GUIContent("Check Warning", "");            public static readonly GUIContent btnHideWarning = new GUIContent("Hide Warning", "");        }        protected BaseChart m_Chart;        protected SerializedProperty m_Script;        protected SerializedProperty m_EnableTextMeshPro;        protected SerializedProperty m_Settings;        protected SerializedProperty m_Theme;        protected SerializedProperty m_ChartName;        protected SerializedProperty m_DebugInfo;        protected SerializedProperty m_RaycastTarget;        protected List<SerializedProperty> m_Components = new List<SerializedProperty>();        protected List<SerializedProperty> m_Series = new List<SerializedProperty>();        private bool m_BaseFoldout;        private bool m_CheckWarning = false;        private int m_LastComponentCount = 0;        private int m_LastSerieCount = 0;        private string m_VersionString = "";        private StringBuilder sb = new StringBuilder();        MainComponentListEditor m_ComponentList;        SerieListEditor m_SerieList;        protected virtual void OnEnable()        {            if (target == null) return;            m_Chart = (BaseChart) target;            m_Script = serializedObject.FindProperty("m_Script");            m_EnableTextMeshPro = serializedObject.FindProperty("m_EnableTextMeshPro");            m_ChartName = serializedObject.FindProperty("m_ChartName");            m_Theme = serializedObject.FindProperty("m_Theme");            m_Settings = serializedObject.FindProperty("m_Settings");            m_DebugInfo = serializedObject.FindProperty("m_DebugInfo");            m_RaycastTarget = serializedObject.FindProperty("m_RaycastTarget");            RefreshComponent();            m_ComponentList = new MainComponentListEditor(this);            m_ComponentList.Init(m_Chart, serializedObject, m_Components);            RefreshSeries();            m_SerieList = new SerieListEditor(this);            m_SerieList.Init(m_Chart, serializedObject, m_Series);            m_VersionString = "v" + XChartsMgr.fullVersion;            if (m_EnableTextMeshPro.boolValue)                m_VersionString += "-tmp";        }        public List<SerializedProperty> RefreshComponent()        {            m_Components.Clear();            serializedObject.UpdateIfRequiredOrScript();            foreach (var kv in m_Chart.typeListForComponent)            {                InitComponent(kv.Value.Name);            }            return m_Components;        }        public List<SerializedProperty> RefreshSeries()        {            m_Series.Clear();            serializedObject.UpdateIfRequiredOrScript();            foreach (var kv in m_Chart.typeListForSerie)            {                InitSerie(kv.Value.Name);            }            return m_Series;        }        public override void OnInspectorGUI()        {            if (m_Chart == null && target == null)            {                base.OnInspectorGUI();                return;            }            serializedObject.UpdateIfRequiredOrScript();            if (m_LastComponentCount != m_Chart.components.Count)            {                m_LastComponentCount = m_Chart.components.Count;                RefreshComponent();                m_ComponentList.UpdateComponentsProperty(m_Components);            }            if (m_LastSerieCount != m_Chart.series.Count)            {                m_LastSerieCount = m_Chart.series.Count;                RefreshSeries();                m_SerieList.UpdateSeriesProperty(m_Series);            }            OnStartInspectorGUI();            OnDebugInspectorGUI();            EditorGUILayout.Space();            serializedObject.ApplyModifiedProperties();        }        protected virtual void OnStartInspectorGUI()        {            ShowVersion();            m_BaseFoldout = ChartEditorHelper.DrawHeader("Base", m_BaseFoldout, false, null, null);            if (m_BaseFoldout)            {                EditorGUILayout.PropertyField(m_Script);                EditorGUILayout.PropertyField(m_ChartName);                EditorGUILayout.PropertyField(m_RaycastTarget);                if (XChartsMgr.IsRepeatChartName(m_Chart, m_ChartName.stringValue))                {                    EditorGUILayout.BeginHorizontal();                    EditorGUILayout.HelpBox("chart name is repeated: " + m_ChartName.stringValue, MessageType.Error);                    EditorGUILayout.EndHorizontal();                }            }            EditorGUILayout.PropertyField(m_Theme);            EditorGUILayout.PropertyField(m_Settings);            m_ComponentList.OnGUI();            m_SerieList.OnGUI();        }        protected virtual void OnDebugInspectorGUI()        {            EditorGUILayout.PropertyField(m_DebugInfo, true);            EditorGUILayout.Space();            AddSerie();            AddComponent();            CheckWarning();        }        protected void PropertyComponnetList(SerializedProperty prop)        {            for (int i = 0; i < prop.arraySize; i++)            {                EditorGUILayout.PropertyField(prop.GetArrayElementAtIndex(i), true);            }        }        private void InitComponent(string propName)        {            var prop = serializedObject.FindProperty(propName);            for (int i = 0; i < prop.arraySize; i++)            {                m_Components.Add(prop.GetArrayElementAtIndex(i));            }            m_Components.Sort((a, b) => { return a.propertyPath.CompareTo(b.propertyPath); });        }        private void InitSerie(string propName)        {            var prop = serializedObject.FindProperty(propName);            for (int i = 0; i < prop.arraySize; i++)            {                m_Series.Add(prop.GetArrayElementAtIndex(i));            }            m_Series.Sort(delegate(SerializedProperty a, SerializedProperty b)            {                var index1 = a.FindPropertyRelative("m_Index").intValue;                var index2 = b.FindPropertyRelative("m_Index").intValue;                return index1.CompareTo(index2);            });        }        private void ShowVersion()        {            EditorGUILayout.HelpBox(m_VersionString, MessageType.None);        }        private void AddComponent()        {            if (GUILayout.Button(Styles.btnAddComponent))            {                var menu = new GenericMenu();                foreach (var type in GetMainComponentTypeNames())                {                    var title = ChartEditorHelper.GetContent(type.Name);                    bool exists = !m_Chart.CanAddChartComponent(type);                    if (!exists)                        menu.AddItem(title, false, () =>                        {                            m_ComponentList.AddChartComponent(type);                        });                    else                    {                        menu.AddDisabledItem(title);                    }                }                menu.ShowAsContext();            }        }        private void AddSerie()        {            if (GUILayout.Button(Styles.btnAddSerie))            {                var menu = new GenericMenu();                foreach (var type in GetSerieTypeNames())                {                    var title = ChartEditorHelper.GetContent(type.Name);                    if (m_Chart.CanAddSerie(type))                    {                        menu.AddItem(title, false, () =>                        {                            m_SerieList.AddSerie(type);                        });                    }                    else                    {                        menu.AddDisabledItem(title);                    }                }                menu.ShowAsContext();            }        }        private List<Type> GetMainComponentTypeNames()        {            var list = new List<Type>();            var typeMap = RuntimeUtil.GetAllTypesDerivedFrom<MainComponent>();            foreach (var kvp in typeMap)            {                var type = kvp;                if (RuntimeUtil.HasSubclass(type)) continue;                if (type.IsDefined(typeof(ComponentHandlerAttribute), false))                {                    var attribute = type.GetAttribute<ComponentHandlerAttribute>();                    if (attribute != null && attribute.handler != null)                        list.Add(type);                }                else                {                    list.Add(type);                }            }            list.Sort((a, b) => { return a.Name.CompareTo(b.Name); });            return list;        }        private List<Type> GetSerieTypeNames()        {            var list = new List<Type>();            var typeMap = RuntimeUtil.GetAllTypesDerivedFrom<Serie>();            foreach (var kvp in typeMap)            {                var type = kvp;                if (type.IsDefined(typeof(SerieHandlerAttribute), false))                    list.Add(type);            }            list.Sort((a, b) => { return a.Name.CompareTo(b.Name); });            return list;        }        private void CheckWarning()        {            if (m_Chart.HasChartComponent<XAxis>() && m_Chart.HasChartComponent<YAxis>())            {                if (GUILayout.Button(Styles.btnConvertXYAxis))                    m_Chart.ConvertXYAxis(0);            }            if (GUILayout.Button(Styles.btnRebuildChartObject))            {                m_Chart.RebuildChartObject();            }            if (GUILayout.Button(Styles.btnSaveAsImage))            {                m_Chart.SaveAsImage();            }            if (m_CheckWarning)            {                EditorGUILayout.BeginHorizontal();                if (GUILayout.Button(Styles.btnCheckWarning))                {                    m_CheckWarning = true;                    m_Chart.CheckWarning();                }                if (GUILayout.Button(Styles.btnHideWarning))                {                    m_CheckWarning = false;                }                EditorGUILayout.EndHorizontal();                sb.Length = 0;                sb.AppendFormat("v{0}", XChartsMgr.fullVersion);                if (!string.IsNullOrEmpty(m_Chart.warningInfo))                {                    sb.AppendLine();                    sb.Append(m_Chart.warningInfo);                }                else                {                    sb.AppendLine();                    sb.Append("Perfect! No warning!");                }                EditorGUILayout.HelpBox(sb.ToString(), MessageType.Warning);            }            else            {                if (GUILayout.Button(Styles.btnCheckWarning))                {                    m_CheckWarning = true;                    m_Chart.CheckWarning();                }            }        }    }}
 |