InspectTreeView.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using UnityEngine;
  2. using UnityEditor.IMGUI.Controls;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. namespace AssetBundleBrowser
  6. {
  7. internal class InspectTreeItem : TreeViewItem
  8. {
  9. internal string bundlePath { get; private set; }
  10. internal InspectTreeItem(string path, int depth) : base(path.GetHashCode(), depth, path)
  11. {
  12. bundlePath = path;
  13. }
  14. internal InspectTreeItem(string path, int depth, string prettyName) : base(path.GetHashCode(), depth, prettyName)
  15. {
  16. bundlePath = path;
  17. }
  18. }
  19. class InspectBundleTree : TreeView
  20. {
  21. AssetBundleInspectTab m_InspectTab;
  22. internal InspectBundleTree(TreeViewState s, AssetBundleInspectTab parent) : base(s)
  23. {
  24. m_InspectTab = parent;
  25. showBorder = true;
  26. }
  27. protected override TreeViewItem BuildRoot()
  28. {
  29. var root = new TreeViewItem(-1, -1);
  30. root.children = new List<TreeViewItem>();
  31. if (m_InspectTab == null)
  32. Debug.Log("Unknown problem in AssetBundle Browser Inspect tab. Restart Browser and try again, or file ticket on github.");
  33. else
  34. {
  35. foreach (var folder in m_InspectTab.BundleList)
  36. {
  37. if (System.String.IsNullOrEmpty(folder.Key))
  38. {
  39. foreach(var path in folder.Value)
  40. root.AddChild(new InspectTreeItem(path, 0));
  41. }
  42. else
  43. {
  44. var folderItem = new TreeViewItem(folder.Key.GetHashCode(), 0, folder.Key);
  45. foreach (var path in folder.Value)
  46. {
  47. var prettyName = path;
  48. if (path.StartsWith(folder.Key)) //how could it not?
  49. prettyName = path.Remove(0, folder.Key.Length + 1);
  50. folderItem.AddChild(new InspectTreeItem(path, 1, prettyName));
  51. }
  52. root.AddChild(folderItem);
  53. }
  54. }
  55. }
  56. return root;
  57. }
  58. public override void OnGUI(Rect rect)
  59. {
  60. base.OnGUI(rect);
  61. if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && rect.Contains(Event.current.mousePosition))
  62. {
  63. SetSelection(new int[0], TreeViewSelectionOptions.FireSelectionChanged);
  64. }
  65. }
  66. protected override void RowGUI(RowGUIArgs args)
  67. {
  68. base.RowGUI(args);
  69. if (args.item.depth == 0)
  70. {
  71. var width = 16;
  72. var edgeRect = new Rect(args.rowRect.xMax - width, args.rowRect.y, width, args.rowRect.height);
  73. if (GUI.Button(edgeRect, "-"))
  74. {
  75. if (GetSelection().Contains(args.item.id))
  76. {
  77. var selection = GetSelection();
  78. foreach (var id in selection)
  79. {
  80. var item = FindItem(id, rootItem);
  81. if(item.depth == 0)
  82. RemoveItem(item);
  83. }
  84. }
  85. else
  86. {
  87. RemoveItem(args.item);
  88. }
  89. m_InspectTab.RefreshBundles();
  90. }
  91. }
  92. }
  93. private void RemoveItem(TreeViewItem item)
  94. {
  95. var inspectItem = item as InspectTreeItem;
  96. if (inspectItem != null)
  97. m_InspectTab.RemoveBundlePath(inspectItem.bundlePath);
  98. else
  99. m_InspectTab.RemoveBundleFolder(item.displayName);
  100. }
  101. protected override void SelectionChanged(IList<int> selectedIds)
  102. {
  103. base.SelectionChanged(selectedIds);
  104. if (selectedIds == null)
  105. return;
  106. if (selectedIds.Count > 0)
  107. {
  108. m_InspectTab.SetBundleItem(FindRows(selectedIds).Select(tvi => tvi as InspectTreeItem).ToList());
  109. //m_InspectTab.SetBundleItem(FindItem(selectedIds[0], rootItem) as InspectTreeItem);
  110. }
  111. else
  112. {
  113. m_InspectTab.SetBundleItem(null);
  114. }
  115. }
  116. protected override bool CanMultiSelect(TreeViewItem item)
  117. {
  118. return true;
  119. }
  120. }
  121. }