407 lines
13 KiB
C#
407 lines
13 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Text;
|
||
using UnityEngine;
|
||
#if dUI_TextMeshPro
|
||
using TMPro;
|
||
#endif
|
||
|
||
namespace XCharts.Runtime
|
||
{
|
||
/// <summary>
|
||
/// Theme.
|
||
/// |主题相关配置。
|
||
/// </summary>
|
||
[Serializable]
|
||
public class Theme : ScriptableObject
|
||
{
|
||
[SerializeField] private ThemeType m_ThemeType = ThemeType.Default;
|
||
[SerializeField] private string m_ThemeName = ThemeType.Default.ToString();
|
||
[SerializeField] private Font m_Font;
|
||
#if dUI_TextMeshPro
|
||
[SerializeField] private TMP_FontAsset m_TMPFont;
|
||
#endif
|
||
|
||
[SerializeField] private Color32 m_ContrastColor;
|
||
[SerializeField] private Color32 m_BackgroundColor;
|
||
|
||
#if UNITY_2020_2
|
||
[NonReorderable]
|
||
#endif
|
||
[SerializeField] private List<Color32> m_ColorPalette = new List<Color32>(13);
|
||
|
||
[SerializeField] private ComponentTheme m_Common;
|
||
[SerializeField] private TitleTheme m_Title;
|
||
[SerializeField] private SubTitleTheme m_SubTitle;
|
||
[SerializeField] private LegendTheme m_Legend;
|
||
[SerializeField] private AxisTheme m_Axis;
|
||
[SerializeField] private TooltipTheme m_Tooltip;
|
||
[SerializeField] private DataZoomTheme m_DataZoom;
|
||
[SerializeField] private VisualMapTheme m_VisualMap;
|
||
[SerializeField] private SerieTheme m_Serie;
|
||
|
||
/// <summary>
|
||
/// the theme of chart.
|
||
/// |主题类型。
|
||
/// </summary>
|
||
public ThemeType themeType
|
||
{
|
||
get { return m_ThemeType; }
|
||
set { PropertyUtil.SetStruct(ref m_ThemeType, value); }
|
||
}
|
||
/// <summary>
|
||
/// the name of theme.
|
||
/// |主题名称。
|
||
/// </summary>
|
||
public string themeName
|
||
{
|
||
get { return m_ThemeName; }
|
||
set { PropertyUtil.SetClass(ref m_ThemeName, value); }
|
||
}
|
||
|
||
/// <summary>
|
||
/// the contrast color of chart.
|
||
/// |对比色。
|
||
/// </summary>
|
||
public Color32 contrastColor
|
||
{
|
||
get { return m_ContrastColor; }
|
||
set { PropertyUtil.SetColor(ref m_ContrastColor, value); }
|
||
}
|
||
/// <summary>
|
||
/// the background color of chart.
|
||
/// |背景颜色。
|
||
/// </summary>
|
||
public Color32 backgroundColor
|
||
{
|
||
get { return m_BackgroundColor; }
|
||
set { PropertyUtil.SetColor(ref m_BackgroundColor, value); }
|
||
}
|
||
|
||
/// <summary>
|
||
/// The color list of palette. If no color is set in series, the colors would be adopted sequentially and circularly from this list as the colors of series.
|
||
/// |调色盘颜色列表。如果系列没有设置颜色,则会依次循环从该列表中取颜色作为系列颜色。
|
||
/// </summary>
|
||
public List<Color32> colorPalette { get { return m_ColorPalette; } set { m_ColorPalette = value; } }
|
||
public ComponentTheme common { get { return m_Common; } set { m_Common = value; } }
|
||
public TitleTheme title { get { return m_Title; } set { m_Title = value; } }
|
||
public SubTitleTheme subTitle { get { return m_SubTitle; } set { m_SubTitle = value; } }
|
||
public LegendTheme legend { get { return m_Legend; } set { m_Legend = value; } }
|
||
public AxisTheme axis { get { return m_Axis; } set { m_Axis = value; } }
|
||
public TooltipTheme tooltip { get { return m_Tooltip; } set { m_Tooltip = value; } }
|
||
public DataZoomTheme dataZoom { get { return m_DataZoom; } set { m_DataZoom = value; } }
|
||
public VisualMapTheme visualMap { get { return m_VisualMap; } set { m_VisualMap = value; } }
|
||
public SerieTheme serie { get { return m_Serie; } set { m_Serie = value; } }
|
||
#if dUI_TextMeshPro
|
||
/// <summary>
|
||
/// the font of chart text。
|
||
/// |主题字体。
|
||
/// </summary>
|
||
public TMP_FontAsset tmpFont
|
||
{
|
||
get { return m_TMPFont; }
|
||
set
|
||
{
|
||
m_TMPFont = value;
|
||
SyncTMPFontToSubComponent();
|
||
}
|
||
}
|
||
#endif
|
||
/// <summary>
|
||
/// the font of chart text。
|
||
/// |主题字体。
|
||
/// </summary>
|
||
public Font font
|
||
{
|
||
get { return m_Font; }
|
||
set
|
||
{
|
||
m_Font = value;
|
||
SyncFontToSubComponent();
|
||
}
|
||
}
|
||
|
||
// void OnEnable()
|
||
// {
|
||
// }
|
||
|
||
// void OnDisable()
|
||
// {
|
||
// }
|
||
|
||
public void SetDefaultFont()
|
||
{
|
||
#if dUI_TextMeshPro
|
||
tmpFont = XCSettings.tmpFont;
|
||
SyncTMPFontToSubComponent();
|
||
#else
|
||
font = XCSettings.font;
|
||
SyncFontToSubComponent();
|
||
#endif
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets the color of the specified index from the palette.
|
||
/// |获得调色盘对应系列索引的颜色值。
|
||
/// </summary>
|
||
/// <param name="index">编号索引</param>
|
||
/// <returns>the color,or Color.clear when failed.颜色值,失败时返回Color.clear</returns>
|
||
public Color32 GetColor(int index)
|
||
{
|
||
if (index < 0) index = 0;
|
||
var newIndex = index < m_ColorPalette.Count ? index : index % m_ColorPalette.Count;
|
||
if (newIndex < m_ColorPalette.Count)
|
||
return m_ColorPalette[newIndex];
|
||
else return Color.clear;
|
||
}
|
||
|
||
public void CheckWarning(StringBuilder sb)
|
||
{
|
||
#if dUI_TextMeshPro
|
||
if (m_TMPFont == null)
|
||
{
|
||
sb.AppendFormat("warning:theme->tmpFont is null\n");
|
||
}
|
||
#else
|
||
if (m_Font == null)
|
||
{
|
||
sb.AppendFormat("warning:theme->font is null\n");
|
||
}
|
||
#endif
|
||
if (m_ColorPalette.Count == 0)
|
||
{
|
||
sb.AppendFormat("warning:theme->colorPalette is empty\n");
|
||
}
|
||
for (int i = 0; i < m_ColorPalette.Count; i++)
|
||
{
|
||
if (!ChartHelper.IsClearColor(m_ColorPalette[i]) && m_ColorPalette[i].a == 0)
|
||
sb.AppendFormat("warning:theme->colorPalette[{0}] alpha = 0\n", i);
|
||
}
|
||
}
|
||
|
||
Dictionary<int, string> _colorDic = new Dictionary<int, string>();
|
||
/// <summary>
|
||
/// Gets the hexadecimal color string of the specified index from the palette.
|
||
/// |获得指定索引的十六进制颜色值字符串。
|
||
/// </summary>
|
||
/// <param name="index"></param>
|
||
/// <returns></returns>
|
||
public string GetColorStr(int index)
|
||
{
|
||
if (index < 0)
|
||
{
|
||
index = 0;
|
||
}
|
||
index = index % m_ColorPalette.Count;
|
||
if (_colorDic.ContainsKey(index)) return _colorDic[index];
|
||
else
|
||
{
|
||
_colorDic[index] = ColorUtility.ToHtmlStringRGBA(GetColor(index));
|
||
return _colorDic[index];
|
||
}
|
||
}
|
||
|
||
public bool CopyTheme(ThemeType theme)
|
||
{
|
||
switch (theme)
|
||
{
|
||
case ThemeType.Dark:
|
||
ResetToDarkTheme(this);
|
||
return true;
|
||
case ThemeType.Default:
|
||
ResetToDefaultTheme(this);
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// copy all configurations from theme.
|
||
/// |复制主题的所有配置。
|
||
/// </summary>
|
||
/// <param name="theme"></param>
|
||
public void CopyTheme(Theme theme)
|
||
{
|
||
m_ThemeType = theme.themeType;
|
||
m_ThemeName = theme.themeName;
|
||
#if dUI_TextMeshPro
|
||
tmpFont = theme.tmpFont;
|
||
#endif
|
||
font = theme.font;
|
||
m_BackgroundColor = theme.backgroundColor;
|
||
m_Common.Copy(theme.common);
|
||
m_Legend.Copy(theme.legend);
|
||
m_Title.Copy(theme.title);
|
||
m_SubTitle.Copy(theme.subTitle);
|
||
m_Axis.Copy(theme.axis);
|
||
m_Tooltip.Copy(theme.tooltip);
|
||
m_DataZoom.Copy(theme.dataZoom);
|
||
m_VisualMap.Copy(theme.visualMap);
|
||
m_Serie.Copy(theme.serie);
|
||
ChartHelper.CopyList(m_ColorPalette, theme.colorPalette);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Clear all custom configurations.
|
||
/// |重置,清除所有自定义配置。
|
||
/// </summary>
|
||
public bool ResetTheme()
|
||
{
|
||
switch (m_ThemeType)
|
||
{
|
||
case ThemeType.Default:
|
||
ResetToDefaultTheme(this);
|
||
return true;
|
||
case ThemeType.Dark:
|
||
ResetToDarkTheme(this);
|
||
return true;
|
||
case ThemeType.Custom:
|
||
return false;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 克隆主题。
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public Theme CloneTheme()
|
||
{
|
||
var theme = ScriptableObject.CreateInstance<Theme>();
|
||
InitChartComponentTheme(theme);
|
||
theme.CopyTheme(this);
|
||
return theme;
|
||
}
|
||
|
||
/// <summary>
|
||
/// default theme.
|
||
/// |默认主题。
|
||
/// </summary>
|
||
/// <value></value>
|
||
public static void ResetToDefaultTheme(Theme theme)
|
||
{
|
||
theme.themeType = ThemeType.Default;
|
||
theme.themeName = ThemeType.Default.ToString();
|
||
theme.backgroundColor = new Color32(255, 255, 255, 255);
|
||
theme.colorPalette = new List<Color32>
|
||
{
|
||
ColorUtil.GetColor("#5470c6"),
|
||
ColorUtil.GetColor("#91cc75"),
|
||
ColorUtil.GetColor("#fac858"),
|
||
ColorUtil.GetColor("#ee6666"),
|
||
ColorUtil.GetColor("#73c0de"),
|
||
ColorUtil.GetColor("#3ba272"),
|
||
ColorUtil.GetColor("#fc8452"),
|
||
ColorUtil.GetColor("#9a60b4"),
|
||
ColorUtil.GetColor("#ea7ccc"),
|
||
|
||
};
|
||
InitChartComponentTheme(theme);
|
||
}
|
||
|
||
/// <summary>
|
||
/// dark theme.
|
||
/// |暗主题。
|
||
/// </summary>
|
||
/// <value></value>
|
||
public static void ResetToDarkTheme(Theme theme)
|
||
{
|
||
theme.themeType = ThemeType.Dark;
|
||
theme.themeName = ThemeType.Dark.ToString();
|
||
theme.backgroundColor = ColorUtil.GetColor("#100C2A");
|
||
theme.colorPalette = new List<Color32>
|
||
{
|
||
ColorUtil.GetColor("#4992ff"),
|
||
ColorUtil.GetColor("#7cffb2"),
|
||
ColorUtil.GetColor("#fddd60"),
|
||
ColorUtil.GetColor("#ff6e76"),
|
||
ColorUtil.GetColor("#58d9f9"),
|
||
ColorUtil.GetColor("#05c091"),
|
||
ColorUtil.GetColor("#ff8a45"),
|
||
ColorUtil.GetColor("#8d48e3"),
|
||
ColorUtil.GetColor("#dd79ff"),
|
||
};
|
||
InitChartComponentTheme(theme);
|
||
}
|
||
|
||
public static Theme EmptyTheme
|
||
{
|
||
get
|
||
{
|
||
var theme = ScriptableObject.CreateInstance<Theme>();
|
||
theme.themeType = ThemeType.Custom;
|
||
theme.themeName = ThemeType.Custom.ToString();
|
||
theme.backgroundColor = Color.clear;
|
||
theme.colorPalette = new List<Color32>();
|
||
InitChartComponentTheme(theme);
|
||
return theme;
|
||
}
|
||
}
|
||
|
||
public void SyncFontToSubComponent()
|
||
{
|
||
common.font = font;
|
||
title.font = font;
|
||
subTitle.font = font;
|
||
legend.font = font;
|
||
axis.font = font;
|
||
tooltip.font = font;
|
||
dataZoom.font = font;
|
||
visualMap.font = font;
|
||
}
|
||
|
||
#if dUI_TextMeshPro
|
||
public void SyncTMPFontToSubComponent()
|
||
{
|
||
common.tmpFont = tmpFont;
|
||
title.tmpFont = tmpFont;
|
||
subTitle.tmpFont = tmpFont;
|
||
legend.tmpFont = tmpFont;
|
||
axis.tmpFont = tmpFont;
|
||
tooltip.tmpFont = tmpFont;
|
||
dataZoom.tmpFont = tmpFont;
|
||
visualMap.tmpFont = tmpFont;
|
||
}
|
||
#endif
|
||
|
||
private static void InitChartComponentTheme(Theme theme)
|
||
{
|
||
theme.common = new ComponentTheme(theme.themeType);
|
||
theme.title = new TitleTheme(theme.themeType);
|
||
theme.subTitle = new SubTitleTheme(theme.themeType);
|
||
theme.legend = new LegendTheme(theme.themeType);
|
||
theme.axis = new AxisTheme(theme.themeType);
|
||
theme.tooltip = new TooltipTheme(theme.themeType);
|
||
theme.dataZoom = new DataZoomTheme(theme.themeType);
|
||
theme.visualMap = new VisualMapTheme(theme.themeType);
|
||
theme.serie = new SerieTheme(theme.themeType);
|
||
theme.SetDefaultFont();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Convert the html string to color.
|
||
/// |将字符串颜色值转成Color。
|
||
/// </summary>
|
||
/// <param name="hexColorStr"></param>
|
||
/// <returns></returns>
|
||
public static Color32 GetColor(string hexColorStr)
|
||
{
|
||
Color color;
|
||
ColorUtility.TryParseHtmlString(hexColorStr, out color);
|
||
return (Color32) color;
|
||
}
|
||
|
||
public void SetColorPalette(List<string> hexColorStringList)
|
||
{
|
||
m_ColorPalette.Clear();
|
||
foreach (var hexColor in hexColorStringList)
|
||
m_ColorPalette.Add(ColorUtil.GetColor(hexColor));
|
||
|
||
}
|
||
|
||
public override int GetHashCode()
|
||
{
|
||
return base.GetHashCode();
|
||
}
|
||
}
|
||
} |