HostingServicesProfileVarsTreeView.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEditor.IMGUI.Controls;
  4. using UnityEngine;
  5. namespace UnityEditor.AddressableAssets.GUI
  6. {
  7. class HostingServicesProfileVarsTreeView : TreeView
  8. {
  9. class ProfileVarItem : TreeViewItem
  10. {
  11. public string Key { get; private set; }
  12. public string Value { get; set; }
  13. public ProfileVarItem(string key, string value)
  14. {
  15. Key = key;
  16. Value = value;
  17. }
  18. }
  19. protected override void ContextClickedItem(int id)
  20. {
  21. var item = FindItem(id, rootItem) as ProfileVarItem;
  22. if (item == null) return;
  23. var menu = new GenericMenu();
  24. menu.AddItem(new GUIContent("Copy Key"), false, () => EditorGUIUtility.systemCopyBuffer = string.Format("[{0}]", item.Key));
  25. menu.AddItem(new GUIContent("Copy Value"), false, () => EditorGUIUtility.systemCopyBuffer = item.Value);
  26. menu.ShowAsContext();
  27. }
  28. public static MultiColumnHeader CreateHeader()
  29. {
  30. var columns = new[]
  31. {
  32. new MultiColumnHeaderState.Column
  33. {
  34. headerContent = new GUIContent("Variable Name"),
  35. headerTextAlignment = TextAlignment.Left,
  36. sortedAscending = true,
  37. sortingArrowAlignment = TextAlignment.Right,
  38. width = 180,
  39. minWidth = 60,
  40. autoResize = true
  41. },
  42. new MultiColumnHeaderState.Column
  43. {
  44. headerContent = new GUIContent("Value"),
  45. headerTextAlignment = TextAlignment.Left,
  46. sortedAscending = true,
  47. sortingArrowAlignment = TextAlignment.Right,
  48. width = 180,
  49. minWidth = 60,
  50. autoResize = true
  51. }
  52. };
  53. var header = new MultiColumnHeader(new MultiColumnHeaderState(columns))
  54. {
  55. height = 20f
  56. };
  57. return header;
  58. }
  59. readonly Dictionary<string, ProfileVarItem> m_ItemMap;
  60. internal int Count
  61. {
  62. get { return m_ItemMap.Count; }
  63. }
  64. public float RowHeight
  65. {
  66. get { return rowHeight; }
  67. }
  68. public HostingServicesProfileVarsTreeView(TreeViewState state, MultiColumnHeader multiColumnHeader) : base(state, multiColumnHeader)
  69. {
  70. showBorder = true;
  71. showAlternatingRowBackgrounds = true;
  72. m_ItemMap = new Dictionary<string, ProfileVarItem>();
  73. Reload();
  74. }
  75. public void ClearItems()
  76. {
  77. m_ItemMap.Clear();
  78. }
  79. public void AddOrUpdateItem(string key, string value)
  80. {
  81. if (m_ItemMap.ContainsKey(key))
  82. {
  83. if (m_ItemMap[key].Value == value)
  84. return;
  85. m_ItemMap[key].Value = value;
  86. Reload();
  87. return;
  88. }
  89. var item = new ProfileVarItem(key, value) { id = m_ItemMap.Count };
  90. m_ItemMap.Add(key, item);
  91. Reload();
  92. }
  93. protected override TreeViewItem BuildRoot()
  94. {
  95. var root = new TreeViewItem(-1, -1) { children = new List<TreeViewItem>() };
  96. foreach (var item in m_ItemMap.Values)
  97. root.AddChild(item);
  98. return root;
  99. }
  100. protected override void RowGUI(RowGUIArgs args)
  101. {
  102. for (var i = 0; i < args.GetNumVisibleColumns(); ++i)
  103. {
  104. CellGui(ref args, i);
  105. }
  106. }
  107. void CellGui(ref RowGUIArgs args, int i)
  108. {
  109. var cellRect = args.GetCellRect(i);
  110. CenterRectUsingSingleLineHeight(ref cellRect);
  111. var item = args.item as ProfileVarItem;
  112. if (item == null) return;
  113. switch (args.GetColumn(i))
  114. {
  115. case 0:
  116. EditorGUI.LabelField(cellRect, item.Key);
  117. break;
  118. case 1:
  119. EditorGUI.LabelField(cellRect, item.Value);
  120. break;
  121. }
  122. }
  123. protected override bool CanMultiSelect(TreeViewItem item)
  124. {
  125. return false;
  126. }
  127. }
  128. }