From 2c4f341098e9d3a76aed05049e018543771c21a6 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Sun, 24 Oct 2021 19:23:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Treemap=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/Component/Main/Serie.cs | 26 +++++++++++++++++ Runtime/Component/Sub/SerieData.cs | 41 +++++++++++++++++++++++++++ Runtime/Component/Theme/ChartTheme.cs | 13 +++++++++ Runtime/Helper/SerieHelper.cs | 2 ++ Runtime/Internal/BaseChart.cs | 17 +++++++---- Runtime/Internal/Object/ChartText.cs | 31 +++++++++++++++++++- Runtime/XUGL/UGL.cs | 34 ++++++++++++++++++++++ 7 files changed, 158 insertions(+), 6 deletions(-) diff --git a/Runtime/Component/Main/Serie.cs b/Runtime/Component/Main/Serie.cs index 6af6b219..c22fe8e3 100644 --- a/Runtime/Component/Main/Serie.cs +++ b/Runtime/Component/Main/Serie.cs @@ -1188,6 +1188,7 @@ namespace XCharts public float runtimeY { get; internal set; } public float runtimeWidth { get; internal set; } public float runtimeHeight { get; internal set; } + public Rect runtimeRect { get; internal set; } public List runtimeSortedData { get { return m_SortedData; } } public bool nameDirty { get { return m_NameDirty; } } @@ -1645,6 +1646,31 @@ namespace XCharts return null; } + public SerieData GetSerieData(string uuid, DataZoom dataZoom = null) + { + var data = GetDataList(dataZoom); + foreach (var serieData in data) + { + var target = GetSerieData(serieData, uuid); + if (target != null) return target; + } + return null; + } + + public SerieData GetSerieData(SerieData parent, string uuid) + { + if (uuid.Equals(parent.uuid)) return parent; + foreach (var child in parent.children) + { + var data = GetSerieData(child, uuid); + if (data != null) + { + return data; + } + } + return null; + } + /// /// 获得指定索引的维度X和维度Y的数据 /// diff --git a/Runtime/Component/Sub/SerieData.cs b/Runtime/Component/Sub/SerieData.cs index 90f6c1c7..57b022fa 100644 --- a/Runtime/Component/Sub/SerieData.cs +++ b/Runtime/Component/Sub/SerieData.cs @@ -19,6 +19,7 @@ namespace XCharts public class SerieData : SubComponent { [SerializeField] private string m_Name; + [SerializeField] private string m_Uuid; [SerializeField] private bool m_Selected; [SerializeField] private bool m_Ignore = false; [SerializeField] private float m_Radius; @@ -33,6 +34,7 @@ namespace XCharts [SerializeField] private bool m_EnableSymbol = false; [SerializeField] private SerieSymbol m_Symbol = new SerieSymbol(); [SerializeField] private List m_Data = new List(); + [SerializeField] private List m_Children = new List(); public ChartLabel labelObject { get; set; } @@ -46,6 +48,10 @@ namespace XCharts /// public string name { get { return m_Name; } set { m_Name = value; } } /// + /// 数据项的唯一id。唯一id不是必须设置的。 + /// + public string uuid { get { return m_Uuid; } set { m_Uuid = value; } } + /// /// 数据项图例名称。当数据项名称不为空时,图例名称即为系列名称;反之则为索引index。 /// /// @@ -113,6 +119,7 @@ namespace XCharts /// 可指定任意维数的数值列表。 /// public List data { get { return m_Data; } set { m_Data = value; } } + public List children { get { return m_Children; } set { m_Children = value; } } /// /// [default:true] Whether the data item is showed. /// 该数据项是否要显示。 @@ -174,6 +181,11 @@ namespace XCharts /// 绘制区域。 /// public Rect runtimeRect { get; set; } + public Rect runtimeSubRect { get; set; } + public int runtimeLevel { get; set; } + public SerieData runtimeParent { get; set; } + public Color32 runtimeColor { get; set; } + public double runtimeArea { get; set; } public float runtimeAngle { get; set; } public Vector3 runtiemPieOffsetCenter { get; set; } public float runtimeStackHig { get; set; } @@ -208,6 +220,25 @@ namespace XCharts m_Emphasis.Reset(); } + public SerieData AddChildData(double value, string name = null) + { + var serieData = new SerieData(); + serieData.name = name; + serieData.data = new List() { children.Count, value }; + serieData.runtimeParent = this; + children.Add(serieData); + return serieData; + } + public SerieData AddChildData(List value, string name = null) + { + var serieData = new SerieData(); + serieData.name = name; + serieData.data = new List(value); + serieData.runtimeParent = this; + children.Add(serieData); + return serieData; + } + public double GetData(int index, bool inverse = false) { if (index >= 0 && index < m_Data.Count) @@ -350,6 +381,16 @@ namespace XCharts return false; } + public bool UpdateData(int dimension, double value) + { + if (dimension >= 0 && dimension < data.Count) + { + data[dimension] = value; + return true; + } + return false; + } + private void CheckLastData() { if (m_PreviousData.Count != m_Data.Count) diff --git a/Runtime/Component/Theme/ChartTheme.cs b/Runtime/Component/Theme/ChartTheme.cs index 809451d9..5f838a2a 100644 --- a/Runtime/Component/Theme/ChartTheme.cs +++ b/Runtime/Component/Theme/ChartTheme.cs @@ -227,6 +227,19 @@ namespace XCharts else return Color.clear; } + public void SetColorPalette(List colorList) + { + m_ColorPalette = colorList; + SetVerticesDirty(); + } + public void SetColorPalette(List hexColorStringList) + { + m_ColorPalette.Clear(); + foreach (var hexColor in hexColorStringList) + m_ColorPalette.Add(ColorUtil.GetColor(hexColor)); + SetVerticesDirty(); + } + public void CheckWarning(StringBuilder sb) { #if dUI_TextMeshPro diff --git a/Runtime/Helper/SerieHelper.cs b/Runtime/Helper/SerieHelper.cs index 77b5b8f9..68b55962 100644 --- a/Runtime/Helper/SerieHelper.cs +++ b/Runtime/Helper/SerieHelper.cs @@ -235,6 +235,7 @@ namespace XCharts serie.runtimeHeight = chartHeight - runtimeTop - runtimeBottom; serie.runtimeCenterPos = new Vector3(serie.runtimeX + serie.runtimeWidth / 2, serie.runtimeY + serie.runtimeHeight / 2); + serie.runtimeRect = new Rect(serie.runtimeX, serie.runtimeY, serie.runtimeWidth, serie.runtimeHeight); } else { @@ -243,6 +244,7 @@ namespace XCharts serie.runtimeWidth = chartWidth; serie.runtimeHeight = chartHeight; serie.runtimeCenterPos = chartPosition + new Vector3(chartWidth / 2, chartHeight / 2); + serie.runtimeRect = new Rect(serie.runtimeX, serie.runtimeY, serie.runtimeWidth, serie.runtimeHeight); } } diff --git a/Runtime/Internal/BaseChart.cs b/Runtime/Internal/BaseChart.cs index 83d02c76..5b223e1f 100644 --- a/Runtime/Internal/BaseChart.cs +++ b/Runtime/Internal/BaseChart.cs @@ -453,7 +453,7 @@ namespace XCharts var active = IsActiveByLegend(datas[i]); var bgColor = LegendHelper.GetIconColor(this, readIndex, datas[i], active); var item = LegendHelper.AddLegendItem(legend, i, datas[i], legendObject.transform, m_Theme, - legendName, bgColor, active,readIndex); + legendName, bgColor, active, readIndex); legend.SetButton(legendName, item, totalLegend); ChartHelper.ClearEventListener(item.button.gameObject); ChartHelper.AddEventListener(item.button.gameObject, EventTriggerType.PointerDown, (data) => @@ -529,16 +529,17 @@ namespace XCharts for (int j = 0; j < serie.data.Count; j++) { var serieData = serie.data[j]; - serieData.index = j; + serieData.index = count; serieData.labelObject = null; - AddSerieLabel(serie, serieData, count); + AddSerieLabel(serie, serieData, ref count); count++; } } SerieLabelHelper.UpdateLabelText(m_Series, m_Theme, m_LegendRealShowName); } - protected void AddSerieLabel(Serie serie, SerieData serieData, int count = -1) + + protected void AddSerieLabel(Serie serie, SerieData serieData, ref int count) { if (m_SerieLabelRoot == null) return; if (count == -1) count = serie.dataCount; @@ -546,7 +547,7 @@ namespace XCharts var iconStyle = SerieHelper.GetIconStyle(serie, serieData); if (serie.IsPerformanceMode()) return; if (!serieLabel.show && !iconStyle.show) return; - if(serie.animation.enable && serie.animation.HasFadeOut()) return; + if (serie.animation.enable && serie.animation.HasFadeOut()) return; var textName = ChartCached.GetSerieLabelName(s_SerieLabelObjectName, serie.index, serieData.index); var color = Color.grey; if (serie.type == SerieType.Pie) @@ -568,6 +569,12 @@ namespace XCharts item.SetIcon(iconImage); item.SetIconActive(iconStyle.show); serieData.labelObject = item; + + foreach (var data in serieData.children) + { + AddSerieLabel(serie, data, ref count); + count++; + } } private void InitSerieTitle() diff --git a/Runtime/Internal/Object/ChartText.cs b/Runtime/Internal/Object/ChartText.cs index 2e2edf67..ab813aa8 100644 --- a/Runtime/Internal/Object/ChartText.cs +++ b/Runtime/Internal/Object/ChartText.cs @@ -246,7 +246,12 @@ namespace XCharts #if dUI_TextMeshPro if (m_TMPText != null) return 0; // TODO: #else - if (m_Text != null) return m_Text.cachedTextGenerator.GetPreferredWidth(content, m_RelatedTextSettings); + if (m_Text != null) + { + var tg = m_Text.cachedTextGeneratorForLayout; + var setting = m_Text.GetGenerationSettings(Vector2.zero); + return tg.GetPreferredWidth(content, setting) / m_Text.pixelsPerUnit; + } #endif return 0; } @@ -270,6 +275,30 @@ namespace XCharts return 0; } + public string GetPreferredText(string content, string suffix, float maxWidth) + { +#if dUI_TextMeshPro + if (m_TMPText != null) return content; // TODO: +#else + if (m_Text != null) + { + var sourWid = GetPreferredWidth(content); + if (sourWid < maxWidth) return content; + var suffixWid = GetPreferredWidth(suffix); + var textWid = maxWidth - 1.3f * suffixWid; + for (int i = content.Length; i > 0; i--) + { + var temp = content.Substring(0, i); + if (GetPreferredWidth(temp) < textWid) + { + return temp + suffix; + } + } + } +#endif + return string.Empty; + } + #if dUI_TextMeshPro public void SetFont(TMP_FontAsset font) diff --git a/Runtime/XUGL/UGL.cs b/Runtime/XUGL/UGL.cs index 492d1e84..30a02ed9 100644 --- a/Runtime/XUGL/UGL.cs +++ b/Runtime/XUGL/UGL.cs @@ -456,6 +456,20 @@ namespace XUGL DrawQuadrilateral(vh, p1, p2, p3, p4, color, toColor); } + public static void DrawRectangle(VertexHelper vh, Rect rect, Color32 color) + { + DrawRectangle(vh, rect, 0, color); + } + public static void DrawRectangle(VertexHelper vh, Rect rect, float border, Color32 color) + { + DrawRectangle(vh, rect, border, color, color); + } + + public static void DrawRectangle(VertexHelper vh, Rect rect, float border, Color32 color, Color32 toColor) + { + DrawRectangle(vh, rect.center, rect.width / 2 - border, rect.height / 2 - border, color, toColor, true); + } + /// /// Draw a quadrilateral. 画任意的四边形 /// @@ -859,6 +873,26 @@ namespace XUGL cornerRadius, horizontal, smoothness, invertCorner); } + /// + /// 绘制(圆角)边框 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static void DrawBorder(VertexHelper vh, Rect rect, + float borderWidth, Color32 color, float rotate = 0, float[] cornerRadius = null, + bool horizontal = false, float smoothness = 1f, bool invertCorner = false) + { + DrawBorder(vh, rect.center, rect.width, rect.height, borderWidth, color, s_ClearColor32, rotate, + cornerRadius, horizontal, smoothness, invertCorner); + } + /// /// 绘制(圆角)边框 ///