BundleDetailList.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. using UnityEditor;
  2. using UnityEngine;
  3. using System.Collections.Generic;
  4. using UnityEditor.IMGUI.Controls;
  5. namespace AssetBundleBrowser
  6. {
  7. internal class BundleDetailItem : TreeViewItem
  8. {
  9. internal BundleDetailItem(int id, int depth, string displayName, MessageType type) : base(id, depth, displayName)
  10. {
  11. MessageLevel = type;
  12. }
  13. internal MessageType MessageLevel
  14. { get; set; }
  15. }
  16. internal class BundleDetailList : TreeView
  17. {
  18. HashSet<AssetBundleModel.BundleDataInfo> m_Selecteditems;
  19. Rect m_TotalRect;
  20. const float k_DoubleIndent = 32f;
  21. const string k_SizeHeader = "Size: ";
  22. const string k_DependencyHeader = "Dependent On:";
  23. const string k_DependencyEmpty = k_DependencyHeader + " - None";
  24. const string k_MessageHeader = "Messages:";
  25. const string k_MessageEmpty = k_MessageHeader + " - None";
  26. internal BundleDetailList(TreeViewState state) : base(state)
  27. {
  28. m_Selecteditems = new HashSet<AssetBundleModel.BundleDataInfo>();
  29. showBorder = true;
  30. }
  31. internal void Update()
  32. {
  33. bool dirty = false;
  34. foreach (var bundle in m_Selecteditems)
  35. {
  36. dirty |= bundle.dirty;
  37. }
  38. if (dirty)
  39. {
  40. Reload();
  41. ExpandAll();
  42. }
  43. }
  44. protected override TreeViewItem BuildRoot()
  45. {
  46. var root = new TreeViewItem(-1, -1);
  47. root.children = new List<TreeViewItem>();
  48. if (m_Selecteditems != null)
  49. {
  50. foreach(var bundle in m_Selecteditems)
  51. {
  52. root.AddChild(AppendBundleToTree(bundle));
  53. }
  54. }
  55. return root;
  56. }
  57. protected override void RowGUI(RowGUIArgs args)
  58. {
  59. if ((args.item as BundleDetailItem) != null)
  60. {
  61. EditorGUI.HelpBox(
  62. new Rect(args.rowRect.x + k_DoubleIndent, args.rowRect.y, args.rowRect.width - k_DoubleIndent, args.rowRect.height),
  63. args.item.displayName,
  64. (args.item as BundleDetailItem).MessageLevel);
  65. }
  66. else
  67. {
  68. Color old = GUI.color;
  69. if (args.item.depth == 1 &&
  70. (args.item.displayName == k_MessageEmpty || args.item.displayName == k_DependencyEmpty))
  71. GUI.color = AssetBundleModel.Model.k_LightGrey;
  72. base.RowGUI(args);
  73. GUI.color = old;
  74. }
  75. }
  76. public override void OnGUI(Rect rect)
  77. {
  78. m_TotalRect = rect;
  79. base.OnGUI(rect);
  80. }
  81. protected override float GetCustomRowHeight(int row, TreeViewItem item)
  82. {
  83. if( (item as BundleDetailItem) != null)
  84. {
  85. float height = DefaultStyles.backgroundEven.CalcHeight(new GUIContent(item.displayName), m_TotalRect.width);
  86. return height + 3f;
  87. }
  88. return base.GetCustomRowHeight(row, item);
  89. }
  90. internal TreeViewItem AppendBundleToTree(AssetBundleModel.BundleDataInfo bundle)
  91. {
  92. var itemName = bundle.m_Name.fullNativeName;
  93. var bunRoot = new TreeViewItem(itemName.GetHashCode(), 0, itemName);
  94. var str = itemName + k_SizeHeader;
  95. var sz = new TreeViewItem(str.GetHashCode(), 1, k_SizeHeader + bundle.TotalSize());
  96. str = itemName + k_DependencyHeader;
  97. var dependency = new TreeViewItem(str.GetHashCode(), 1, k_DependencyEmpty);
  98. var depList = bundle.GetBundleDependencies();
  99. if(depList.Count > 0)
  100. {
  101. dependency.displayName = k_DependencyHeader;
  102. foreach (var dep in bundle.GetBundleDependencies())
  103. {
  104. str = itemName + dep;
  105. dependency.AddChild(new TreeViewItem(str.GetHashCode(), 2, dep));
  106. }
  107. }
  108. str = itemName + k_MessageHeader;
  109. var msg = new TreeViewItem(str.GetHashCode(), 1, k_MessageEmpty);
  110. if (bundle.HasMessages())
  111. {
  112. msg.displayName = k_MessageHeader;
  113. var currMessages = bundle.GetMessages();
  114. foreach(var currMsg in currMessages)
  115. {
  116. str = itemName + currMsg.message;
  117. msg.AddChild(new BundleDetailItem(str.GetHashCode(), 2, currMsg.message, currMsg.severity));
  118. }
  119. }
  120. bunRoot.AddChild(sz);
  121. bunRoot.AddChild(dependency);
  122. bunRoot.AddChild(msg);
  123. return bunRoot;
  124. }
  125. internal void SetItems(IEnumerable<AssetBundleModel.BundleInfo> items)
  126. {
  127. m_Selecteditems.Clear();
  128. foreach(var item in items)
  129. {
  130. CollectBundles(item);
  131. }
  132. SetSelection(new List<int>());
  133. Reload();
  134. ExpandAll();
  135. }
  136. internal void CollectBundles(AssetBundleModel.BundleInfo bundle)
  137. {
  138. var bunData = bundle as AssetBundleModel.BundleDataInfo;
  139. if (bunData != null)
  140. m_Selecteditems.Add(bunData);
  141. else
  142. {
  143. var bunFolder = bundle as AssetBundleModel.BundleFolderInfo;
  144. foreach (var bun in bunFolder.GetChildList())
  145. {
  146. CollectBundles(bun);
  147. }
  148. }
  149. }
  150. }
  151. }