AssetBundleManageTab.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. using UnityEditor;
  2. using UnityEditor.IMGUI.Controls;
  3. using UnityEngine;
  4. using System.Collections.Generic;
  5. namespace AssetBundleBrowser
  6. {
  7. [System.Serializable]
  8. internal class AssetBundleManageTab
  9. {
  10. [SerializeField]
  11. TreeViewState m_BundleTreeState;
  12. [SerializeField]
  13. TreeViewState m_AssetListState;
  14. [SerializeField]
  15. MultiColumnHeaderState m_AssetListMCHState;
  16. [SerializeField]
  17. TreeViewState m_BundleDetailState;
  18. Rect m_Position;
  19. AssetBundleTree m_BundleTree;
  20. AssetListTree m_AssetList;
  21. MessageList m_MessageList;
  22. BundleDetailList m_DetailsList;
  23. bool m_ResizingHorizontalSplitter = false;
  24. bool m_ResizingVerticalSplitterRight = false;
  25. bool m_ResizingVerticalSplitterLeft = false;
  26. Rect m_HorizontalSplitterRect, m_VerticalSplitterRectRight, m_VerticalSplitterRectLeft;
  27. [SerializeField]
  28. float m_HorizontalSplitterPercent;
  29. [SerializeField]
  30. float m_VerticalSplitterPercentRight;
  31. [SerializeField]
  32. float m_VerticalSplitterPercentLeft;
  33. const float k_SplitterWidth = 3f;
  34. private static float s_UpdateDelay = 0f;
  35. SearchField m_searchField;
  36. EditorWindow m_Parent = null;
  37. internal AssetBundleManageTab()
  38. {
  39. m_HorizontalSplitterPercent = 0.4f;
  40. m_VerticalSplitterPercentRight = 0.7f;
  41. m_VerticalSplitterPercentLeft = 0.85f;
  42. }
  43. internal void OnEnable(Rect pos, EditorWindow parent)
  44. {
  45. m_Parent = parent;
  46. m_Position = pos;
  47. m_HorizontalSplitterRect = new Rect(
  48. (int)(m_Position.x + m_Position.width * m_HorizontalSplitterPercent),
  49. m_Position.y,
  50. k_SplitterWidth,
  51. m_Position.height);
  52. m_VerticalSplitterRectRight = new Rect(
  53. m_HorizontalSplitterRect.x,
  54. (int)(m_Position.y + m_HorizontalSplitterRect.height * m_VerticalSplitterPercentRight),
  55. (m_Position.width - m_HorizontalSplitterRect.width) - k_SplitterWidth,
  56. k_SplitterWidth);
  57. m_VerticalSplitterRectLeft = new Rect(
  58. m_Position.x,
  59. (int)(m_Position.y + m_HorizontalSplitterRect.height * m_VerticalSplitterPercentLeft),
  60. (m_HorizontalSplitterRect.width) - k_SplitterWidth,
  61. k_SplitterWidth);
  62. m_searchField = new SearchField();
  63. }
  64. internal void Update()
  65. {
  66. var t = Time.realtimeSinceStartup;
  67. if (t - s_UpdateDelay > 0.1f ||
  68. s_UpdateDelay > t) //something went strangely wrong if this second check is true.
  69. {
  70. s_UpdateDelay = t - 0.001f;
  71. if(AssetBundleModel.Model.Update())
  72. {
  73. m_Parent.Repaint();
  74. }
  75. if (m_DetailsList != null)
  76. m_DetailsList.Update();
  77. if (m_AssetList != null)
  78. m_AssetList.Update();
  79. }
  80. }
  81. internal void ForceReloadData()
  82. {
  83. UpdateSelectedBundles(new List<AssetBundleModel.BundleInfo>());
  84. SetSelectedItems(new List<AssetBundleModel.AssetInfo>());
  85. m_BundleTree.SetSelection(new int[0]);
  86. AssetBundleModel.Model.ForceReloadData(m_BundleTree);
  87. m_Parent.Repaint();
  88. }
  89. internal void OnGUI(Rect pos)
  90. {
  91. m_Position = pos;
  92. if(m_BundleTree == null)
  93. {
  94. if (m_AssetListState == null)
  95. m_AssetListState = new TreeViewState();
  96. var headerState = AssetListTree.CreateDefaultMultiColumnHeaderState();// multiColumnTreeViewRect.width);
  97. if (MultiColumnHeaderState.CanOverwriteSerializedFields(m_AssetListMCHState, headerState))
  98. MultiColumnHeaderState.OverwriteSerializedFields(m_AssetListMCHState, headerState);
  99. m_AssetListMCHState = headerState;
  100. m_AssetList = new AssetListTree(m_AssetListState, m_AssetListMCHState, this);
  101. m_AssetList.Reload();
  102. m_MessageList = new MessageList();
  103. if (m_BundleDetailState == null)
  104. m_BundleDetailState = new TreeViewState();
  105. m_DetailsList = new BundleDetailList(m_BundleDetailState);
  106. m_DetailsList.Reload();
  107. if (m_BundleTreeState == null)
  108. m_BundleTreeState = new TreeViewState();
  109. m_BundleTree = new AssetBundleTree(m_BundleTreeState, this);
  110. m_BundleTree.Refresh();
  111. m_Parent.Repaint();
  112. }
  113. HandleHorizontalResize();
  114. HandleVerticalResize();
  115. if (AssetBundleModel.Model.BundleListIsEmpty())
  116. {
  117. m_BundleTree.OnGUI(m_Position);
  118. var style = new GUIStyle(GUI.skin.label);
  119. style.alignment = TextAnchor.MiddleCenter;
  120. style.wordWrap = true;
  121. GUI.Label(
  122. new Rect(m_Position.x + 1f, m_Position.y + 1f, m_Position.width - 2f, m_Position.height - 2f),
  123. new GUIContent(AssetBundleModel.Model.GetEmptyMessage()),
  124. style);
  125. }
  126. else
  127. {
  128. //Left half
  129. var bundleTreeRect = new Rect(
  130. m_Position.x,
  131. m_Position.y,
  132. m_HorizontalSplitterRect.x,
  133. m_VerticalSplitterRectLeft.y - m_Position.y);
  134. m_BundleTree.OnGUI(bundleTreeRect);
  135. m_DetailsList.OnGUI(new Rect(
  136. bundleTreeRect.x,
  137. bundleTreeRect.y + bundleTreeRect.height + k_SplitterWidth,
  138. bundleTreeRect.width,
  139. m_Position.height - bundleTreeRect.height - k_SplitterWidth*2));
  140. //Right half.
  141. float panelLeft = m_HorizontalSplitterRect.x + k_SplitterWidth;
  142. float panelWidth = m_VerticalSplitterRectRight.width - k_SplitterWidth * 2;
  143. float searchHeight = 20f;
  144. float panelTop = m_Position.y + searchHeight;
  145. float panelHeight = m_VerticalSplitterRectRight.y - panelTop;
  146. OnGUISearchBar(new Rect(panelLeft, m_Position.y, panelWidth, searchHeight));
  147. m_AssetList.OnGUI(new Rect(
  148. panelLeft,
  149. panelTop,
  150. panelWidth,
  151. panelHeight));
  152. m_MessageList.OnGUI(new Rect(
  153. panelLeft,
  154. panelTop + panelHeight + k_SplitterWidth,
  155. panelWidth,
  156. (m_Position.height - panelHeight) - k_SplitterWidth * 2));
  157. if (m_ResizingHorizontalSplitter || m_ResizingVerticalSplitterRight || m_ResizingVerticalSplitterLeft)
  158. m_Parent.Repaint();
  159. }
  160. }
  161. void OnGUISearchBar(Rect rect)
  162. {
  163. m_BundleTree.searchString = m_searchField.OnGUI(rect, m_BundleTree.searchString);
  164. m_AssetList.searchString = m_BundleTree.searchString;
  165. }
  166. public bool hasSearch
  167. {
  168. get { return m_BundleTree.hasSearch; }
  169. }
  170. private void HandleHorizontalResize()
  171. {
  172. m_HorizontalSplitterRect.x = (int)(m_Position.width * m_HorizontalSplitterPercent);
  173. m_HorizontalSplitterRect.height = m_Position.height;
  174. EditorGUIUtility.AddCursorRect(m_HorizontalSplitterRect, MouseCursor.ResizeHorizontal);
  175. if (Event.current.type == EventType.MouseDown && m_HorizontalSplitterRect.Contains(Event.current.mousePosition))
  176. m_ResizingHorizontalSplitter = true;
  177. if (m_ResizingHorizontalSplitter)
  178. {
  179. m_HorizontalSplitterPercent = Mathf.Clamp(Event.current.mousePosition.x / m_Position.width, 0.1f, 0.9f);
  180. m_HorizontalSplitterRect.x = (int)(m_Position.width * m_HorizontalSplitterPercent);
  181. }
  182. if (Event.current.type == EventType.MouseUp)
  183. m_ResizingHorizontalSplitter = false;
  184. }
  185. private void HandleVerticalResize()
  186. {
  187. m_VerticalSplitterRectRight.x = m_HorizontalSplitterRect.x;
  188. m_VerticalSplitterRectRight.y = (int)(m_HorizontalSplitterRect.height * m_VerticalSplitterPercentRight);
  189. m_VerticalSplitterRectRight.width = m_Position.width - m_HorizontalSplitterRect.x;
  190. m_VerticalSplitterRectLeft.y = (int)(m_HorizontalSplitterRect.height * m_VerticalSplitterPercentLeft);
  191. m_VerticalSplitterRectLeft.width = m_VerticalSplitterRectRight.width;
  192. EditorGUIUtility.AddCursorRect(m_VerticalSplitterRectRight, MouseCursor.ResizeVertical);
  193. if (Event.current.type == EventType.MouseDown && m_VerticalSplitterRectRight.Contains(Event.current.mousePosition))
  194. m_ResizingVerticalSplitterRight = true;
  195. EditorGUIUtility.AddCursorRect(m_VerticalSplitterRectLeft, MouseCursor.ResizeVertical);
  196. if (Event.current.type == EventType.MouseDown && m_VerticalSplitterRectLeft.Contains(Event.current.mousePosition))
  197. m_ResizingVerticalSplitterLeft = true;
  198. if (m_ResizingVerticalSplitterRight)
  199. {
  200. m_VerticalSplitterPercentRight = Mathf.Clamp(Event.current.mousePosition.y / m_HorizontalSplitterRect.height, 0.2f, 0.98f);
  201. m_VerticalSplitterRectRight.y = (int)(m_HorizontalSplitterRect.height * m_VerticalSplitterPercentRight);
  202. }
  203. else if (m_ResizingVerticalSplitterLeft)
  204. {
  205. m_VerticalSplitterPercentLeft = Mathf.Clamp(Event.current.mousePosition.y / m_HorizontalSplitterRect.height, 0.25f, 0.98f);
  206. m_VerticalSplitterRectLeft.y = (int)(m_HorizontalSplitterRect.height * m_VerticalSplitterPercentLeft);
  207. }
  208. if (Event.current.type == EventType.MouseUp)
  209. {
  210. m_ResizingVerticalSplitterRight = false;
  211. m_ResizingVerticalSplitterLeft = false;
  212. }
  213. }
  214. internal void UpdateSelectedBundles(IEnumerable<AssetBundleModel.BundleInfo> bundles)
  215. {
  216. AssetBundleModel.Model.AddBundlesToUpdate(bundles);
  217. m_AssetList.SetSelectedBundles(bundles);
  218. m_DetailsList.SetItems(bundles);
  219. m_MessageList.SetItems(null);
  220. }
  221. internal void SetSelectedItems(IEnumerable<AssetBundleModel.AssetInfo> items)
  222. {
  223. m_MessageList.SetItems(items);
  224. }
  225. }
  226. }