优化和重构Theme,解决引用相同或丢失的问题 #118

This commit is contained in:
monitor1394
2021-03-31 21:17:29 +08:00
parent e23f8b4a96
commit d6caeb585e
15 changed files with 681 additions and 578 deletions

View File

@@ -32,6 +32,7 @@
## Latest ## Latest
* (2021.03.31) Optimized and refactor `Theme` to solve problems with the same or missing references #118
* (2021.03.30) Optimized `Tooltip` to support setting different category axis data #129 * (2021.03.30) Optimized `Tooltip` to support setting different category axis data #129
* (2021.03.29) Optimized the custom draw callback API * (2021.03.29) Optimized the custom draw callback API
* (2021.03.25) Added `Ganttchart` * (2021.03.25) Added `Ganttchart`

View File

@@ -32,6 +32,7 @@
## Latest ## Latest
* (2021.03.31) 优化和重构`Theme`,解决引用相同或丢失的问题 #118
* (2021.03.30) 优化`Tooltip`支持设置不同的类目轴数据 #129 * (2021.03.30) 优化`Tooltip`支持设置不同的类目轴数据 #129
* (2021.03.29) 优化自定义绘制回调接口,增加`onCustomDrawBeforeSerie``onCustomDrawAfterSerie``onCustomDrawTop` * (2021.03.29) 优化自定义绘制回调接口,增加`onCustomDrawBeforeSerie``onCustomDrawAfterSerie``onCustomDrawTop`
* (2021.03.25) 增加`GanttChart`甘特图 * (2021.03.25) 增加`GanttChart`甘特图

View File

