Açıklama Yok
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SerieEditor.cs 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. using System.Collections.Generic;
  2. using UnityEditor;
  3. using UnityEngine;
  4. using XCharts.Runtime;
  5. namespace XCharts.Editor
  6. {
  7. public class SerieEditor<T> : SerieBaseEditor where T : Serie
  8. {
  9. protected const string MORE = "More";
  10. protected bool m_MoreFoldout = false;
  11. private bool m_DataFoldout = false;
  12. private bool m_DataComponentFoldout = true;
  13. private Dictionary<int, bool> m_DataElementFoldout = new Dictionary<int, bool>();
  14. public override void OnInspectorGUI()
  15. {
  16. ++EditorGUI.indentLevel;
  17. PropertyField("m_SerieName");
  18. if (m_CoordOptionsNames != null && m_CoordOptionsNames.Count > 1)
  19. {
  20. var index = m_CoordOptionsNames.IndexOf(serie.coordSystem);
  21. var selectedIndex = EditorGUILayout.Popup("Coord System", index, m_CoordOptionsNames.ToArray());
  22. if (selectedIndex != index)
  23. {
  24. var typeName = m_CoordOptionsNames[selectedIndex];
  25. serie.coordSystem = m_CoordOptionsDic[typeName].Name;
  26. }
  27. }
  28. PropertyField("m_State");
  29. OnCustomInspectorGUI();
  30. OnExtraInspectorGUI();
  31. PropertyFieldData();
  32. --EditorGUI.indentLevel;
  33. }
  34. public virtual void OnCustomInspectorGUI()
  35. { }
  36. private void OnExtraInspectorGUI()
  37. {
  38. foreach (var kv in Serie.extraComponentMap)
  39. {
  40. var prop = FindProperty(kv.Value);
  41. if (prop.arraySize > 0)
  42. PropertyField(prop.GetArrayElementAtIndex(0));
  43. }
  44. }
  45. private void PropertyFieldData()
  46. {
  47. m_DataFoldout = ChartEditorHelper.DrawHeader("Data", m_DataFoldout, false, null, null,
  48. new HeaderMenuInfo("Import ECharts Data", () =>
  49. {
  50. PraseExternalDataEditor.UpdateData(chart, serie, null);
  51. PraseExternalDataEditor.ShowWindow();
  52. }));
  53. if (!m_DataFoldout) return;
  54. EditorGUI.indentLevel++;
  55. var m_Datas = FindProperty("m_Data");
  56. var m_DataDimension = FindProperty("m_ShowDataDimension");
  57. var m_ShowDataName = FindProperty("m_ShowDataName");
  58. PropertyField(m_ShowDataName);
  59. PropertyField(m_DataDimension);
  60. var listSize = m_Datas.arraySize;
  61. listSize = EditorGUILayout.IntField("Size", listSize);
  62. if (listSize < 0) listSize = 0;
  63. if (m_DataDimension.intValue < 1) m_DataDimension.intValue = 1;
  64. int dimension = m_DataDimension.intValue;
  65. bool showName = m_ShowDataName.boolValue;
  66. if (listSize != m_Datas.arraySize)
  67. {
  68. while (listSize > m_Datas.arraySize) m_Datas.arraySize++;
  69. while (listSize < m_Datas.arraySize) m_Datas.arraySize--;
  70. serie.ResetDataIndex();
  71. }
  72. if (listSize > 30) // && !XCSettings.editorShowAllListData)
  73. {
  74. int num = listSize > 10 ? 10 : listSize;
  75. for (int i = 0; i < num; i++)
  76. {
  77. DrawSerieData(dimension, m_Datas, i, showName);
  78. }
  79. if (num >= 10)
  80. {
  81. ChartEditorHelper.DrawHeader("... ", false, false, null, null);
  82. DrawSerieData(dimension, m_Datas, listSize - 1, showName);
  83. }
  84. }
  85. else
  86. {
  87. for (int i = 0; i < m_Datas.arraySize; i++)
  88. {
  89. DrawSerieData(dimension, m_Datas, i, showName);
  90. }
  91. }
  92. EditorGUI.indentLevel--;
  93. }
  94. protected void PropertyFiledMore(System.Action action)
  95. {
  96. m_MoreFoldout = ChartEditorHelper.DrawHeader(MORE, m_MoreFoldout, false, null, null);
  97. if (m_MoreFoldout)
  98. {
  99. if (action != null) action();
  100. }
  101. }
  102. private void DrawSerieData(int dimension, SerializedProperty m_Datas, int index, bool showName)
  103. {
  104. bool flag;
  105. if (!m_DataElementFoldout.TryGetValue(index, out flag))
  106. {
  107. flag = false;
  108. m_DataElementFoldout[index] = false;
  109. }
  110. var fieldCount = dimension + (showName ? 1 : 0);
  111. var serieData = m_Datas.GetArrayElementAtIndex(index);
  112. var dataIndex = serieData.FindPropertyRelative("m_Index").intValue;
  113. m_DataElementFoldout[index] = ChartEditorHelper.DrawHeader("SerieData " + dataIndex, flag, false, null,
  114. delegate(Rect drawRect)
  115. {
  116. //drawRect.width -= 2f;
  117. var maxX = drawRect.xMax;
  118. var currentWidth = drawRect.width;
  119. var lastX = drawRect.x;
  120. var lastWid = drawRect.width;
  121. var lastFieldWid = EditorGUIUtility.fieldWidth;
  122. var lastLabelWid = EditorGUIUtility.labelWidth;
  123. //var serieData = m_Datas.GetArrayElementAtIndex(index);
  124. var sereName = serieData.FindPropertyRelative("m_Name");
  125. var data = serieData.FindPropertyRelative("m_Data");
  126. #if UNITY_2019_3_OR_NEWER
  127. var gap = 2;
  128. var namegap = 3;
  129. #else
  130. var gap = 0;
  131. var namegap = 0;
  132. #endif
  133. if (fieldCount <= 1)
  134. {
  135. while (2 > data.arraySize)
  136. {
  137. var value = data.arraySize == 0 ? index : 0;
  138. data.arraySize++;
  139. data.GetArrayElementAtIndex(data.arraySize - 1).floatValue = value;
  140. }
  141. SerializedProperty element = data.GetArrayElementAtIndex(1);
  142. var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * 15 + gap;
  143. drawRect.x = startX;
  144. drawRect.xMax = maxX;
  145. EditorGUI.PropertyField(drawRect, element, GUIContent.none);
  146. }
  147. else
  148. {
  149. var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * 15 + gap;
  150. var dataWidTotal = (currentWidth - (startX + 20.5f + 1));
  151. var dataWid = dataWidTotal / fieldCount;
  152. var xWid = dataWid - 0;
  153. for (int i = 0; i < dimension; i++)
  154. {
  155. var dataCount = i < 1 ? 2 : i + 1;
  156. while (dataCount > data.arraySize)
  157. {
  158. var value = data.arraySize == 0 ? index : 0;
  159. data.arraySize++;
  160. data.GetArrayElementAtIndex(data.arraySize - 1).floatValue = value;
  161. }
  162. drawRect.x = startX + i * xWid;
  163. drawRect.width = dataWid + 25;
  164. SerializedProperty element = data.GetArrayElementAtIndex(dimension <= 1 ? 1 : i);
  165. EditorGUI.PropertyField(drawRect, element, GUIContent.none);
  166. }
  167. if (showName)
  168. {
  169. drawRect.x = startX + (fieldCount - 1) * xWid;
  170. drawRect.width = dataWid + 40 + dimension * namegap - 2.5f;
  171. EditorGUI.PropertyField(drawRect, sereName, GUIContent.none);
  172. }
  173. EditorGUIUtility.fieldWidth = lastFieldWid;
  174. EditorGUIUtility.labelWidth = lastLabelWid;
  175. }
  176. });
  177. if (m_DataElementFoldout[index])
  178. {
  179. if (!(serie is ISimplifiedSerie))
  180. DrawSerieDataDetail(m_Datas, index);
  181. }
  182. }
  183. private void DrawSerieDataDetail(SerializedProperty m_Datas, int index)
  184. {
  185. EditorGUI.indentLevel++;
  186. var serieData = m_Datas.GetArrayElementAtIndex(index);
  187. PropertyField(serieData.FindPropertyRelative("m_Name"));
  188. //PropertyField(serieData.FindPropertyRelative("m_State"));
  189. if (serie.GetType().IsDefined(typeof(SerieDataExtraFieldAttribute), false))
  190. {
  191. var attribute = serie.GetType().GetAttribute<SerieDataExtraFieldAttribute>();
  192. foreach (var field in attribute.fields)
  193. {
  194. PropertyField(serieData.FindPropertyRelative(field));
  195. }
  196. }
  197. serieDataMenus.Clear();
  198. if (serie.GetType().IsDefined(typeof(SerieDataExtraComponentAttribute), false))
  199. {
  200. var attribute = serie.GetType().GetAttribute<SerieDataExtraComponentAttribute>();
  201. foreach (var type in attribute.types)
  202. {
  203. var size = serieData.FindPropertyRelative(SerieData.extraComponentMap[type]).arraySize;
  204. serieDataMenus.Add(new HeaderMenuInfo("Add " + type.Name, () =>
  205. {
  206. serie.GetSerieData(index).GetOrAddComponent(type);
  207. EditorUtility.SetDirty(chart);
  208. }, size == 0));
  209. }
  210. foreach (var type in attribute.types)
  211. {
  212. var size = serieData.FindPropertyRelative(SerieData.extraComponentMap[type]).arraySize;
  213. serieDataMenus.Add(new HeaderMenuInfo("Remove " + type.Name, () =>
  214. {
  215. serie.GetSerieData(index).RemoveComponent(type);
  216. EditorUtility.SetDirty(chart);
  217. }, size > 0));
  218. }
  219. }
  220. serieDataMenus.Add(new HeaderMenuInfo("Remove All", () =>
  221. {
  222. serie.GetSerieData(index).RemoveAllComponent();
  223. }, true));
  224. m_DataComponentFoldout = ChartEditorHelper.DrawHeader("Component", m_DataComponentFoldout, false, null, null, serieDataMenus);
  225. if (m_DataComponentFoldout)
  226. {
  227. foreach (var kv in SerieData.extraComponentMap)
  228. {
  229. var prop = serieData.FindPropertyRelative(kv.Value);
  230. if (prop.arraySize > 0)
  231. PropertyField(prop.GetArrayElementAtIndex(0));
  232. }
  233. }
  234. EditorGUI.indentLevel--;
  235. }
  236. }
  237. }