243 lines
7.6 KiB
C#
243 lines
7.6 KiB
C#
#define Graph_And_Chart_PRO
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using UnityEngine;
|
|
|
|
namespace ChartAndGraph.Legened
|
|
{
|
|
/// <summary>
|
|
/// class for canvas legned. this class basiically creates the legned prefab for each category in the chart
|
|
/// </summary>
|
|
[ExecuteInEditMode]
|
|
class CanvasLegend : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
private int fontSize;
|
|
|
|
|
|
[Serializable]
|
|
public class ImageOverride
|
|
{
|
|
public Texture2D Image = null;
|
|
public String category = "";
|
|
}
|
|
[SerializeField]
|
|
public ImageOverride[] CategoryImages = null;
|
|
|
|
private Dictionary<string,Texture2D> CreateimageDictionary()
|
|
{
|
|
Dictionary<string, Texture2D> dic = new Dictionary<string, Texture2D>();
|
|
if (CategoryImages == null)
|
|
return dic;
|
|
foreach(ImageOverride ent in CategoryImages)
|
|
{
|
|
dic[ent.category] = ent.Image;
|
|
}
|
|
return dic;
|
|
}
|
|
|
|
public int FontSize
|
|
{
|
|
get { return fontSize; }
|
|
set
|
|
{
|
|
fontSize = value;
|
|
PropertyChanged();
|
|
}
|
|
}
|
|
|
|
[SerializeField]
|
|
private CanvasLegendItem legendItemPrefab;
|
|
|
|
public CanvasLegendItem LegenedItemPrefab
|
|
{
|
|
get { return legendItemPrefab; }
|
|
set
|
|
{
|
|
legendItemPrefab = value;
|
|
PropertyChanged();
|
|
}
|
|
}
|
|
|
|
[SerializeField]
|
|
private AnyChart chart;
|
|
|
|
List<UnityEngine.Object> mToDispose = new List<UnityEngine.Object>();
|
|
bool mGenerateNext = false;
|
|
public AnyChart Chart
|
|
{
|
|
get { return chart; }
|
|
set
|
|
{
|
|
if (chart != null)
|
|
((IInternalUse)chart).Generated -= CanvasLegend_Generated;
|
|
chart = value;
|
|
if(chart != null)
|
|
((IInternalUse)chart).Generated += CanvasLegend_Generated;
|
|
PropertyChanged();
|
|
}
|
|
}
|
|
void Start()
|
|
{
|
|
if (chart != null)
|
|
((IInternalUse)chart).Generated += CanvasLegend_Generated;
|
|
InnerGenerate();
|
|
}
|
|
void OnEnable()
|
|
{
|
|
if (chart != null)
|
|
((IInternalUse)chart).Generated += CanvasLegend_Generated;
|
|
InnerGenerate();
|
|
}
|
|
void OnDisable()
|
|
{
|
|
if (chart != null)
|
|
((IInternalUse)chart).Generated -= CanvasLegend_Generated;
|
|
// Clear();
|
|
}
|
|
void OnDestory()
|
|
{
|
|
if (chart != null)
|
|
((IInternalUse)chart).Generated -= CanvasLegend_Generated;
|
|
Clear();
|
|
}
|
|
private void CanvasLegend_Generated()
|
|
{
|
|
InnerGenerate();
|
|
}
|
|
protected void OnValidate()
|
|
{
|
|
if (chart != null)
|
|
((IInternalUse)chart).Generated += CanvasLegend_Generated;
|
|
Generate();
|
|
}
|
|
protected void PropertyChanged()
|
|
{
|
|
Generate();
|
|
}
|
|
|
|
public void Clear()
|
|
{
|
|
CanvasLegendItem[] items = gameObject.GetComponentsInChildren<CanvasLegendItem>();
|
|
for(int i=0; i<items.Length; i++)
|
|
{
|
|
if (items[i] == null || items[i].gameObject == null)
|
|
continue;
|
|
ChartCommon.SafeDestroy(items[i].gameObject);
|
|
}
|
|
for(int i=0; i<mToDispose.Count; i++)
|
|
{
|
|
UnityEngine.Object obj = mToDispose[i];
|
|
if (obj != null)
|
|
ChartCommon.SafeDestroy(obj);
|
|
}
|
|
mToDispose.Clear();
|
|
}
|
|
|
|
bool isGradientShader(Material mat)
|
|
{
|
|
if (mat.HasProperty("_ColorFrom") && mat.HasProperty("_ColorTo"))
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
Sprite CreateSpriteFromTexture(Texture2D t)
|
|
{
|
|
Sprite sp = Sprite.Create(t, new Rect(0f, 0f, (float)t.width, (float)t.height), new Vector2(0.5f, 0.5f));
|
|
sp.hideFlags = HideFlags.DontSave;
|
|
mToDispose.Add(sp);
|
|
return sp;
|
|
}
|
|
|
|
Material CreateCanvasGradient(Material mat)
|
|
{
|
|
Material m = (Material)Resources.Load("Chart And Graph/Legend/CanvasGradient");
|
|
if (m == null)
|
|
return null;
|
|
Material grad = new Material(m);
|
|
grad.hideFlags = HideFlags.DontSave;
|
|
Color from = mat.GetColor("_ColorFrom");
|
|
Color to = mat.GetColor("_ColorTo");
|
|
grad.SetColor("_ColorFrom", from);
|
|
grad.SetColor("_ColorTo", to);
|
|
mToDispose.Add(grad);
|
|
return grad;
|
|
}
|
|
|
|
public void Generate()
|
|
{
|
|
mGenerateNext = true;
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
|
|
if (mGenerateNext == true)
|
|
InnerGenerate();
|
|
}
|
|
|
|
private void InnerGenerate()
|
|
{
|
|
if (enabled == false || gameObject.activeInHierarchy == false)
|
|
return;
|
|
mGenerateNext = false;
|
|
Clear();
|
|
if (chart == null || legendItemPrefab == null)
|
|
return;
|
|
LegenedData inf = ((IInternalUse)chart).InternalLegendInfo;
|
|
if (inf == null)
|
|
return;
|
|
var dic = CreateimageDictionary();
|
|
foreach (LegenedData.LegenedItem item in inf.Items)
|
|
{
|
|
GameObject prefab = (GameObject)GameObject.Instantiate(legendItemPrefab.gameObject);
|
|
ChartCommon.HideObject(prefab, true);
|
|
prefab.transform.SetParent(transform, false);
|
|
foreach (Transform child in prefab.transform)
|
|
child.gameObject.hideFlags = HideFlags.HideAndDontSave;
|
|
|
|
CanvasLegendItem legendItemData = prefab.GetComponent<CanvasLegendItem>();
|
|
Texture2D overrideImage = null;
|
|
|
|
if (dic.TryGetValue(item.Name, out overrideImage) == false)
|
|
overrideImage = null;
|
|
|
|
if(overrideImage != null)
|
|
{
|
|
legendItemData.Image.material = null;
|
|
Texture2D tex = overrideImage;
|
|
legendItemData.Image.sprite = CreateSpriteFromTexture(tex);
|
|
}
|
|
else
|
|
if (legendItemData.Image != null)
|
|
{
|
|
if (item.Material == null)
|
|
legendItemData.Image.material = null;
|
|
else
|
|
{
|
|
if (isGradientShader(item.Material))
|
|
{
|
|
legendItemData.Image.material = CreateCanvasGradient(item.Material);
|
|
}
|
|
else
|
|
{
|
|
legendItemData.Image.material = null;
|
|
Texture2D tex = item.Material.mainTexture as Texture2D;
|
|
if (tex != null)
|
|
legendItemData.Image.sprite = CreateSpriteFromTexture(tex);
|
|
legendItemData.Image.color = item.Material.color;
|
|
}
|
|
}
|
|
}
|
|
if (legendItemData.Text != null)
|
|
{
|
|
legendItemData.Text.text = item.Name;
|
|
legendItemData.Text.fontSize = fontSize;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|