Files
ShellosDollhouse/Assets/Udon/Editor/ProgramSources/UdonGraphProgram/UI/GraphView/UdonGraphStatus.cs
T

135 lines
3.8 KiB
C#

using UnityEditor;
using UnityEngine;
using UnityEngine.Experimental.UIElements;
using UnityEditor.Experimental.UIElements;
namespace VRC.Udon.Editor.ProgramSources.UdonGraphProgram.UI.GraphView
{
public class UdonGraphStatus : ToolbarToggle
{
private VisualElement _detailsContainer;
private UdonProgramSourceView _programSourceView;
private UdonGraphProgramAsset _graphAsset;
private TextElement _label;
public UdonGraphStatus(VisualElement detailsContainer)
{
_detailsContainer = detailsContainer;
_label = new TextElement() { text = "-", name = "Content" };
_label.StretchToParentSize();
Add(_label);
OnValueChanged(ShowGraphAssetDetails);
_programSourceView = new UdonProgramSourceView();
}
private void ShowGraphAssetDetails(ChangeEvent<bool> changeEvent)
{
// Just remove it
if (!changeEvent.newValue)
{
RemoveIfContaining(_programSourceView);
return;
}
// else we need to make a new one and show it
if (_graphAsset == null)
{
Debug.LogError("Can't show Asset Details for a null asset.");
return;
}
RemoveIfContaining(_programSourceView);
_detailsContainer.Add(_programSourceView);
_programSourceView.BringToFront();
}
private void RemoveIfContaining(VisualElement element)
{
if (_detailsContainer.Contains(element))
{
_detailsContainer.Remove(element);
}
}
public void OnAssemble(bool success, string assembly)
{
if (!enabledInHierarchy || _label == null) return;
string newText;
Color flashColor;
Color targetColor;
// change visuals based on success
if(success)
{
newText = "OK";
flashColor = new Color(0, 1, 0);
targetColor = new Color(0.1f, 0.25f, 0.1f, alpha);
}
else
{
newText = "!";
flashColor = new Color(1, 0, 0);
targetColor = new Color(0.25f, 0.1f, 0.1f, alpha);
}
// Update visuals
_label.text = newText;
_label.style.backgroundColor = flashColor;
LerpColor(targetColor);
_programSourceView.SetText(assembly);
}
private Color targetColor;
private Color startColor;
private float lerpAmount = 0f;
private float alpha = 0.75f;
private void LerpColor(Color newColor)
{
startColor = _label.style.backgroundColor.value;
targetColor = newColor;
lerpAmount = 0f;
EditorApplication.update += UpdateColor;
}
private void UpdateColor()
{
lerpAmount += 0.01f;
if (lerpAmount >= 1)
{
EditorApplication.update -= UpdateColor;
}
if(_label != null)
{
_label.style.backgroundColor = Color.Lerp(startColor, targetColor, lerpAmount);
}
}
public override void Blur()
{
EditorApplication.update -= UpdateColor;
}
~UdonGraphStatus()
{
EditorApplication.update -= UpdateColor;
if(_graphAsset != null)
{
_graphAsset.OnAssemble -= OnAssemble;
}
}
internal void LoadAsset(UdonGraphProgramAsset asset)
{
_graphAsset = asset;
_graphAsset.OnAssemble += OnAssemble;
_programSourceView.LoadAsset(asset);
}
}
}