@@ -21,89 +21,62 @@ namespace XCharts
public override string ClassName { get { return "Theme"; } } public override string ClassName { get { return "Theme"; } }
public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label) public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label)
{ {
if (prop.objectReferenceValue == null)
{
EditorGUI.ObjectField(pos, prop, new GUIContent("Theme"));
return;
}
base.OnGUI(pos, prop, label); base.OnGUI(pos, prop, label);
var defaultWidth = pos.width; var defaultWidth = pos.width;
var defaultX = pos.x; var defaultX = pos.x;
var btnWidth = 50; var btnWidth = 50;
ChartEditorHelper.MakeFoldout(ref m_DrawRect, ref m_ThemeModuleToggle, "Theme"); if (MakeFoldout(prop, ""))
m_Heights[m_KeyName] += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
if (m_ThemeModuleToggle)
{ {
m_DrawRect.x = defaultX + defaultWidth - 3 * btnWidth - 2; var btnRect = new Rect(m_DrawRect);
m_DrawRect.width = btnWidth; btnRect.x = defaultX + defaultWidth - 2 * btnWidth - 2;
btnRect.y = m_DrawRect.y - EditorGUIUtility.singleLineHeight - 3;
btnRect.width = btnWidth;
var chart = prop.serializedObject.targetObject as BaseChart; var chart = prop.serializedObject.targetObject as BaseChart;
var lastFont = chart.theme.font; var lastFont = chart.theme.font;
#if dUI_TextMeshPro #if dUI_TextMeshPro
var lastTMPFont = chart.theme.tmpFont; var lastTMPFont = chart.theme.tmpFont;
#endif #endif
if (GUI.Button(m_DrawRect, new GUIContent("Reset", "Reset to theme default color"))) if (GUI.Button(btnRect, new GUIContent("Reset", "Reset to theme default color")))
{ {
chart.theme.ResetTheme(); chart.theme.ResetTheme();
chart.RefreshAllComponent(); chart.RefreshAllComponent();
} }
m_DrawRect.x = defaultX + defaultWidth - 2 * btnWidth - 2; btnRect.x = defaultX + defaultWidth - btnWidth;
m_DrawRect.width = btnWidth; btnRect.width = btnWidth;
if (GUI.Button(m_DrawRect, new GUIContent("Unbind", "Unbind the Theme from another chart"))) if (GUI.Button(btnRect, new GUIContent("Export", "Export theme to asset for a new theme")))
{
chart.UnbindTheme();
}
m_DrawRect.x = defaultX + defaultWidth - btnWidth;
m_DrawRect.width = btnWidth;
if (GUI.Button(m_DrawRect, new GUIContent("Export", "Export theme to asset for a new theme")))
{ {
ExportThemeWindow.target = chart; ExportThemeWindow.target = chart;
EditorWindow.GetWindow(typeof(ExportThemeWindow)); EditorWindow.GetWindow(typeof(ExportThemeWindow));
} }
var data = (ScriptableObject)prop.objectReferenceValue;
SerializedObject serializedObject = new SerializedObject(data);
SerializedProperty newProp = serializedObject.GetIterator();
float y = pos.y + EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
++EditorGUI.indentLevel; ++EditorGUI.indentLevel;
var chartNameList = XThemeMgr.GetAllThemeNames();
var chartNameList = XChartsMgr.GetAllThemeNames();
var lastIndex = chartNameList.IndexOf(chart.theme.themeName); var lastIndex = chartNameList.IndexOf(chart.theme.themeName);
var y = pos.y + EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
var selectedIndex = EditorGUI.Popup(new Rect(pos.x, y, pos.width, EditorGUIUtility.singleLineHeight), var selectedIndex = EditorGUI.Popup(new Rect(pos.x, y, pos.width, EditorGUIUtility.singleLineHeight),
"Theme", lastIndex, chartNameList.ToArray()); "Theme", lastIndex, chartNameList.ToArray());
m_Heights[m_KeyName] += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; AddSingleLineHeight();
y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
if (lastIndex != selectedIndex) if (lastIndex != selectedIndex)
{ {
GUI.changed = true; XThemeMgr.SwitchTheme(chart, chartNameList[selectedIndex]);
XChartsMgr.SwitchTheme(chart, chartNameList[selectedIndex]);
} }
if (newProp.NextVisible(true)) PropertyField(prop, "m_Font");
{ PropertyField(prop, "m_ContrastColor");
do PropertyField(prop, "m_BackgroundColor");
{ PropertyField(prop, "m_ColorPalette");
if (newProp.name == "m_Script") continue; PropertyField(prop, "m_Common");
if (newProp.name == "m_ThemeName") continue; PropertyField(prop, "m_Title");
if (newProp.name == "m_Theme") continue; PropertyField(prop, "m_SubTitle");
PropertyField(prop, "m_Legend");
AddPropertyField(pos, newProp, ref y); PropertyField(prop, "m_Axis");
PropertyField(prop, "m_RadiusAxis");
} while (newProp.NextVisible(false)); PropertyField(prop, "m_AngleAxis");
} PropertyField(prop, "m_Polar");
if (GUI.changed) PropertyField(prop, "m_Gauge");
{ PropertyField(prop, "m_Radar");
chart.RefreshAllComponent(); PropertyField(prop, "m_Tooltip");
serializedObject.ApplyModifiedProperties(); PropertyField(prop, "m_DataZoom");
} PropertyField(prop, "m_VisualMap");
if (chart.theme.font != lastFont) PropertyField(prop, "m_Serie");
{
chart.theme.SyncFontToSubComponent();
}
#if dUI_TextMeshPro
if (chart.theme.tmpFont != lastTMPFont)
{
chart.theme.SyncTMPFontToSubComponent();
}
#endif
--EditorGUI.indentLevel; --EditorGUI.indentLevel;
} }
} }
@@ -154,7 +127,7 @@ namespace XCharts
} }
else else
{ {
GUILayout.Label(XChartsMgr.GetThemeAssetPath(m_ChartName)); GUILayout.Label(XThemeMgr.GetThemeAssetPath(m_ChartName));
} }
GUILayout.Space(20); GUILayout.Space(20);
@@ -164,20 +137,20 @@ namespace XCharts
{ {
ShowNotification(new GUIContent("ERROR:Need input a new name!")); ShowNotification(new GUIContent("ERROR:Need input a new name!"));
} }
else if (XChartsMgr.ContainsTheme(m_ChartName)) else if (XThemeMgr.ContainsTheme(m_ChartName))
{ {
ShowNotification(new GUIContent("ERROR:The name you entered is already in use!")); ShowNotification(new GUIContent("ERROR:The name you entered is already in use!"));
} }
else if (IsAssetsExist(XChartsMgr.GetThemeAssetPath(m_ChartName))) else if (IsAssetsExist(XThemeMgr.GetThemeAssetPath(m_ChartName)))
{ {
ShowNotification(new GUIContent("ERROR:The asset is exist! \npath=" ShowNotification(new GUIContent("ERROR:The asset is exist! \npath="
+ XChartsMgr.GetThemeAssetPath(m_ChartName))); + XThemeMgr.GetThemeAssetPath(m_ChartName)));
} }
else else
{ {
XChartsMgr.ExportTheme(target.theme, m_ChartName); XThemeMgr.ExportTheme(target.theme, m_ChartName);
ShowNotification(new GUIContent("SUCCESS:The theme is exported. \npath=" ShowNotification(new GUIContent("SUCCESS:The theme is exported. \npath="
+ XChartsMgr.GetThemeAssetPath(m_ChartName))); + XThemeMgr.GetThemeAssetPath(m_ChartName)));
} }
} }
} }

