| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 | 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);            ChartHelper.SetActive(title, titleActive);            title.SetText(data.title);            m_ColumnMaxWidth.Clear();            var contentLabelStyle0 = tooltip.GetContentLabelStyle(0);            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 && contentLabelStyle0 != null && ChartHelper.IsClearColor(contentLabelStyle0.textStyle.color))                        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);            view.title.gameObject.SetActive(true);            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;        }    }}
 |