diff --git a/Runtime/Internal/Basic/BaseSerie.cs b/Runtime/Internal/Basic/BaseSerie.cs index 19a5ae9d..57c992a3 100644 --- a/Runtime/Internal/Basic/BaseSerie.cs +++ b/Runtime/Internal/Basic/BaseSerie.cs @@ -13,6 +13,7 @@ namespace XCharts.Runtime public virtual bool useDataNameForColor { get { return false; } } public virtual bool titleJustForSerie { get { return false; } } public virtual bool useSortData { get { return false; } } + public virtual bool multiDimensionLabel { get { return false; } } public bool anyDirty { get { return vertsDirty || componentDirty; } } public Painter painter { get { return m_Painter; } set { m_Painter = value; } } public Action refreshComponent { get; set; } diff --git a/Runtime/Internal/XCResourcesImporter.cs b/Runtime/Internal/XCResourcesImporter.cs index 09eea015..f8f252d0 100644 --- a/Runtime/Internal/XCResourcesImporter.cs +++ b/Runtime/Internal/XCResourcesImporter.cs @@ -14,8 +14,7 @@ namespace XCharts.Runtime public XCResourcesImporter() { } - public void OnDestroy() - { } + public void OnDestroy() { } public void OnGUI() { @@ -38,7 +37,7 @@ namespace XCharts.Runtime { var sourPath = Path.Combine(packageFullPath, "Resources"); var destPath = Path.Combine(Application.dataPath, "XCharts/Resources"); - if (RuntimeUtil.CopyFolder(sourPath, destPath)) + if (CopyFolder(sourPath, destPath)) { AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); @@ -54,6 +53,37 @@ namespace XCharts.Runtime GUILayout.Space(5f); } + private static bool CopyFolder(string sourPath, string destPath) + { + try + { + if (!Directory.Exists(destPath)) + { + Directory.CreateDirectory(destPath); + } + var files = Directory.GetFiles(sourPath); + foreach (var file in files) + { + var name = Path.GetFileName(file); + var path = Path.Combine(destPath, name); + File.Copy(file, path); + } + var folders = Directory.GetDirectories(sourPath); + foreach (var folder in folders) + { + var name = Path.GetFileName(folder); + var path = Path.Combine(destPath, name); + CopyFolder(folder, path); + } + return true; + } + catch (Exception e) + { + Debug.LogError("CopyFolder:" + e.Message); + return false; + } + } + internal void RegisterResourceImportCallback() { AssetDatabase.importPackageCompleted += ImportCallback; diff --git a/Runtime/Internal/XCSettings.cs b/Runtime/Internal/XCSettings.cs index 0597b931..d1617bcc 100644 --- a/Runtime/Internal/XCSettings.cs +++ b/Runtime/Internal/XCSettings.cs @@ -154,6 +154,7 @@ namespace XCharts.Runtime } } +#if UNITY_EDITOR public static bool ExistAssetFile() { return System.IO.File.Exists("Assets/XCharts/Resources/XCSettings.asset"); @@ -184,6 +185,7 @@ namespace XCharts.Runtime } return null; } +#endif public static bool AddCustomTheme(Theme theme) { diff --git a/Runtime/Internal/XChartsMgr.cs b/Runtime/Internal/XChartsMgr.cs index e97eee78..7cd7ad7b 100644 --- a/Runtime/Internal/XChartsMgr.cs +++ b/Runtime/Internal/XChartsMgr.cs @@ -126,6 +126,7 @@ namespace XCharts.Runtime } } +#if UNITY_EDITOR public static string GetPackageFullPath() { string packagePath = Path.GetFullPath("Packages/com.monitor1394.xcharts"); @@ -167,8 +168,6 @@ namespace XCharts.Runtime return null; } -#if UNITY_EDITOR - [UnityEditor.Callbacks.DidReloadScripts] static void OnEditorReload() { diff --git a/Runtime/Serie/Radar/Radar.cs b/Runtime/Serie/Radar/Radar.cs index 3691d924..8af45a95 100644 --- a/Runtime/Serie/Radar/Radar.cs +++ b/Runtime/Serie/Radar/Radar.cs @@ -14,6 +14,7 @@ namespace XCharts.Runtime public int containerIndex { get; internal set; } public int containterInstanceId { get; internal set; } public override bool useDataNameForColor { get { return true; } } + public override bool multiDimensionLabel { get { return radarType == RadarType.Multiple; } } public static Serie AddDefaultSerie(BaseChart chart, string serieName) { diff --git a/Runtime/Serie/SerieData.cs b/Runtime/Serie/SerieData.cs index 50ce21bc..7e815cc9 100644 --- a/Runtime/Serie/SerieData.cs +++ b/Runtime/Serie/SerieData.cs @@ -458,6 +458,14 @@ namespace XCharts.Runtime return temp; } + public double GetTotalData() + { + var total = 0d; + foreach (var value in m_Data) + total += value; + return total; + } + public bool UpdateData(int dimension, double value, bool updateAnimation, float animationDuration = 500f) { if (dimension >= 0 && dimension < data.Count) diff --git a/Runtime/Serie/SerieDataContext.cs b/Runtime/Serie/SerieDataContext.cs index 7f251297..d2bdf499 100644 --- a/Runtime/Serie/SerieDataContext.cs +++ b/Runtime/Serie/SerieDataContext.cs @@ -34,6 +34,7 @@ namespace XCharts.Runtime public float outsideRadius; public Vector3 position; public List dataPoints = new List(); + public List dataLabels = new List(); public List children = new List(); /// /// 绘制区域。 @@ -77,6 +78,7 @@ namespace XCharts.Runtime subRect = Rect.zero; children.Clear(); dataPoints.Clear(); + dataLabels.Clear(); } } } \ No newline at end of file diff --git a/Runtime/Serie/SerieHandler.cs b/Runtime/Serie/SerieHandler.cs index 084432df..1d8dfce9 100644 --- a/Runtime/Serie/SerieHandler.cs +++ b/Runtime/Serie/SerieHandler.cs @@ -249,11 +249,26 @@ namespace XCharts.Runtime return false; var dataAutoColor = GetSerieDataAutoColor(serieData); - var textName = ChartCached.GetSerieLabelName(s_SerieLabelObjectName, serie.index, serieData.index); - var label = ChartHelper.AddChartLabel(textName, serieLabelRoot.transform, serieLabel, chart.theme.common, - "", dataAutoColor, TextAnchor.MiddleCenter); - label.SetActive(serieLabel.show); - serieData.labelObject = label; + serieData.context.dataLabels.Clear(); + if (serie.multiDimensionLabel) + { + for (int i = 0; i < serieData.data.Count; i++) + { + var textName = string.Format("{0}_{1}_{2}_{3}", s_SerieLabelObjectName, serie.index, serieData.index, i); + var label = ChartHelper.AddChartLabel(textName, serieLabelRoot.transform, serieLabel, chart.theme.common, + "", dataAutoColor, TextAnchor.MiddleCenter); + label.SetActive(serieLabel.show); + serieData.context.dataLabels.Add(label); + } + } + else + { + var textName = ChartCached.GetSerieLabelName(s_SerieLabelObjectName, serie.index, serieData.index); + var label = ChartHelper.AddChartLabel(textName, serieLabelRoot.transform, serieLabel, chart.theme.common, + "", dataAutoColor, TextAnchor.MiddleCenter); + label.SetActive(serieLabel.show); + serieData.labelObject = label; + } if (serieData.context.children.Count > 0) { @@ -359,7 +374,7 @@ namespace XCharts.Runtime var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); foreach (var serieData in serie.data) { - if (serieData.labelObject == null) + if (serieData.labelObject == null && serieData.context.dataLabels.Count <= 0) continue; var serieLabel = SerieHelper.GetSerieLabel(serie, serieData); var emphasisLabel = SerieHelper.GetSerieEmphasisLabel(serie, serieData); @@ -372,27 +387,59 @@ namespace XCharts.Runtime serieData.context.canShowLabel && !isIgnore) { - var value = serieData.GetCurrData(defaultDimension, dataChangeDuration); - var total = serie.GetDataTotal(defaultDimension, serieData); - var color = chart.GetItemColor(serie, serieData); - var content = string.IsNullOrEmpty(currLabel.formatter) ? - ChartCached.NumberToStr(value, serieLabel.numericFormatter) : - SerieLabelHelper.GetFormatterContent(serie, serieData, value, total, - currLabel, color); - serieData.SetLabelActive(!isIgnore); - - serieData.labelObject.SetText(content); - UpdateLabelPosition(serieData, currLabel); - if (currLabel.textStyle.autoColor) + if (serie.multiDimensionLabel) { - var dataAutoColor = GetSerieDataAutoColor(serieData); - if (!ChartHelper.IsClearColor(dataAutoColor)) - serieData.labelObject.SetTextColor(dataAutoColor); + var total = serieData.GetTotalData(); + var color = chart.GetItemColor(serie, serieData); + for (int i = 0; i < serieData.context.dataLabels.Count; i++) + { + if (i >= serieData.context.dataPoints.Count) continue; + var labelObject = serieData.context.dataLabels[i]; + var value = serieData.GetCurrData(i, dataChangeDuration); + var content = string.IsNullOrEmpty(currLabel.formatter) ? + ChartCached.NumberToStr(value, serieLabel.numericFormatter) : + SerieLabelHelper.GetFormatterContent(serie, serieData, value, total, + currLabel, color); + var offset = GetSerieDataLabelOffset(serieData, currLabel); + labelObject.SetActive(!isIgnore); + labelObject.SetText(content); + labelObject.SetPosition(serieData.context.dataPoints[i] + offset); + if (currLabel.textStyle.autoColor) + { + var dataAutoColor = GetSerieDataAutoColor(serieData); + if (!ChartHelper.IsClearColor(dataAutoColor)) + labelObject.SetTextColor(dataAutoColor); + } + } + } + else + { + var value = serieData.GetCurrData(defaultDimension, dataChangeDuration); + var total = serie.GetDataTotal(defaultDimension, serieData); + var color = chart.GetItemColor(serie, serieData); + var content = string.IsNullOrEmpty(currLabel.formatter) ? + ChartCached.NumberToStr(value, serieLabel.numericFormatter) : + SerieLabelHelper.GetFormatterContent(serie, serieData, value, total, + currLabel, color); + serieData.SetLabelActive(!isIgnore); + + serieData.labelObject.SetText(content); + UpdateLabelPosition(serieData, currLabel); + if (currLabel.textStyle.autoColor) + { + var dataAutoColor = GetSerieDataAutoColor(serieData); + if (!ChartHelper.IsClearColor(dataAutoColor)) + serieData.labelObject.SetTextColor(dataAutoColor); + } } } else { serieData.SetLabelActive(false); + foreach (var labelObject in serieData.context.dataLabels) + { + labelObject.SetActive(false); + } } } } diff --git a/Runtime/Utilities/RuntimeUtil.cs b/Runtime/Utilities/RuntimeUtil.cs index 72cfa5fa..8bd0fe03 100644 --- a/Runtime/Utilities/RuntimeUtil.cs +++ b/Runtime/Utilities/RuntimeUtil.cs @@ -81,36 +81,7 @@ namespace XCharts.Runtime } } - public static bool CopyFolder(string sourPath, string destPath) - { - try - { - if (!Directory.Exists(destPath)) - { - Directory.CreateDirectory(destPath); - } - var files = Directory.GetFiles(sourPath); - foreach (var file in files) - { - var name = Path.GetFileName(file); - var path = Path.Combine(destPath, name); - File.Copy(file, path); - } - var folders = Directory.GetDirectories(sourPath); - foreach (var folder in folders) - { - var name = Path.GetFileName(folder); - var path = Path.Combine(destPath, name); - CopyFolder(folder, path); - } - return true; - } - catch (Exception e) - { - Debug.LogError("CopyFolder:" + e.Message); - return false; - } - } + } } \ No newline at end of file