View File

@@ -1,10 +1,11 @@
using UnityEngine; using UnityEngine;
using UnityEditor; using UnityEditor;
using System.Collections.Generic; using System.Collections.Generic;
using XCharts;
public class ChartEditorHelper namespace XCharts
{ {
public class ChartEditorHelper
{
#if UNITY_2019_3_OR_NEWER #if UNITY_2019_3_OR_NEWER
public const float INDENT_WIDTH = 15; public const float INDENT_WIDTH = 15;
public const float BOOL_WIDTH = 15; public const float BOOL_WIDTH = 15;
@@ -485,4 +486,5 @@ public class ChartEditorHelper
var relativeProp = parentProp.FindPropertyRelative(relativeName); var relativeProp = parentProp.FindPropertyRelative(relativeName);
return PropertyFieldWithMaxValue(ref drawRect, heights, key, relativeProp, maxValue); return PropertyFieldWithMaxValue(ref drawRect, heights, key, relativeProp, maxValue);
} }
}
} }

View File

@@ -0,0 +1,60 @@
using UnityEditor;
using UnityEngine;
namespace XCharts
{
internal static class ThemeCheck
{
public class ThemeAssetPostprocessor : AssetPostprocessor
{
static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets,
string[] movedFromAssetsPaths)
{
foreach (var assetPath in importedAssets)
{
CheckAddedAsset(assetPath);
}
foreach (var assetPath in deletedAssets)
{
CheckDeletedAsset(assetPath);
}
}
}
public static void CheckAddedAsset(string assetPath)
{
if (!IsThemeAsset(assetPath)) return;
var obj = AssetDatabase.LoadAssetAtPath<TextAsset>(assetPath);
if (XChartsSettings.AddJsonTheme(obj))
{
XThemeMgr.ReloadThemeList();
}
}
public static void CheckDeletedAsset(string assetPath)
{
if (!IsThemeAsset(assetPath)) return;
var themes = XChartsSettings.customThemes;
var changed = false;
for (int i = themes.Count - 1; i >= 0; i--)
{
if (themes[i] == null)
{
themes.RemoveAt(i);
changed = true;
}
}
if (changed)
{
XThemeMgr.ReloadThemeList();
}
}
private static bool IsThemeAsset(string assetPath)
{
if (!assetPath.EndsWith(".json")) return false;
return true;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4b4ba2a9503ae46b1b7b1ae94ec59127
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -156,7 +156,7 @@ namespace XCharts
[MenuItem("XCharts/Themes Reload")] [MenuItem("XCharts/Themes Reload")]
public static void ReloadTheme() public static void ReloadTheme()
{ {
XChartsMgr.Instance.LoadThemesFromResources(); XThemeMgr.ReloadThemeList();
} }
[MenuItem("XCharts/TextMeshPro Enable")] [MenuItem("XCharts/TextMeshPro Enable")]

View File

@@ -37,6 +37,7 @@ MonoBehaviour:
m_SerieLineSymbolSelectedSize: 8 m_SerieLineSymbolSelectedSize: 8
m_SerieScatterSymbolSize: 20 m_SerieScatterSymbolSize: 20
m_SerieScatterSymbolSelectedSize: 30 m_SerieScatterSymbolSelectedSize: 30
m_SerieCandlestickBorderWidth: 1
m_EditorBlockEnable: 1 m_EditorBlockEnable: 1
m_EditorShowAllListData: 0 m_EditorShowAllListData: 0
m_MaxPainter: 10 m_MaxPainter: 10
@@ -47,3 +48,5 @@ MonoBehaviour:
m_VisualMapTriangeLen: 20 m_VisualMapTriangeLen: 20
m_PieTooltipExtraRadius: 8 m_PieTooltipExtraRadius: 8
m_PieSelectedOffset: 8 m_PieSelectedOffset: 8
m_CustomTheme:
- {fileID: 4900000, guid: b3fe66aee71324452a87542f8be66943, type: 3}

View File

@@ -719,12 +719,5 @@ namespace XCharts
{ {
return SeriesHelper.ContainsSerie(m_Series, serieType); return SeriesHelper.ContainsSerie(m_Series, serieType);
} }
public void UnbindTheme()
{
var theme = m_Theme.CloneTheme();
m_Theme = theme;
RefreshChart();
}
} }
} }

