TreeViewControl.cs 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. public class TreeViewControl
  4. {
  5. /// <summary>
  6. /// Public properties
  7. /// </summary>
  8. public int X = 0;
  9. public int Y = 0;
  10. public int Width = 400;
  11. public int Height = 400;
  12. public bool IsExpanded = true;
  13. public bool IsHoverEnabled = true;
  14. public bool IsHoverAnimationEnabled = false;
  15. public bool DisplayOnGame = false;
  16. public bool DisplayOnScene = true;
  17. public bool DisplayInInspector = false;
  18. /// <summary>
  19. /// The root item
  20. /// </summary>
  21. public TreeViewItem m_roomItem = null;
  22. public TreeViewItem RootItem
  23. {
  24. get
  25. {
  26. if (null == m_roomItem)
  27. {
  28. m_roomItem = new TreeViewItem(this, null) { Header = "Root item" };
  29. }
  30. return m_roomItem;
  31. }
  32. }
  33. /// <summary>
  34. /// Accesses the root item header
  35. /// </summary>
  36. public string Header
  37. {
  38. get
  39. {
  40. return RootItem.Header;
  41. }
  42. set
  43. {
  44. RootItem.Header = value;
  45. }
  46. }
  47. /// <summary>
  48. /// Accesses the root data context
  49. /// </summary>
  50. public object DataContext
  51. {
  52. get
  53. {
  54. return RootItem.DataContext;
  55. }
  56. set
  57. {
  58. RootItem.DataContext = value;
  59. }
  60. }
  61. /// <summary>
  62. /// Accessor to the root items
  63. /// </summary>
  64. public List<TreeViewItem> Items
  65. {
  66. get
  67. {
  68. return RootItem.Items;
  69. }
  70. set
  71. {
  72. RootItem.Items = value;
  73. }
  74. }
  75. /// <summary>
  76. /// Skin used by the tree view
  77. /// </summary>
  78. public GUISkin m_skinHover = null;
  79. public GUISkin m_skinUnselected = null;
  80. public GUISkin m_skinSelected = null;
  81. /// <summary>
  82. /// Texture skin references
  83. /// </summary>
  84. public Texture2D m_textureBlank = null;
  85. public Texture2D m_textureGuide = null;
  86. public Texture2D m_textureLastSiblingCollapsed = null;
  87. public Texture2D m_textureLastSiblingExpanded = null;
  88. public Texture2D m_textureLastSiblingNoChild = null;
  89. public Texture2D m_textureMiddleSiblingCollapsed = null;
  90. public Texture2D m_textureMiddleSiblingExpanded = null;
  91. public Texture2D m_textureMiddleSiblingNoChild = null;
  92. public Texture2D m_textureNormalChecked = null;
  93. public Texture2D m_textureNormalUnchecked = null;
  94. public Texture2D m_textureSelectedBackground = null;
  95. /// <summary>
  96. /// Force to use the button text
  97. /// </summary>
  98. public bool m_forceButtonText = false;
  99. /// <summary>
  100. /// Use the default skin
  101. /// </summary>
  102. public bool m_forceDefaultSkin = false;
  103. /// <summary>
  104. /// The selected item
  105. /// </summary>
  106. public TreeViewItem HoverItem = null;
  107. public TreeViewItem SelectedItem = null;
  108. /// <summary>
  109. /// Show the button texture
  110. /// </summary>
  111. /// <param name="texture">
  112. /// A <see cref="Texture2D"/>
  113. /// </param>
  114. /// <returns>
  115. /// A <see cref="System.Boolean"/>
  116. /// </returns>
  117. bool ShowButtonTexture(Texture2D texture)
  118. {
  119. return GUILayout.Button(texture, GUILayout.MaxWidth(texture.width), GUILayout.MaxHeight(texture.height));
  120. }
  121. /// <summary>
  122. /// Find the button texture/text by enum
  123. /// </summary>
  124. /// <param name="item"></param>
  125. /// <param name="x"></param>
  126. /// <param name="y"></param>
  127. /// <param name="width"></param>
  128. /// <param name="height"></param>
  129. /// <returns></returns>
  130. public bool Button(TreeViewItem.TextureIcons item)
  131. {
  132. switch (item)
  133. {
  134. case TreeViewItem.TextureIcons.BLANK:
  135. if (null == m_textureGuide ||
  136. m_forceButtonText)
  137. {
  138. GUILayout.Label("", GUILayout.MaxWidth(4));
  139. }
  140. else
  141. {
  142. GUILayout.Label(m_textureBlank, GUILayout.MaxWidth(4), GUILayout.MaxHeight(16));
  143. }
  144. return false;
  145. case TreeViewItem.TextureIcons.GUIDE:
  146. if (null == m_textureGuide ||
  147. m_forceButtonText)
  148. {
  149. GUILayout.Label("|", GUILayout.MaxWidth(16));
  150. }
  151. else
  152. {
  153. GUILayout.Label(m_textureGuide, GUILayout.MaxWidth(16), GUILayout.MaxHeight(16));
  154. }
  155. return false;
  156. case TreeViewItem.TextureIcons.LAST_SIBLING_COLLAPSED:
  157. if (null == m_textureLastSiblingCollapsed ||
  158. m_forceButtonText)
  159. {
  160. return GUILayout.Button("<", GUILayout.MaxWidth(16));
  161. }
  162. else
  163. {
  164. return ShowButtonTexture(m_textureLastSiblingCollapsed);
  165. }
  166. case TreeViewItem.TextureIcons.LAST_SIBLING_EXPANDED:
  167. if (null == m_textureLastSiblingExpanded ||
  168. m_forceButtonText)
  169. {
  170. return GUILayout.Button(">", GUILayout.MaxWidth(16));
  171. }
  172. else
  173. {
  174. return ShowButtonTexture(m_textureLastSiblingExpanded);
  175. }
  176. case TreeViewItem.TextureIcons.LAST_SIBLING_NO_CHILD:
  177. if (null == m_textureLastSiblingNoChild ||
  178. m_forceButtonText)
  179. {
  180. return GUILayout.Button("-", GUILayout.MaxWidth(16));
  181. }
  182. else
  183. {
  184. return GUILayout.Button(m_textureLastSiblingNoChild, GUILayout.MaxWidth(16));
  185. }
  186. case TreeViewItem.TextureIcons.MIDDLE_SIBLING_COLLAPSED:
  187. if (null == m_textureMiddleSiblingCollapsed ||
  188. m_forceButtonText)
  189. {
  190. return GUILayout.Button("<", GUILayout.MaxWidth(16));
  191. }
  192. else
  193. {
  194. return ShowButtonTexture(m_textureMiddleSiblingCollapsed);
  195. }
  196. case TreeViewItem.TextureIcons.MIDDLE_SIBLING_EXPANDED:
  197. if (null == m_textureMiddleSiblingExpanded ||
  198. m_forceButtonText)
  199. {
  200. return GUILayout.Button(">", GUILayout.MaxWidth(16));
  201. }
  202. else
  203. {
  204. return GUILayout.Button(m_textureMiddleSiblingExpanded, GUILayout.MaxWidth(16));
  205. }
  206. case TreeViewItem.TextureIcons.MIDDLE_SIBLING_NO_CHILD:
  207. if (null == m_textureMiddleSiblingNoChild ||
  208. m_forceButtonText)
  209. {
  210. return GUILayout.Button("-", GUILayout.MaxWidth(16));
  211. }
  212. else
  213. {
  214. return ShowButtonTexture(m_textureMiddleSiblingNoChild);
  215. }
  216. case TreeViewItem.TextureIcons.NORMAL_CHECKED:
  217. if (null == m_textureNormalChecked ||
  218. m_forceButtonText)
  219. {
  220. return GUILayout.Button("x", GUILayout.MaxWidth(16));
  221. }
  222. else
  223. {
  224. return GUILayout.Button(m_textureNormalChecked, GUILayout.MaxWidth(16));
  225. }
  226. case TreeViewItem.TextureIcons.NORMAL_UNCHECKED:
  227. if (null == m_textureNormalUnchecked ||
  228. m_forceButtonText)
  229. {
  230. return GUILayout.Button("o", GUILayout.MaxWidth(16));
  231. }
  232. else
  233. {
  234. return ShowButtonTexture(m_textureNormalUnchecked);
  235. }
  236. default:
  237. return false;
  238. }
  239. }
  240. /// <summary>
  241. /// Handle the unity scrolling vector
  242. /// </summary>
  243. Vector2 m_scrollView = Vector2.zero;
  244. public enum DisplayTypes
  245. {
  246. NONE, //used by the inspector
  247. USE_SCROLL_VIEW, //used by panels
  248. USE_SCROLL_AREA, //used by gameview, sceneview
  249. }
  250. /// <summary>
  251. /// Called from OnGUI or EditorWindow.OnGUI
  252. /// </summary>
  253. public void DisplayTreeView(TreeViewControl.DisplayTypes displayType)
  254. {
  255. if (!m_forceDefaultSkin)
  256. {
  257. GUI.skin = m_skinUnselected;
  258. }
  259. switch (displayType)
  260. {
  261. case TreeViewControl.DisplayTypes.USE_SCROLL_VIEW:
  262. m_scrollView = GUILayout.BeginScrollView(m_scrollView, GUILayout.MaxWidth(Width), GUILayout.MaxHeight(Height));
  263. break;
  264. case TreeViewControl.DisplayTypes.USE_SCROLL_AREA:
  265. GUILayout.BeginArea(new Rect(X, Y, Width, Height));
  266. m_scrollView = GUILayout.BeginScrollView(m_scrollView, GUILayout.MaxWidth(Width), GUILayout.MaxHeight(Height));
  267. break;
  268. }
  269. RootItem.DisplayItem(0, TreeViewItem.SiblingOrder.FIRST_CHILD);
  270. switch (displayType)
  271. {
  272. case TreeViewControl.DisplayTypes.USE_SCROLL_VIEW:
  273. GUILayout.EndScrollView();
  274. break;
  275. case TreeViewControl.DisplayTypes.USE_SCROLL_AREA:
  276. GUILayout.EndScrollView();
  277. GUILayout.EndArea();
  278. break;
  279. }
  280. GUI.skin = null;
  281. }
  282. public bool HasFocus(Vector2 mousePos)
  283. {
  284. Rect rect = new Rect(m_scrollView.x, m_scrollView.y, Width, Height);
  285. return rect.Contains(mousePos);
  286. }
  287. void Start()
  288. {
  289. SelectedItem = null;
  290. }
  291. void OnGUI()
  292. {
  293. if (!DisplayOnGame)
  294. {
  295. return;
  296. }
  297. DisplayTreeView(TreeViewControl.DisplayTypes.USE_SCROLL_AREA);
  298. }
  299. }