123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- using System.Collections.Generic;
- using System.Text;
- using UnityEngine;
- using UnityEngine.UI;
- using XUGL;
-
- namespace XCharts.Runtime
- {
- public class TooltipViewItem
- {
- public GameObject gameObject;
- public List<ChartLabel> columns = new List<ChartLabel>();
- }
- public class TooltipView
- {
- private static Vector2 anchorMax = new Vector2(0, 1);
- private static Vector2 anchorMin = new Vector2(0, 1);
- private static Vector2 pivot = new Vector2(0, 1);
- private static Vector2 v2_0_05 = new Vector2(0, 0.5f);
-
- public Tooltip tooltip;
- public ComponentTheme theme;
- public GameObject gameObject;
- public Transform transform;
- public Image background;
- public Outline border;
- public VerticalLayoutGroup layout;
- public ChartLabel title;
- private List<TooltipViewItem> m_Items = new List<TooltipViewItem>();
- private List<float> m_ColumnMaxWidth = new List<float>();
- private bool m_Active = false;
- private Vector3 m_TargetPos;
- private Vector3 m_CurrentVelocity;
-
- public void Update()
- {
- if (!m_Active)
- return;
- transform.localPosition = Vector3.SmoothDamp(transform.localPosition, m_TargetPos, ref m_CurrentVelocity, 0.08f);
- }
-
- public Vector3 GetCurrentPos()
- {
- return transform.localPosition;
- }
-
- public Vector3 GetTargetPos()
- {
- return m_TargetPos;
- }
-
- public void UpdatePosition(Vector3 pos)
- {
- m_TargetPos = pos;
- }
-
- public void SetActive(bool flag)
- {
- m_Active = flag && tooltip.showContent;
- ChartHelper.SetActive(gameObject, m_Active);
- if (!flag)
- {
- foreach (var item in m_Items)
- item.gameObject.SetActive(false);
- }
- }
-
- public void Refresh()
- {
- if (tooltip == null) return;
- var data = tooltip.context.data;
- var ignoreColumn = string.IsNullOrEmpty(tooltip.ignoreDataDefaultContent);
-
- var titleActive = !string.IsNullOrEmpty(data.title);
- if (titleActive != title.gameObject.activeSelf)
- title.gameObject.SetActive(titleActive);
- title.SetText(data.title);
-
- m_ColumnMaxWidth.Clear();
- for (int i = 0; i < data.param.Count; i++)
- {
- var item = GetItem(i);
- var param = data.param[i];
- if (param.columns.Count <= 0 || (ignoreColumn && param.ignore))
- {
- item.gameObject.SetActive(false);
- continue;
- }
- item.gameObject.SetActive(true);
- for (int j = 0; j < param.columns.Count; j++)
- {
- var column = GetItemColumn(item, j);
- column.SetActive(true);
- column.SetText(param.columns[j]);
-
- if (j == 0)
- column.text.SetColor(param.color);
-
- if (j >= m_ColumnMaxWidth.Count)
- m_ColumnMaxWidth.Add(0);
-
- var columnWidth = column.GetWidth();
- if (m_ColumnMaxWidth[j] < columnWidth)
- m_ColumnMaxWidth[j] = columnWidth;
- }
- for (int j = param.columns.Count; j < item.columns.Count; j++)
- {
- item.columns[j].SetActive(false);
- }
- }
- for (int i = data.param.Count; i < m_Items.Count; i++)
- {
- m_Items[i].gameObject.SetActive(false);
- }
- ResetSize();
- UpdatePosition(tooltip.context.pointer + tooltip.offset);
- tooltip.gameObject.transform.SetAsLastSibling();
- }
-
- private void ResetSize()
- {
- var maxHig = 0f;
- var maxWid = 0f;
- if (tooltip.fixedWidth > 0)
- {
- maxWid = tooltip.fixedWidth;
- }
- else
- {
- maxWid = TotalMaxWidth();
- var titleWid = title.GetTextWidth();
- if (maxWid < titleWid)
- maxWid = titleWid;
- }
-
- if (tooltip.fixedHeight > 0)
- {
- maxHig = tooltip.fixedHeight;
- }
- else
- {
- if (!string.IsNullOrEmpty(title.text.GetText()))
- maxHig += tooltip.titleHeight;
- maxHig += tooltip.itemHeight * tooltip.context.data.param.Count;
- maxHig += tooltip.paddingTopBottom * 2;
- }
-
- if (tooltip.minWidth > 0 && maxWid < tooltip.minWidth)
- maxWid = tooltip.minWidth;
-
- if (tooltip.minHeight > 0 && maxHig < tooltip.minHeight)
- maxHig = tooltip.minHeight;
-
- for (int i = 0; i < m_Items.Count; i++)
- {
- var item = m_Items[i];
- item.gameObject.GetComponent<RectTransform>().sizeDelta = new Vector2(maxWid, tooltip.itemHeight);
- var xPos = 0f;
- for (int j = 0; j < m_ColumnMaxWidth.Count; j++)
- {
- var deltaX = j == m_ColumnMaxWidth.Count - 1 ? maxWid - xPos : m_ColumnMaxWidth[j];
- item.columns[j].text.SetSizeDelta(new Vector2(deltaX, tooltip.itemHeight));
- item.columns[j].SetRectPosition(new Vector3(xPos, 0));
- xPos += m_ColumnMaxWidth[j];
- }
- }
- tooltip.context.width = maxWid + tooltip.paddingLeftRight * 2;
- tooltip.context.height = maxHig;
- background.GetComponent<RectTransform>().sizeDelta = new Vector2(tooltip.context.width, tooltip.context.height);
- }
-
- private float TotalMaxWidth()
- {
- var total = 0f;
- foreach (var max in m_ColumnMaxWidth)
- total += max;
- return total;
- }
-
- private TooltipViewItem GetItem(int i)
- {
- if (i < 0) i = 0;
- if (i < m_Items.Count)
- {
- return m_Items[i];
- }
- else
- {
- var item = CreateViewItem(i, gameObject.transform, tooltip, theme);
- m_Items.Add(item);
- return item;
- }
- }
-
- private ChartLabel GetItemColumn(TooltipViewItem item, int i)
- {
- if (i < 0) i = 0;
- if (i < item.columns.Count)
- {
- return item.columns[i];
- }
- else
- {
- var column = CreateViewItemColumn(i, item.gameObject.transform, tooltip, theme);
- item.columns.Add(column);
- return column;
- }
- }
-
- public static TooltipView CreateView(Tooltip tooltip, ThemeStyle theme, Transform parent)
- {
- var view = new TooltipView();
- view.tooltip = tooltip;
- view.theme = theme.tooltip;
-
- view.gameObject = ChartHelper.AddObject("view", parent, anchorMin, anchorMax, pivot, Vector3.zero);
- view.gameObject.transform.localPosition = Vector3.zero;
- view.transform = view.gameObject.transform;
-
- view.background = ChartHelper.EnsureComponent<Image>(view.gameObject);
- view.background.sprite = tooltip.backgroundImage;
- view.background.type = tooltip.backgroundType;
- view.background.color = ChartHelper.IsClearColor(tooltip.backgroundColor) ?
- Color.white : tooltip.backgroundColor;
-
- view.border = ChartHelper.EnsureComponent<Outline>(view.gameObject);
- view.border.enabled = tooltip.borderWidth > 0;
- view.border.useGraphicAlpha = false;
- view.border.effectColor = tooltip.borderColor;
- view.border.effectDistance = new Vector2(tooltip.borderWidth, -tooltip.borderWidth);
-
- view.layout = ChartHelper.EnsureComponent<VerticalLayoutGroup>(view.gameObject);
- view.layout.childControlHeight = false;
- view.layout.childControlWidth = false;
- view.layout.childForceExpandHeight = false;
- view.layout.childForceExpandWidth = false;
- view.layout.padding = new RectOffset(tooltip.paddingLeftRight,
- tooltip.paddingLeftRight,
- tooltip.paddingTopBottom,
- tooltip.paddingTopBottom);
-
- view.title = ChartHelper.AddChartLabel("title", view.gameObject.transform, tooltip.titleLabelStyle, theme.tooltip,
- "", Color.clear, TextAnchor.MiddleLeft);
-
- var item = CreateViewItem(0, view.gameObject.transform, tooltip, theme.tooltip);
- view.m_Items.Add(item);
-
- view.Refresh();
-
- return view;
- }
-
- private static TooltipViewItem CreateViewItem(int i, Transform parent, Tooltip tooltip, ComponentTheme theme)
- {
- GameObject item1 = ChartHelper.AddObject("item" + i, parent, anchorMin, anchorMax, v2_0_05, Vector3.zero);
-
- var item = new TooltipViewItem();
- item.gameObject = item1;
- item.columns.Add(CreateViewItemColumn(0, item1.transform, tooltip, theme));
- item.columns.Add(CreateViewItemColumn(1, item1.transform, tooltip, theme));
- item.columns.Add(CreateViewItemColumn(2, item1.transform, tooltip, theme));
- return item;
- }
-
- private static ChartLabel CreateViewItemColumn(int i, Transform parent, Tooltip tooltip, ComponentTheme theme)
- {
- var labelStyle = tooltip.GetContentLabelStyle(i);
- var label = ChartHelper.AddChartLabel("column" + i, parent, labelStyle, theme,
- "", Color.clear, TextAnchor.MiddleLeft);
- return label;
- }
- }
- }
|