View File

@@ -43,7 +43,7 @@ namespace XCharts
/// Theme. /// Theme.
/// 主题相关配置。 /// 主题相关配置。
/// </summary> /// </summary>
public class ChartTheme : ScriptableObject public class ChartTheme : MainComponent
{ {
[SerializeField] private Theme m_Theme = Theme.Default; [SerializeField] private Theme m_Theme = Theme.Default;
[SerializeField] private string m_ThemeName = Theme.Default.ToString(); [SerializeField] private string m_ThemeName = Theme.Default.ToString();
@@ -164,12 +164,6 @@ namespace XCharts
} }
} }
[NonSerialized] protected bool m_VertsDirty;
[NonSerialized] protected bool m_ComponentDirty;
public virtual bool vertsDirty { get { return m_VertsDirty; } }
public virtual bool componentDirty { get { return m_ComponentDirty; } }
public bool anyDirty { get { return vertsDirty || componentDirty; } }
public void SetDefaultFont() public void SetDefaultFont()
{ {
#if dUI_TextMeshPro #if dUI_TextMeshPro
@@ -301,6 +295,13 @@ namespace XCharts
case Theme.Default: CopyTheme(Default); break; case Theme.Default: CopyTheme(Default); break;
case Theme.Light: CopyTheme(Light); break; case Theme.Light: CopyTheme(Light); break;
case Theme.Dark: CopyTheme(Dark); break; case Theme.Dark: CopyTheme(Dark); break;
case Theme.Custom:
var sour = XThemeMgr.GetTheme(themeName);
if (sour != null)
{
CopyTheme(sour);
}
break;
} }
} }
@@ -310,7 +311,7 @@ namespace XCharts
/// <returns></returns> /// <returns></returns>
public ChartTheme CloneTheme() public ChartTheme CloneTheme()
{ {
var theme = ScriptableObject.CreateInstance<ChartTheme>(); var theme = new ChartTheme();
InitChartComponentTheme(theme); InitChartComponentTheme(theme);
theme.CopyTheme(this); theme.CopyTheme(this);
return theme; return theme;
@@ -326,7 +327,7 @@ namespace XCharts
{ {
get get
{ {
var theme = ScriptableObject.CreateInstance<ChartTheme>(); var theme = new ChartTheme();
theme.theme = Theme.Default; theme.theme = Theme.Default;
theme.themeName = Theme.Default.ToString(); theme.themeName = Theme.Default.ToString();
theme.contrastColor = ColorUtil.GetColor("#514D4D"); theme.contrastColor = ColorUtil.GetColor("#514D4D");
@@ -359,7 +360,7 @@ namespace XCharts
{ {
get get
{ {
var theme = ScriptableObject.CreateInstance<ChartTheme>(); var theme = new ChartTheme();
theme.theme = Theme.Light; theme.theme = Theme.Light;
theme.themeName = Theme.Light.ToString(); theme.themeName = Theme.Light.ToString();
theme.contrastColor = ColorUtil.GetColor("#514D4D"); theme.contrastColor = ColorUtil.GetColor("#514D4D");
@@ -394,8 +395,7 @@ namespace XCharts
{ {
get get
{ {
var theme = ScriptableObject.CreateInstance<ChartTheme>(); var theme = new ChartTheme();
theme.name = Theme.Dark.ToString();
theme.theme = Theme.Dark; theme.theme = Theme.Dark;
theme.themeName = Theme.Dark.ToString(); theme.themeName = Theme.Dark.ToString();
theme.contrastColor = ColorUtil.GetColor("#B9B8CE"); theme.contrastColor = ColorUtil.GetColor("#B9B8CE");
@@ -421,8 +421,7 @@ namespace XCharts
{ {
get get
{ {
var theme = ScriptableObject.CreateInstance<ChartTheme>(); var theme = new ChartTheme();
theme.name = Theme.Custom.ToString();
theme.theme = Theme.Custom; theme.theme = Theme.Custom;
theme.themeName = Theme.Custom.ToString(); theme.themeName = Theme.Custom.ToString();
theme.contrastColor = Color.clear; theme.contrastColor = Color.clear;

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e7557fe74f6754d88a35691b4949434b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,117 @@
using System.Collections.Generic;
using System.IO;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace XCharts
{
public static class XThemeMgr
{
/// <summary>
/// 重新加载主题列表
/// </summary>
public static void ReloadThemeList()
{
//Debug.Log("LoadThemesFromResources");
XChartsMgr.Instance.m_ThemeDict.Clear();
XChartsMgr.Instance.m_ThemeNames.Clear();
AddTheme(ChartTheme.Default);
AddTheme(ChartTheme.Light);
AddTheme(ChartTheme.Dark);
foreach (var json in XChartsSettings.customThemes)
{
if (json != null)
{
var theme = JsonUtility.FromJson<ChartTheme>(json.text);
AddTheme(theme);
}
}
//Debug.Log("LoadThemesFromResources DONE: theme count=" + m_ThemeDict.Keys.Count);
}
public static void AddTheme(ChartTheme theme)
{
if (!XChartsMgr.Instance.m_ThemeDict.ContainsKey(theme.themeName))
{
XChartsMgr.Instance.m_ThemeDict.Add(theme.themeName, theme);
XChartsMgr.Instance.m_ThemeNames.Add(theme.themeName);
}
else
{
Debug.LogError("Theme name is exist:" + theme.themeName);
}
}
public static ChartTheme GetTheme(string themeName)
{
if (!XChartsMgr.Instance.m_ThemeDict.ContainsKey(themeName))
{
return null;
}
return XChartsMgr.Instance.m_ThemeDict[themeName];
}
public static List<string> GetAllThemeNames()
{
return XChartsMgr.Instance.m_ThemeNames;
}
public static bool ContainsTheme(string themeName)
{
return XChartsMgr.Instance.m_ThemeNames.Contains(themeName);
}
public static void SwitchTheme(BaseChart chart, string themeName)
{
Debug.Log("SwitchTheme:" + themeName);
#if UNITY_EDITOR
if (XChartsMgr.Instance.m_ThemeDict.Count == 0)
{
ReloadThemeList();
}
#endif
if (!XChartsMgr.Instance.m_ThemeDict.ContainsKey(themeName))
{
Debug.LogError("SwitchTheme ERROR: not exist theme:" + themeName);
return;
}
var target = XChartsMgr.Instance.m_ThemeDict[themeName];
chart.theme.CopyTheme(target);
chart.RefreshAllComponent();
}
public static bool ExportTheme(ChartTheme theme, string themeNewName)
{
#if UNITY_EDITOR
var newtheme = ChartTheme.EmptyTheme;
newtheme.CopyTheme(theme);
newtheme.theme = Theme.Custom;
newtheme.themeName = themeNewName;
var themeFileName = "XTheme-" + newtheme.themeName;
var assetPath = string.Format("Assets/XCharts/Resources/{0}", themeFileName);
var filePath = string.Format("{0}/../{1}.json", Application.dataPath, assetPath);
var json = JsonUtility.ToJson(newtheme, true);
File.WriteAllText(filePath, json);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
var obj = Resources.Load<TextAsset>(themeFileName);
XChartsSettings.AddJsonTheme(obj);
ReloadThemeList();
return true;
#else
return false;
#endif
}
public static string GetThemeAssetPath(string themeName)
{
return string.Format("Assets/XCharts/Resources/XTheme-{0}.json", themeName);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 89e200a5f63734b22820185d375f6f27
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -46,9 +46,8 @@ namespace XCharts
[SerializeField] private string m_NowVersion; [SerializeField] private string m_NowVersion;
[SerializeField] private string m_NewVersion; [SerializeField] private string m_NewVersion;
[SerializeField] private List<BaseChart> m_ChartList = new List<BaseChart>(); [SerializeField] private List<BaseChart> m_ChartList = new List<BaseChart>();
[SerializeField] private Dictionary<string, ChartTheme> m_ThemeDict = new Dictionary<string, ChartTheme>(); [SerializeField] internal Dictionary<string, ChartTheme> m_ThemeDict = new Dictionary<string, ChartTheme>();
[SerializeField] internal List<string> m_ThemeNames = new List<string>();
private List<string> m_ThemeNames = new List<string>();
private static XChartsMgr m_XCharts; private static XChartsMgr m_XCharts;
public static XChartsMgr Instance public static XChartsMgr Instance
@@ -87,8 +86,7 @@ namespace XCharts
{ {
SerieLabelPool.ClearAll(); SerieLabelPool.ClearAll();
m_ChartList.Clear(); m_ChartList.Clear();
m_ThemeDict.Clear(); XThemeMgr.ReloadThemeList();
LoadThemesFromResources();
} }
public string changeLog { get; private set; } public string changeLog { get; private set; }
@@ -270,34 +268,6 @@ namespace XCharts
SerieLabelPool.ClearAll(); SerieLabelPool.ClearAll();
} }
public void LoadThemesFromResources()
{
//Debug.Log("LoadThemesFromResources");
m_ThemeDict.Clear();
AddTheme(ChartTheme.Default);
AddTheme(ChartTheme.Light);
AddTheme(ChartTheme.Dark);
var list = Resources.LoadAll<ChartTheme>("");
foreach (var theme in list)
{
AddTheme(theme);
}
//Debug.Log("LoadThemesFromResources DONE: theme count=" + m_ThemeDict.Keys.Count);
}
private void AddTheme(ChartTheme theme)
{
if (!m_ThemeDict.ContainsKey(theme.themeName))
{
m_ThemeDict.Add(theme.themeName, theme);
m_ThemeNames.Add(theme.themeName);
}
else
{
Debug.LogError("Theme name is exist:" + theme.themeName);
}
}
public void AddChart(BaseChart chart) public void AddChart(BaseChart chart)
{ {
var sameNameChart = GetChart(chart.chartName); var sameNameChart = GetChart(chart.chartName);
@@ -341,66 +311,6 @@ namespace XCharts
return m_ChartList.Contains(chart); return m_ChartList.Contains(chart);
} }
public static List<string> GetAllThemeNames()
{
return Instance.m_ThemeNames;
}
public static bool ContainsTheme(string themeName)
{
return Instance.m_ThemeNames.Contains(themeName);
}
public static void SwitchTheme(BaseChart chart, string themeName)
{
Debug.Log("SwitchTheme:" + themeName);
if (chart.theme.themeName.Equals(themeName))
{
return;
}
#if UNITY_EDITOR
if (Instance.m_ThemeDict.Count == 0)
{
Instance.LoadThemesFromResources();
}
#endif
if (!Instance.m_ThemeDict.ContainsKey(themeName))
{
Debug.LogError("SwitchTheme ERROR: not exist theme:" + themeName);
return;
}
var target = Instance.m_ThemeDict[themeName];
chart.theme.CopyTheme(target);
chart.RefreshAllComponent();
}
public static string GetThemeAssetPath(string themeName)
{
return string.Format("Assets/XCharts/Resources/XChartsTheme-{0}.asset", themeName);
}
public static bool ExportTheme(ChartTheme theme, string themeNewName)
{
#if UNITY_EDITOR
var newtheme = ChartTheme.EmptyTheme;
newtheme.CopyTheme(theme);
newtheme.name = themeNewName;
newtheme.themeName = themeNewName;
var themeFileName = "XChartsTheme-" + newtheme.themeName;
var assetPath = string.Format("Assets/XCharts/Resources/{0}.asset", themeFileName);
if (Resources.Load<XChartsSettings>(themeFileName))
{
AssetDatabase.DeleteAsset(assetPath);
}
AssetDatabase.CreateAsset(newtheme, assetPath);
Instance.AddTheme(newtheme);
return true;
#else
return false;
#endif
}
public static void RemoveAllChartObject() public static void RemoveAllChartObject()
{ {
if (Instance.m_ChartList.Count == 0) if (Instance.m_ChartList.Count == 0)

View File

@@ -7,6 +7,7 @@
using UnityEngine; using UnityEngine;
using System; using System;
using System.Collections.Generic;
#if dUI_TextMeshPro #if dUI_TextMeshPro
using TMPro; using TMPro;
#endif #endif
@@ -63,6 +64,7 @@ namespace XCharts
[SerializeField] [Range(10, 50)] protected float m_VisualMapTriangeLen = 20f; [SerializeField] [Range(10, 50)] protected float m_VisualMapTriangeLen = 20f;
[SerializeField] [Range(1, 20)] protected float m_PieTooltipExtraRadius = 8f; [SerializeField] [Range(1, 20)] protected float m_PieTooltipExtraRadius = 8f;
[SerializeField] [Range(1, 20)] protected float m_PieSelectedOffset = 8f; [SerializeField] [Range(1, 20)] protected float m_PieSelectedOffset = 8f;
[SerializeField] protected List<TextAsset> m_CustomThemes = new List<TextAsset>();
public static Font font { get { return Instance.m_Font; } } public static Font font { get { return Instance.m_Font; } }
#if dUI_TextMeshPro #if dUI_TextMeshPro
@@ -117,6 +119,7 @@ namespace XCharts
public static float pieSelectedOffset { get { return Instance.m_PieSelectedOffset; } } public static float pieSelectedOffset { get { return Instance.m_PieSelectedOffset; } }
#endregion #endregion
public static List<TextAsset> customThemes { get { return Instance.m_CustomThemes; } }
private static XChartsSettings s_Instance; private static XChartsSettings s_Instance;
public static XChartsSettings Instance public static XChartsSettings Instance
@@ -146,5 +149,16 @@ namespace XCharts
return s_Instance; return s_Instance;
} }
} }
public static bool AddJsonTheme(TextAsset theme)
{
if (theme == null) return false;
if (!Instance.m_CustomThemes.Contains(theme))
{
Instance.m_CustomThemes.Add(theme);
return true;
}
return false;
}
} }
} }