SerieEditor.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  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. private bool m_LinksFoldout = false;
  15. private Dictionary<int, bool> m_LinksElementFoldout = new Dictionary<int, bool>();
  16. public override void OnInspectorGUI()
  17. {
  18. ++EditorGUI.indentLevel;
  19. PropertyField("m_SerieName");
  20. if (m_CoordOptionsNames != null && m_CoordOptionsNames.Count > 1)
  21. {
  22. var index = m_CoordOptionsNames.IndexOf(serie.coordSystem);
  23. var selectedIndex = EditorGUILayout.Popup("Coord System", index, m_CoordOptionsNames.ToArray());
  24. if (selectedIndex != index)
  25. {
  26. var typeName = m_CoordOptionsNames[selectedIndex];
  27. serie.coordSystem = m_CoordOptionsDic[typeName].Name;
  28. }
  29. }
  30. PropertyField("m_State");
  31. OnCustomInspectorGUI();
  32. OnExtraInspectorGUI();
  33. PropertyFieldData();
  34. OnEndCustomInspectorGUI();
  35. --EditorGUI.indentLevel;
  36. }
  37. public virtual void OnCustomInspectorGUI()
  38. { }
  39. public virtual void OnEndCustomInspectorGUI()
  40. { }
  41. private void OnExtraInspectorGUI()
  42. {
  43. foreach (var kv in Serie.extraComponentMap)
  44. {
  45. var prop = FindProperty(kv.Value);
  46. if (prop.arraySize > 0)
  47. PropertyField(prop.GetArrayElementAtIndex(0));
  48. }
  49. }
  50. private void PropertyFieldData()
  51. {
  52. m_DataFoldout = ChartEditorHelper.DrawHeader("Data", m_DataFoldout, false, null, null,
  53. new HeaderMenuInfo("Import ECharts Data", () =>
  54. {
  55. PraseExternalDataEditor.UpdateData(chart, serie, null, false);
  56. PraseExternalDataEditor.ShowWindow();
  57. }));
  58. if (!m_DataFoldout) return;
  59. EditorGUI.indentLevel++;
  60. var m_Datas = FindProperty("m_Data");
  61. var m_DataDimension = FindProperty("m_ShowDataDimension");
  62. var m_ShowDataName = FindProperty("m_ShowDataName");
  63. PropertyField(m_ShowDataName);
  64. PropertyField(m_DataDimension);
  65. var listSize = m_Datas.arraySize;
  66. listSize = EditorGUILayout.IntField("Size", listSize);
  67. if (listSize < 0) listSize = 0;
  68. if (m_DataDimension.intValue < 1) m_DataDimension.intValue = 1;
  69. int dimension = m_DataDimension.intValue;
  70. bool showName = m_ShowDataName.boolValue;
  71. if (listSize != m_Datas.arraySize)
  72. {
  73. while (listSize > m_Datas.arraySize) m_Datas.arraySize++;
  74. while (listSize < m_Datas.arraySize) m_Datas.arraySize--;
  75. serie.ResetDataIndex();
  76. }
  77. if (listSize > 30) // && !XCSettings.editorShowAllListData)
  78. {
  79. int num = listSize > 10 ? 10 : listSize;
  80. for (int i = 0; i < num; i++)
  81. {
  82. DrawSerieData(dimension, m_Datas, i, showName);
  83. }
  84. if (num >= 10)
  85. {
  86. ChartEditorHelper.DrawHeader("... ", false, false, null, null);
  87. DrawSerieData(dimension, m_Datas, listSize - 1, showName);
  88. }
  89. }
  90. else
  91. {
  92. for (int i = 0; i < m_Datas.arraySize; i++)
  93. {
  94. DrawSerieData(dimension, m_Datas, i, showName);
  95. }
  96. }
  97. EditorGUI.indentLevel--;
  98. }
  99. protected void PropertyFieldLinks()
  100. {
  101. m_LinksFoldout = ChartEditorHelper.DrawHeader("Links", m_LinksFoldout, false, null, null,
  102. new HeaderMenuInfo("Import ECharts Link", () =>
  103. {
  104. //PraseExternalDataEditor.UpdateData(chart, serie, null, true);
  105. //PraseExternalDataEditor.ShowWindow();
  106. }));
  107. if (!m_LinksFoldout) return;
  108. EditorGUI.indentLevel++;
  109. var m_Links = FindProperty("m_Links");
  110. var listSize = m_Links.arraySize;
  111. listSize = EditorGUILayout.IntField("Size", listSize);
  112. if (listSize < 0) listSize = 0;
  113. if (listSize != m_Links.arraySize)
  114. {
  115. while (listSize > m_Links.arraySize) m_Links.arraySize++;
  116. while (listSize < m_Links.arraySize) m_Links.arraySize--;
  117. }
  118. if (listSize > 30) // && !XCSettings.editorShowAllListData)
  119. {
  120. int num = listSize > 10 ? 10 : listSize;
  121. for (int i = 0; i < num; i++)
  122. {
  123. DrawSerieDataLink(m_Links, i);
  124. }
  125. if (num >= 10)
  126. {
  127. ChartEditorHelper.DrawHeader("... ", false, false, null, null);
  128. DrawSerieDataLink(m_Links, listSize - 1);
  129. }
  130. }
  131. else
  132. {
  133. for (int i = 0; i < m_Links.arraySize; i++)
  134. {
  135. DrawSerieDataLink(m_Links, i);
  136. }
  137. }
  138. EditorGUI.indentLevel--;
  139. }
  140. protected void PropertyFiledMore(System.Action action)
  141. {
  142. m_MoreFoldout = ChartEditorHelper.DrawHeader(MORE, m_MoreFoldout, false, null, null);
  143. if (m_MoreFoldout)
  144. {
  145. if (action != null) action();
  146. }
  147. }
  148. private void DrawSerieData(int dimension, SerializedProperty m_Datas, int index, bool showName)
  149. {
  150. bool flag;
  151. if (!m_DataElementFoldout.TryGetValue(index, out flag))
  152. {
  153. flag = false;
  154. m_DataElementFoldout[index] = false;
  155. }
  156. var fieldCount = dimension + (showName ? 1 : 0);
  157. var serieData = m_Datas.GetArrayElementAtIndex(index);
  158. var dataIndex = serieData.FindPropertyRelative("m_Index").intValue;
  159. m_DataElementFoldout[index] = ChartEditorHelper.DrawHeader("SerieData " + dataIndex, flag, false, null,
  160. delegate (Rect drawRect)
  161. {
  162. //drawRect.width -= 2f;
  163. var maxX = drawRect.xMax;
  164. var currentWidth = drawRect.width;
  165. var lastX = drawRect.x;
  166. var lastWid = drawRect.width;
  167. var lastFieldWid = EditorGUIUtility.fieldWidth;
  168. var lastLabelWid = EditorGUIUtility.labelWidth;
  169. //var serieData = m_Datas.GetArrayElementAtIndex(index);
  170. var sereName = serieData.FindPropertyRelative("m_Name");
  171. var data = serieData.FindPropertyRelative("m_Data");
  172. #if UNITY_2019_3_OR_NEWER
  173. var gap = 2;
  174. var namegap = 3;
  175. #else
  176. var gap = 0;
  177. var namegap = 0;
  178. #endif
  179. if (fieldCount <= 1)
  180. {
  181. while (2 > data.arraySize)
  182. {
  183. var value = data.arraySize == 0 ? index : 0;
  184. data.arraySize++;
  185. data.GetArrayElementAtIndex(data.arraySize - 1).floatValue = value;
  186. }
  187. SerializedProperty element = data.GetArrayElementAtIndex(1);
  188. var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * 15 + gap;
  189. drawRect.x = startX;
  190. drawRect.xMax = maxX;
  191. EditorGUI.PropertyField(drawRect, element, GUIContent.none);
  192. }
  193. else
  194. {
  195. var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * 15 + gap;
  196. var dataWidTotal = (currentWidth - (startX + 20.5f + 1));
  197. var dataWid = dataWidTotal / fieldCount;
  198. var xWid = dataWid - 0;
  199. for (int i = 0; i < dimension; i++)
  200. {
  201. var dataCount = i < 1 ? 2 : i + 1;
  202. while (dataCount > data.arraySize)
  203. {
  204. var value = data.arraySize == 0 ? index : 0;
  205. data.arraySize++;
  206. data.GetArrayElementAtIndex(data.arraySize - 1).floatValue = value;
  207. }
  208. drawRect.x = startX + i * xWid;
  209. drawRect.width = dataWid + 25;
  210. SerializedProperty element = data.GetArrayElementAtIndex(dimension <= 1 ? 1 : i);
  211. EditorGUI.PropertyField(drawRect, element, GUIContent.none);
  212. }
  213. if (showName)
  214. {
  215. drawRect.x = startX + (fieldCount - 1) * xWid;
  216. drawRect.width = dataWid + 40 + dimension * namegap - 2.5f;
  217. EditorGUI.PropertyField(drawRect, sereName, GUIContent.none);
  218. }
  219. EditorGUIUtility.fieldWidth = lastFieldWid;
  220. EditorGUIUtility.labelWidth = lastLabelWid;
  221. }
  222. });
  223. if (m_DataElementFoldout[index])
  224. {
  225. if (!(serie is ISimplifiedSerie))
  226. DrawSerieDataDetail(m_Datas, index);
  227. }
  228. }
  229. private void DrawSerieDataDetail(SerializedProperty m_Datas, int index)
  230. {
  231. EditorGUI.indentLevel++;
  232. var serieData = m_Datas.GetArrayElementAtIndex(index);
  233. PropertyField(serieData.FindPropertyRelative("m_Name"));
  234. //PropertyField(serieData.FindPropertyRelative("m_State"));
  235. if (serie.GetType().IsDefined(typeof(SerieDataExtraFieldAttribute), false))
  236. {
  237. var attribute = serie.GetType().GetAttribute<SerieDataExtraFieldAttribute>();
  238. foreach (var field in attribute.fields)
  239. {
  240. PropertyField(serieData.FindPropertyRelative(field));
  241. }
  242. }
  243. serieDataMenus.Clear();
  244. if (serie.GetType().IsDefined(typeof(SerieDataComponentAttribute), false))
  245. {
  246. var attribute = serie.GetType().GetAttribute<SerieDataComponentAttribute>();
  247. foreach (var type in attribute.types)
  248. {
  249. var size = serieData.FindPropertyRelative(SerieData.extraComponentMap[type]).arraySize;
  250. serieDataMenus.Add(new HeaderMenuInfo("Add " + type.Name, () =>
  251. {
  252. serie.GetSerieData(index).EnsureComponent(type);
  253. EditorUtility.SetDirty(chart);
  254. }, size == 0));
  255. }
  256. foreach (var type in attribute.types)
  257. {
  258. var size = serieData.FindPropertyRelative(SerieData.extraComponentMap[type]).arraySize;
  259. serieDataMenus.Add(new HeaderMenuInfo("Remove " + type.Name, () =>
  260. {
  261. serie.GetSerieData(index).RemoveComponent(type);
  262. EditorUtility.SetDirty(chart);
  263. }, size > 0));
  264. }
  265. }
  266. serieDataMenus.Add(new HeaderMenuInfo("Remove All", () =>
  267. {
  268. serie.GetSerieData(index).RemoveAllComponent();
  269. }, true));
  270. m_DataComponentFoldout = ChartEditorHelper.DrawHeader("Component", m_DataComponentFoldout, false, null, null, serieDataMenus);
  271. if (m_DataComponentFoldout)
  272. {
  273. foreach (var kv in SerieData.extraComponentMap)
  274. {
  275. var prop = serieData.FindPropertyRelative(kv.Value);
  276. if (prop.arraySize > 0)
  277. PropertyField(prop.GetArrayElementAtIndex(0));
  278. }
  279. }
  280. EditorGUI.indentLevel--;
  281. }
  282. private void DrawSerieDataLink(SerializedProperty m_Datas, int index)
  283. {
  284. bool flag;
  285. if (!m_LinksElementFoldout.TryGetValue(index, out flag))
  286. {
  287. flag = false;
  288. m_LinksElementFoldout[index] = false;
  289. }
  290. var dataLink = m_Datas.GetArrayElementAtIndex(index);
  291. m_LinksElementFoldout[index] = ChartEditorHelper.DrawHeader("Link " + index, flag, false, null,
  292. delegate (Rect drawRect)
  293. {
  294. var sourceIndex = dataLink.FindPropertyRelative("m_Source");
  295. var targetIndex = dataLink.FindPropertyRelative("m_Target");
  296. var value = dataLink.FindPropertyRelative("m_Value");
  297. ChartEditorHelper.MakeThreeField(ref drawRect, drawRect.width, sourceIndex, targetIndex, value, "");
  298. });
  299. if (m_LinksElementFoldout[index])
  300. {
  301. DrawSerieDataLinkDetail(m_Datas, index);
  302. }
  303. }
  304. private void DrawSerieDataLinkDetail(SerializedProperty m_Links, int index)
  305. {
  306. EditorGUI.indentLevel++;
  307. var dataLink = m_Links.GetArrayElementAtIndex(index);
  308. PropertyField(dataLink.FindPropertyRelative("m_Source"));
  309. PropertyField(dataLink.FindPropertyRelative("m_Target"));
  310. PropertyField(dataLink.FindPropertyRelative("m_Value"));
  311. EditorGUI.indentLevel--;
  312. }
  313. }
  314. }