DebuggerAssetListViewer.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. #if UNITY_2019_4_OR_NEWER
  2. using System.IO;
  3. using System.Linq;
  4. using System.Collections.Generic;
  5. using UnityEditor;
  6. using UnityEngine;
  7. using UnityEditor.UIElements;
  8. using UnityEngine.UIElements;
  9. namespace YooAsset.Editor
  10. {
  11. internal class DebuggerAssetListViewer
  12. {
  13. private VisualTreeAsset _visualAsset;
  14. private TemplateContainer _root;
  15. private ListView _assetListView;
  16. private ListView _dependListView;
  17. private DebugReport _debugReport;
  18. /// <summary>
  19. /// 初始化页面
  20. /// </summary>
  21. public void InitViewer()
  22. {
  23. // 加载布局文件
  24. _visualAsset = UxmlLoader.LoadWindowUXML<DebuggerAssetListViewer>();
  25. if (_visualAsset == null)
  26. return;
  27. _root = _visualAsset.CloneTree();
  28. _root.style.flexGrow = 1f;
  29. // 资源列表
  30. _assetListView = _root.Q<ListView>("TopListView");
  31. _assetListView.makeItem = MakeAssetListViewItem;
  32. _assetListView.bindItem = BindAssetListViewItem;
  33. #if UNITY_2020_1_OR_NEWER
  34. _assetListView.onSelectionChange += AssetListView_onSelectionChange;
  35. #else
  36. _assetListView.onSelectionChanged += AssetListView_onSelectionChange;
  37. #endif
  38. // 依赖列表
  39. _dependListView = _root.Q<ListView>("BottomListView");
  40. _dependListView.makeItem = MakeDependListViewItem;
  41. _dependListView.bindItem = BindDependListViewItem;
  42. #if UNITY_2020_3_OR_NEWER
  43. SplitView.Adjuster(_root);
  44. #endif
  45. }
  46. /// <summary>
  47. /// 清空页面
  48. /// </summary>
  49. public void ClearView()
  50. {
  51. _debugReport = null;
  52. _assetListView.Clear();
  53. _assetListView.ClearSelection();
  54. _assetListView.itemsSource.Clear();
  55. _assetListView.Rebuild();
  56. }
  57. /// <summary>
  58. /// 填充页面数据
  59. /// </summary>
  60. public void FillViewData(DebugReport debugReport, string searchKeyWord)
  61. {
  62. _debugReport = debugReport;
  63. _assetListView.Clear();
  64. _assetListView.ClearSelection();
  65. _assetListView.itemsSource = FilterViewItems(debugReport, searchKeyWord);
  66. _assetListView.Rebuild();
  67. }
  68. private List<DebugProviderInfo> FilterViewItems(DebugReport debugReport, string searchKeyWord)
  69. {
  70. List<DebugProviderInfo> result = new List<DebugProviderInfo>(1000);
  71. foreach (var packageData in debugReport.PackageDatas)
  72. {
  73. var tempList = new List<DebugProviderInfo>(packageData.ProviderInfos.Count);
  74. foreach (var providerInfo in packageData.ProviderInfos)
  75. {
  76. if (string.IsNullOrEmpty(searchKeyWord) == false)
  77. {
  78. if (providerInfo.AssetPath.Contains(searchKeyWord) == false)
  79. continue;
  80. }
  81. providerInfo.PackageName = packageData.PackageName;
  82. tempList.Add(providerInfo);
  83. }
  84. tempList.Sort();
  85. result.AddRange(tempList);
  86. }
  87. return result;
  88. }
  89. /// <summary>
  90. /// 挂接到父类页面上
  91. /// </summary>
  92. public void AttachParent(VisualElement parent)
  93. {
  94. parent.Add(_root);
  95. }
  96. /// <summary>
  97. /// 从父类页面脱离开
  98. /// </summary>
  99. public void DetachParent()
  100. {
  101. _root.RemoveFromHierarchy();
  102. }
  103. // 顶部列表相关
  104. private VisualElement MakeAssetListViewItem()
  105. {
  106. VisualElement element = new VisualElement();
  107. element.style.flexDirection = FlexDirection.Row;
  108. {
  109. var label = new Label();
  110. label.name = "Label0";
  111. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  112. label.style.marginLeft = 3f;
  113. //label.style.flexGrow = 1f;
  114. label.style.width = 150;
  115. element.Add(label);
  116. }
  117. {
  118. var label = new Label();
  119. label.name = "Label1";
  120. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  121. label.style.marginLeft = 3f;
  122. label.style.flexGrow = 1f;
  123. label.style.width = 280;
  124. element.Add(label);
  125. }
  126. {
  127. var label = new Label();
  128. label.name = "Label2";
  129. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  130. label.style.marginLeft = 3f;
  131. //label.style.flexGrow = 1f;
  132. label.style.width = 150;
  133. element.Add(label);
  134. }
  135. {
  136. var label = new Label();
  137. label.name = "Label3";
  138. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  139. label.style.marginLeft = 3f;
  140. //label.style.flexGrow = 1f;
  141. label.style.width = 150;
  142. element.Add(label);
  143. }
  144. {
  145. var label = new Label();
  146. label.name = "Label4";
  147. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  148. label.style.marginLeft = 3f;
  149. //label.style.flexGrow = 1f;
  150. label.style.width = 150;
  151. element.Add(label);
  152. }
  153. {
  154. var label = new Label();
  155. label.name = "Label5";
  156. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  157. label.style.marginLeft = 3f;
  158. //label.style.flexGrow = 1f;
  159. label.style.width = 100;
  160. element.Add(label);
  161. }
  162. {
  163. var label = new Label();
  164. label.name = "Label6";
  165. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  166. label.style.marginLeft = 3f;
  167. //label.style.flexGrow = 1f;
  168. label.style.width = 120;
  169. element.Add(label);
  170. }
  171. return element;
  172. }
  173. private void BindAssetListViewItem(VisualElement element, int index)
  174. {
  175. var sourceData = _assetListView.itemsSource as List<DebugProviderInfo>;
  176. var providerInfo = sourceData[index];
  177. // Package Name
  178. var label0 = element.Q<Label>("Label0");
  179. label0.text = providerInfo.PackageName;
  180. // Asset Path
  181. var label1 = element.Q<Label>("Label1");
  182. label1.text = providerInfo.AssetPath;
  183. // Spawn Scene
  184. var label2 = element.Q<Label>("Label2");
  185. label2.text = providerInfo.SpawnScene;
  186. // Spawn Time
  187. var label3 = element.Q<Label>("Label3");
  188. label3.text = providerInfo.SpawnTime;
  189. // Loading Time
  190. var label4 = element.Q<Label>("Label4");
  191. label4.text = providerInfo.LoadingTime.ToString();
  192. // Ref Count
  193. var label5 = element.Q<Label>("Label5");
  194. label5.text = providerInfo.RefCount.ToString();
  195. // Status
  196. StyleColor textColor;
  197. if (providerInfo.Status == ProviderBase.EStatus.Failed.ToString())
  198. textColor = new StyleColor(Color.yellow);
  199. else
  200. textColor = label1.style.color;
  201. var label6 = element.Q<Label>("Label6");
  202. label6.text = providerInfo.Status.ToString();
  203. label6.style.color = textColor;
  204. }
  205. private void AssetListView_onSelectionChange(IEnumerable<object> objs)
  206. {
  207. foreach (var item in objs)
  208. {
  209. DebugProviderInfo providerInfo = item as DebugProviderInfo;
  210. FillDependListView(providerInfo);
  211. }
  212. }
  213. // 底部列表相关
  214. private VisualElement MakeDependListViewItem()
  215. {
  216. VisualElement element = new VisualElement();
  217. element.style.flexDirection = FlexDirection.Row;
  218. {
  219. var label = new Label();
  220. label.name = "Label1";
  221. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  222. label.style.marginLeft = 3f;
  223. label.style.flexGrow = 1f;
  224. label.style.width = 280;
  225. element.Add(label);
  226. }
  227. {
  228. var label = new Label();
  229. label.name = "Label3";
  230. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  231. label.style.marginLeft = 3f;
  232. //label.style.flexGrow = 1f;
  233. label.style.width = 100;
  234. element.Add(label);
  235. }
  236. {
  237. var label = new Label();
  238. label.name = "Label4";
  239. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  240. label.style.marginLeft = 3f;
  241. //label.style.flexGrow = 1f;
  242. label.style.width = 120;
  243. element.Add(label);
  244. }
  245. return element;
  246. }
  247. private void BindDependListViewItem(VisualElement element, int index)
  248. {
  249. List<DebugBundleInfo> bundles = _dependListView.itemsSource as List<DebugBundleInfo>;
  250. DebugBundleInfo bundleInfo = bundles[index];
  251. // Bundle Name
  252. var label1 = element.Q<Label>("Label1");
  253. label1.text = bundleInfo.BundleName;
  254. // Ref Count
  255. var label3 = element.Q<Label>("Label3");
  256. label3.text = bundleInfo.RefCount.ToString();
  257. // Status
  258. var label4 = element.Q<Label>("Label4");
  259. label4.text = bundleInfo.Status.ToString();
  260. }
  261. private void FillDependListView(DebugProviderInfo selectedProviderInfo)
  262. {
  263. _dependListView.Clear();
  264. _dependListView.ClearSelection();
  265. _dependListView.itemsSource = selectedProviderInfo.DependBundleInfos;
  266. _dependListView.Rebuild();
  267. }
  268. }
  269. }
  270. #endif