暫無描述
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.

XChartsEditor.cs 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using UnityEditor;
  6. using UnityEngine;
  7. using UnityEngine.EventSystems;
  8. using UnityEngine.UI;
  9. using XCharts.Runtime;
  10. using ADB = UnityEditor.AssetDatabase;
  11. namespace XCharts.Editor
  12. {
  13. public class XChartsEditor : UnityEditor.Editor
  14. {
  15. private static Transform GetParent()
  16. {
  17. GameObject selectObj = Selection.activeGameObject;
  18. if (selectObj == null)
  19. {
  20. var canvas = GameObject.FindObjectOfType<Canvas>();
  21. if (canvas != null) return canvas.transform;
  22. else
  23. {
  24. var canvasObject = new GameObject();
  25. canvasObject.name = "Canvas";
  26. canvas = canvasObject.AddComponent<Canvas>();
  27. canvas.renderMode = RenderMode.ScreenSpaceCamera;
  28. var mainCamera = GameObject.FindGameObjectWithTag("MainCamera");
  29. canvas.worldCamera = mainCamera == null ? null : mainCamera.GetComponent<Camera>();
  30. canvasObject.AddComponent<CanvasScaler>();
  31. canvasObject.AddComponent<GraphicRaycaster>();
  32. if (GameObject.Find("EventSystem") == null)
  33. {
  34. var eventSystem = new GameObject();
  35. eventSystem.name = "EventSystem";
  36. eventSystem.AddComponent<EventSystem>();
  37. eventSystem.AddComponent<StandaloneInputModule>();
  38. }
  39. return canvas.transform;
  40. }
  41. }
  42. else
  43. {
  44. return selectObj.transform;
  45. }
  46. }
  47. private static string GetName(Transform parent, string name)
  48. {
  49. if (parent.Find(name) == null) return name;
  50. for (int i = 1; i <= 10; i++)
  51. {
  52. var newName = string.Format("{0} ({1})", name, i);
  53. if (parent.Find(newName) == null)
  54. {
  55. return newName;
  56. }
  57. }
  58. return name;
  59. }
  60. public static T AddChart<T>(string chartName) where T : BaseChart
  61. {
  62. XCThemeMgr.CheckReloadTheme();
  63. return AddGraph<T>(chartName);
  64. }
  65. public static T AddGraph<T>(string graphName) where T : BaseGraph
  66. {
  67. var parent = GetParent();
  68. if (parent == null) return null;
  69. XCThemeMgr.CheckReloadTheme();
  70. var obj = new GameObject();
  71. obj.name = GetName(parent, graphName);
  72. obj.layer = LayerMask.NameToLayer("UI");
  73. var t = obj.AddComponent<T>();
  74. obj.transform.SetParent(parent);
  75. obj.transform.localScale = Vector3.one;
  76. obj.transform.localPosition = Vector3.zero;
  77. obj.transform.localRotation = Quaternion.Euler(0, 0, 0);
  78. var rect = obj.GetComponent<RectTransform>();
  79. rect.anchorMin = new Vector2(0.5f, 0.5f);
  80. rect.anchorMax = new Vector2(0.5f, 0.5f);
  81. rect.pivot = new Vector2(0.5f, 0.5f);
  82. Selection.activeGameObject = obj;
  83. EditorUtility.SetDirty(obj);
  84. return t;
  85. }
  86. [MenuItem("XCharts/EmptyChart", priority = 43)]
  87. [MenuItem("GameObject/XCharts/EmptyChart", priority = 43)]
  88. public static void AddBaseChart()
  89. {
  90. var chart = AddChart<BaseChart>("EmptyChart");
  91. chart.GetChartComponent<Title>().text = "EmptyChart";
  92. }
  93. [MenuItem("XCharts/LineChart", priority = 44)]
  94. [MenuItem("GameObject/XCharts/LineChart", priority = 44)]
  95. public static void AddLineChart()
  96. {
  97. AddChart<LineChart>("LineChart");
  98. }
  99. [MenuItem("XCharts/BarChart", priority = 45)]
  100. [MenuItem("GameObject/XCharts/BarChart", priority = 45)]
  101. public static void AddBarChart()
  102. {
  103. AddChart<BarChart>("BarChart");
  104. }
  105. [MenuItem("XCharts/PieChart", priority = 46)]
  106. [MenuItem("GameObject/XCharts/PieChart", priority = 46)]
  107. public static void AddPieChart()
  108. {
  109. AddChart<PieChart>("PieChart");
  110. }
  111. [MenuItem("XCharts/RadarChart", priority = 47)]
  112. [MenuItem("GameObject/XCharts/RadarChart", priority = 47)]
  113. public static void AddRadarChart()
  114. {
  115. AddChart<RadarChart>("RadarChart");
  116. }
  117. [MenuItem("XCharts/ScatterChart", priority = 48)]
  118. [MenuItem("GameObject/XCharts/ScatterChart", priority = 48)]
  119. public static void AddScatterChart()
  120. {
  121. AddChart<ScatterChart>("ScatterChart");
  122. }
  123. [MenuItem("XCharts/HeatmapChart", priority = 49)]
  124. [MenuItem("GameObject/XCharts/HeatmapChart", priority = 49)]
  125. public static void AddHeatmapChart()
  126. {
  127. AddChart<HeatmapChart>("HeatmapChart");
  128. }
  129. [MenuItem("XCharts/RingChart", priority = 51)]
  130. [MenuItem("GameObject/XCharts/RingChart", priority = 51)]
  131. public static void AddRingChart()
  132. {
  133. AddChart<RingChart>("RingChart");
  134. }
  135. [MenuItem("XCharts/CandlestickChart", priority = 54)]
  136. [MenuItem("GameObject/XCharts/CandlestickChart", priority = 54)]
  137. public static void CandlestickChart()
  138. {
  139. AddChart<CandlestickChart>("CandlestickChart");
  140. }
  141. [MenuItem("XCharts/PolarChart", priority = 54)]
  142. [MenuItem("GameObject/XCharts/PolarChart", priority = 54)]
  143. public static void PolarChart()
  144. {
  145. AddChart<PolarChart>("PolarChart");
  146. }
  147. [MenuItem("XCharts/ParallelChart", priority = 55)]
  148. [MenuItem("GameObject/XCharts/ParallelChart", priority = 55)]
  149. public static void ParallelChart()
  150. {
  151. AddChart<ParallelChart>("ParallelChart");
  152. }
  153. [MenuItem("XCharts/SimplifiedLineChart", priority = 56)]
  154. [MenuItem("GameObject/XCharts/SimplifiedLineChart", priority = 56)]
  155. public static void SimplifiedLineChart()
  156. {
  157. AddChart<SimplifiedLineChart>("SimplifiedLineChart");
  158. }
  159. [MenuItem("XCharts/SimplifiedBarChart", priority = 57)]
  160. [MenuItem("GameObject/XCharts/SimplifiedBarChart", priority = 57)]
  161. public static void SimplifiedBarChart()
  162. {
  163. AddChart<SimplifiedBarChart>("SimplifiedBarChart");
  164. }
  165. [MenuItem("XCharts/SimplifiedCandlestickChart", priority = 58)]
  166. [MenuItem("GameObject/XCharts/SimplifiedCandlestickChart", priority = 58)]
  167. public static void SimplifiedCandlestickChart()
  168. {
  169. AddChart<SimplifiedCandlestickChart>("SimplifiedCandlestickChart");
  170. }
  171. [MenuItem("XCharts/Themes Reload")]
  172. public static void ReloadTheme()
  173. {
  174. XCThemeMgr.ReloadThemeList();
  175. }
  176. #region Text mesh pro support
  177. #if UNITY_2017_1_OR_NEWER
  178. const string SYMBOL_TMP = "dUI_TextMeshPro";
  179. const string ASMDEF_TMP = "Unity.TextMeshPro";
  180. [MenuItem("XCharts/TextMeshPro Enable")]
  181. public static void EnableTextMeshPro()
  182. {
  183. if (!IsSpecifyAssemblyExist(ASMDEF_TMP))
  184. {
  185. Debug.LogError("TextMeshPro is not in the project, please import TextMeshPro package first.");
  186. return;
  187. }
  188. DefineSymbolsUtil.AddGlobalDefine(SYMBOL_TMP);
  189. XChartsMgr.RemoveAllChartObject();
  190. InsertSpecifyReferenceIntoAssembly(Platform.Editor, ASMDEF_TMP);
  191. InsertSpecifyReferenceIntoAssembly(Platform.Runtime, ASMDEF_TMP);
  192. }
  193. [MenuItem("XCharts/TextMeshPro Disable")]
  194. public static void DisableTextMeshPro()
  195. {
  196. RemoveSpecifyReferenceFromAssembly(Platform.Editor, ASMDEF_TMP);
  197. RemoveSpecifyReferenceFromAssembly(Platform.Runtime, ASMDEF_TMP);
  198. DefineSymbolsUtil.RemoveGlobalDefine(SYMBOL_TMP);
  199. XChartsMgr.RemoveAllChartObject();
  200. }
  201. #endif
  202. #endregion
  203. #region InputSystem Support
  204. #if UNITY_2019_1_OR_NEWER
  205. //As InputSystem is released in 2019.1+ ,when unity version is 2019.1+ , enable InputSystem Support
  206. const string SYMBOL_I_S = "INPUT_SYSTEM_ENABLED";
  207. const string ASMDEF_I_S = "Unity.InputSystem";
  208. [MenuItem("XCharts/InputSystem Enable")]
  209. public static void EnableInputSystem()
  210. {
  211. if (!IsSpecifyAssemblyExist(ASMDEF_I_S))
  212. {
  213. Debug.LogError("InputSystem is not in the project, please import InputSystem package first.");
  214. return;
  215. }
  216. // insert input system package into editor and runtime assembly
  217. InsertSpecifyReferenceIntoAssembly(Platform.Editor, ASMDEF_I_S);
  218. InsertSpecifyReferenceIntoAssembly(Platform.Runtime, ASMDEF_I_S);
  219. // add scripting define symbols
  220. DefineSymbolsUtil.AddGlobalDefine(SYMBOL_I_S);
  221. }
  222. [MenuItem("XCharts/InputSystem Disable")]
  223. public static void DisableInputSystem()
  224. {
  225. // remove input system package into editor and runtime assembly
  226. RemoveSpecifyReferenceFromAssembly(Platform.Editor, ASMDEF_I_S);
  227. RemoveSpecifyReferenceFromAssembly(Platform.Runtime, ASMDEF_I_S);
  228. // remove scripting define symbols
  229. DefineSymbolsUtil.RemoveGlobalDefine(SYMBOL_I_S);
  230. }
  231. #endif
  232. #endregion
  233. #region Assistant members
  234. #if UNITY_2017_1_OR_NEWER
  235. // as text mesh pro is released in 2017.1, so we may use these function and types in 2017.1 or later
  236. private static void InsertSpecifyReferenceIntoAssembly(Platform platform, string reference)
  237. {
  238. var file = GetPackageAssemblyDefinitionPath(platform);
  239. var content = File.ReadAllText(file);
  240. var data = new AssemblyDefinitionData();
  241. EditorJsonUtility.FromJsonOverwrite(content, data);
  242. if (!data.references.Contains(reference))
  243. {
  244. data.references.Add(reference);
  245. var json = EditorJsonUtility.ToJson(data, true);
  246. File.WriteAllText(file, json);
  247. AssetDatabase.SaveAssets();
  248. AssetDatabase.Refresh();
  249. }
  250. }
  251. private static void RemoveSpecifyReferenceFromAssembly(Platform platform, string reference)
  252. {
  253. var file = GetPackageAssemblyDefinitionPath(platform);
  254. var content = File.ReadAllText(file);
  255. var data = new AssemblyDefinitionData();
  256. EditorJsonUtility.FromJsonOverwrite(content, data);
  257. if (data.references.Contains(reference))
  258. {
  259. data.references.Remove(reference);
  260. var json = EditorJsonUtility.ToJson(data, true);
  261. File.WriteAllText(file, json);
  262. }
  263. }
  264. public enum Platform { Editor, Runtime }
  265. public static string GetPackageAssemblyDefinitionPath(Platform platform)
  266. {
  267. var p = platform == Platform.Editor ? "Editor" : "Runtime";
  268. var f = "XCharts." + p + ".asmdef";
  269. var sub = Path.Combine(p, f);
  270. string packagePath = Path.GetFullPath("Packages/com.monitor1394.xcharts");
  271. if (!Directory.Exists(packagePath))
  272. {
  273. packagePath = ADB.FindAssets("t:Script")
  274. .Where(v => Path.GetFileNameWithoutExtension(ADB.GUIDToAssetPath(v)) == "XChartsMgr")
  275. .Select(id => ADB.GUIDToAssetPath(id))
  276. .FirstOrDefault();
  277. packagePath = Path.GetDirectoryName(packagePath);
  278. packagePath = packagePath.Substring(0, packagePath.LastIndexOf("Runtime"));
  279. }
  280. return Path.Combine(packagePath, sub);
  281. }
  282. public static bool IsSpecifyAssemblyExist(string name)
  283. {
  284. #if UNITY_2018_1_OR_NEWER
  285. foreach (var assembly in UnityEditor.Compilation.CompilationPipeline.GetAssemblies(UnityEditor.Compilation.AssembliesType.Player))
  286. {
  287. if (assembly.name.Equals(name)) return true;
  288. }
  289. #elif UNITY_2017_3_OR_NEWER
  290. foreach (var assembly in UnityEditor.Compilation.CompilationPipeline.GetAssemblies())
  291. {
  292. if (assembly.name.Equals(name)) return true;
  293. }
  294. #endif
  295. return false;
  296. }
  297. [Serializable]
  298. class AssemblyDefinitionData
  299. {
  300. #pragma warning disable 649
  301. public string name;
  302. public List<string> references;
  303. public List<string> includePlatforms;
  304. public List<string> excludePlatforms;
  305. public bool allowUnsafeCode;
  306. public bool overrideReferences;
  307. public List<string> precompiledReferences;
  308. public bool autoReferenced;
  309. public List<string> defineConstraints;
  310. public List<string> versionDefines;
  311. public bool noEngineReferences;
  312. #pragma warning restore 649
  313. }
  314. #endif
  315. #endregion
  316. }
  317. }