Без опису
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. using System.Collections.Generic;
  2. using System.Text;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using XUGL;
  6. namespace XCharts.Runtime
  7. {
  8. public class TooltipViewItem
  9. {
  10. public GameObject gameObject;
  11. public List<ChartLabel> columns = new List<ChartLabel>();
  12. }
  13. public class TooltipView
  14. {
  15. private static Vector2 anchorMax = new Vector2(0, 1);
  16. private static Vector2 anchorMin = new Vector2(0, 1);
  17. private static Vector2 pivot = new Vector2(0, 1);
  18. private static Vector2 v2_0_05 = new Vector2(0, 0.5f);
  19. public Tooltip tooltip;
  20. public ComponentTheme theme;
  21. public GameObject gameObject;
  22. public Transform transform;
  23. public Image background;
  24. public Outline border;
  25. public VerticalLayoutGroup layout;
  26. public ChartLabel title;
  27. private List<TooltipViewItem> m_Items = new List<TooltipViewItem>();
  28. private List<float> m_ColumnMaxWidth = new List<float>();
  29. private bool m_Active = false;
  30. private Vector3 m_TargetPos;
  31. private Vector3 m_CurrentVelocity;
  32. public void Update()
  33. {
  34. if (!m_Active)
  35. return;
  36. transform.localPosition = Vector3.SmoothDamp(transform.localPosition, m_TargetPos, ref m_CurrentVelocity, 0.08f);
  37. }
  38. public Vector3 GetCurrentPos()
  39. {
  40. return transform.localPosition;
  41. }
  42. public Vector3 GetTargetPos()
  43. {
  44. return m_TargetPos;
  45. }
  46. public void UpdatePosition(Vector3 pos)
  47. {
  48. m_TargetPos = pos;
  49. }
  50. public void SetActive(bool flag)
  51. {
  52. m_Active = flag && tooltip.showContent;
  53. ChartHelper.SetActive(gameObject, m_Active);
  54. if (!flag)
  55. {
  56. foreach (var item in m_Items)
  57. item.gameObject.SetActive(false);
  58. }
  59. }
  60. public void Refresh()
  61. {
  62. if (tooltip == null) return;
  63. var data = tooltip.context.data;
  64. var ignoreColumn = string.IsNullOrEmpty(tooltip.ignoreDataDefaultContent);
  65. var titleActive = !string.IsNullOrEmpty(data.title);
  66. if (titleActive != title.gameObject.activeSelf)
  67. title.gameObject.SetActive(titleActive);
  68. title.SetText(data.title);
  69. m_ColumnMaxWidth.Clear();
  70. for (int i = 0; i < data.param.Count; i++)
  71. {
  72. var item = GetItem(i);
  73. var param = data.param[i];
  74. if (param.columns.Count <= 0 || (ignoreColumn && param.ignore))
  75. {
  76. item.gameObject.SetActive(false);
  77. continue;
  78. }
  79. item.gameObject.SetActive(true);
  80. for (int j = 0; j < param.columns.Count; j++)
  81. {
  82. var column = GetItemColumn(item, j);
  83. column.SetActive(true);
  84. column.SetText(param.columns[j]);
  85. if (j == 0)
  86. column.text.SetColor(param.color);
  87. if (j >= m_ColumnMaxWidth.Count)
  88. m_ColumnMaxWidth.Add(0);
  89. var columnWidth = column.GetWidth();
  90. if (m_ColumnMaxWidth[j] < columnWidth)
  91. m_ColumnMaxWidth[j] = columnWidth;
  92. }
  93. for (int j = param.columns.Count; j < item.columns.Count; j++)
  94. {
  95. item.columns[j].SetActive(false);
  96. }
  97. }
  98. for (int i = data.param.Count; i < m_Items.Count; i++)
  99. {
  100. m_Items[i].gameObject.SetActive(false);
  101. }
  102. ResetSize();
  103. UpdatePosition(tooltip.context.pointer + tooltip.offset);
  104. tooltip.gameObject.transform.SetAsLastSibling();
  105. }
  106. private void ResetSize()
  107. {
  108. var maxHig = 0f;
  109. var maxWid = 0f;
  110. if (tooltip.fixedWidth > 0)
  111. {
  112. maxWid = tooltip.fixedWidth;
  113. }
  114. else
  115. {
  116. maxWid = TotalMaxWidth();
  117. var titleWid = title.GetTextWidth();
  118. if (maxWid < titleWid)
  119. maxWid = titleWid;
  120. }
  121. if (tooltip.fixedHeight > 0)
  122. {
  123. maxHig = tooltip.fixedHeight;
  124. }
  125. else
  126. {
  127. if (!string.IsNullOrEmpty(title.text.GetText()))
  128. maxHig += tooltip.titleHeight;
  129. maxHig += tooltip.itemHeight * tooltip.context.data.param.Count;
  130. maxHig += tooltip.paddingTopBottom * 2;
  131. }
  132. if (tooltip.minWidth > 0 && maxWid < tooltip.minWidth)
  133. maxWid = tooltip.minWidth;
  134. if (tooltip.minHeight > 0 && maxHig < tooltip.minHeight)
  135. maxHig = tooltip.minHeight;
  136. for (int i = 0; i < m_Items.Count; i++)
  137. {
  138. var item = m_Items[i];
  139. item.gameObject.GetComponent<RectTransform>().sizeDelta = new Vector2(maxWid, tooltip.itemHeight);
  140. var xPos = 0f;
  141. for (int j = 0; j < m_ColumnMaxWidth.Count; j++)
  142. {
  143. var deltaX = j == m_ColumnMaxWidth.Count - 1 ? maxWid - xPos : m_ColumnMaxWidth[j];
  144. item.columns[j].text.SetSizeDelta(new Vector2(deltaX, tooltip.itemHeight));
  145. item.columns[j].SetRectPosition(new Vector3(xPos, 0));
  146. xPos += m_ColumnMaxWidth[j];
  147. }
  148. }
  149. tooltip.context.width = maxWid + tooltip.paddingLeftRight * 2;
  150. tooltip.context.height = maxHig;
  151. background.GetComponent<RectTransform>().sizeDelta = new Vector2(tooltip.context.width, tooltip.context.height);
  152. }
  153. private float TotalMaxWidth()
  154. {
  155. var total = 0f;
  156. foreach (var max in m_ColumnMaxWidth)
  157. total += max;
  158. return total;
  159. }
  160. private TooltipViewItem GetItem(int i)
  161. {
  162. if (i < 0) i = 0;
  163. if (i < m_Items.Count)
  164. {
  165. return m_Items[i];
  166. }
  167. else
  168. {
  169. var item = CreateViewItem(i, gameObject.transform, tooltip, theme);
  170. m_Items.Add(item);
  171. return item;
  172. }
  173. }
  174. private ChartLabel GetItemColumn(TooltipViewItem item, int i)
  175. {
  176. if (i < 0) i = 0;
  177. if (i < item.columns.Count)
  178. {
  179. return item.columns[i];
  180. }
  181. else
  182. {
  183. var column = CreateViewItemColumn(i, item.gameObject.transform, tooltip, theme);
  184. item.columns.Add(column);
  185. return column;
  186. }
  187. }
  188. public static TooltipView CreateView(Tooltip tooltip, ThemeStyle theme, Transform parent)
  189. {
  190. var view = new TooltipView();
  191. view.tooltip = tooltip;
  192. view.theme = theme.tooltip;
  193. view.gameObject = ChartHelper.AddObject("view", parent, anchorMin, anchorMax, pivot, Vector3.zero);
  194. view.gameObject.transform.localPosition = Vector3.zero;
  195. view.transform = view.gameObject.transform;
  196. view.background = ChartHelper.GetOrAddComponent<Image>(view.gameObject);
  197. view.background.sprite = tooltip.backgroundImage;
  198. view.background.type = tooltip.backgroundType;
  199. view.background.color = ChartHelper.IsClearColor(tooltip.backgroundColor) ?
  200. Color.white : tooltip.backgroundColor;
  201. view.border = ChartHelper.GetOrAddComponent<Outline>(view.gameObject);
  202. view.border.enabled = tooltip.borderWidth > 0;
  203. view.border.useGraphicAlpha = false;
  204. view.border.effectColor = tooltip.borderColor;
  205. view.border.effectDistance = new Vector2(tooltip.borderWidth, -tooltip.borderWidth);
  206. view.layout = ChartHelper.GetOrAddComponent<VerticalLayoutGroup>(view.gameObject);
  207. view.layout.childControlHeight = false;
  208. view.layout.childControlWidth = false;
  209. view.layout.childForceExpandHeight = false;
  210. view.layout.childForceExpandWidth = false;
  211. view.layout.padding = new RectOffset(tooltip.paddingLeftRight,
  212. tooltip.paddingLeftRight,
  213. tooltip.paddingTopBottom,
  214. tooltip.paddingTopBottom);
  215. view.title = ChartHelper.AddChartLabel("title", view.gameObject.transform, tooltip.titleLabelStyle, theme.tooltip,
  216. "", Color.clear, TextAnchor.MiddleLeft);
  217. var item = CreateViewItem(0, view.gameObject.transform, tooltip, theme.tooltip);
  218. view.m_Items.Add(item);
  219. view.Refresh();
  220. return view;
  221. }
  222. private static TooltipViewItem CreateViewItem(int i, Transform parent, Tooltip tooltip, ComponentTheme theme)
  223. {
  224. GameObject item1 = ChartHelper.AddObject("item" + i, parent, anchorMin, anchorMax, v2_0_05, Vector3.zero);
  225. var item = new TooltipViewItem();
  226. item.gameObject = item1;
  227. item.columns.Add(CreateViewItemColumn(0, item1.transform, tooltip, theme));
  228. item.columns.Add(CreateViewItemColumn(1, item1.transform, tooltip, theme));
  229. item.columns.Add(CreateViewItemColumn(2, item1.transform, tooltip, theme));
  230. return item;
  231. }
  232. private static ChartLabel CreateViewItemColumn(int i, Transform parent, Tooltip tooltip, ComponentTheme theme)
  233. {
  234. var labelStyle = tooltip.GetContentLabelStyle(i);
  235. var label = ChartHelper.AddChartLabel("column" + i, parent, labelStyle, theme,
  236. "", Color.clear, TextAnchor.MiddleLeft);
  237. return label;
  238. }
  239. }
  240. }