using UnityEditor;
using UnityEngine;
namespace Unity.VisualScripting
{
[Inspector(typeof(VariableDeclaration))]
public sealed class VariableDeclarationInspector : Inspector
{
private Metadata nameMetadata => metadata[nameof(VariableDeclaration.name)];
private Metadata valueMetadata => metadata[nameof(VariableDeclaration.value)];
private Metadata typeMetadata => metadata[nameof(VariableDeclaration.typeHandle)];
public VariableDeclarationInspector(Metadata metadata)
: base(metadata)
{
VSUsageUtility.isVisualScriptingUsed = true;
}
protected override float GetHeight(float width, GUIContent label)
{
var height = 0f;
using (LudiqGUIUtility.labelWidth.Override(Styles.labelWidth))
{
height += Styles.padding;
height += GetNameHeight(width);
height += Styles.spacing;
height += GetTypeHeight(width);
height += Styles.spacing;
height += GetValueHeight(width);
height += Styles.padding;
}
return height;
}
private float GetNameHeight(float width)
{
return EditorGUIUtility.singleLineHeight;
}
private float GetValueHeight(float width)
{
return LudiqGUI.GetInspectorHeight(this, valueMetadata, width);
}
float GetTypeHeight(float width)
{
return LudiqGUI.GetInspectorHeight(this, typeMetadata, width);
}
protected override void OnGUI(Rect position, GUIContent label)
{
position = BeginLabeledBlock(metadata, position, label);
using (LudiqGUIUtility.labelWidth.Override(Styles.labelWidth))
{
y += Styles.padding;
var namePosition = position.VerticalSection(ref y, GetNameHeight(position.width));
y += Styles.spacing;
var typePosition = position.VerticalSection(ref y, GetTypeHeight(position.width));
y += Styles.spacing;
var valuePosition = position.VerticalSection(ref y, GetValueHeight(position.width));
y += Styles.padding;
OnNameGUI(namePosition);
OnTypeGUI(typePosition);
OnValueGUI(valuePosition);
}
EndBlock(metadata);
}
public void OnNameGUI(Rect namePosition)
{
namePosition = BeginLabeledBlock(nameMetadata, namePosition);
var newName = EditorGUI.DelayedTextField(namePosition, (string)nameMetadata.value);
if (EndBlock(nameMetadata))
{
var variableDeclarations = (VariableDeclarationCollection)metadata.parent.value;
if (StringUtility.IsNullOrWhiteSpace(newName))
{
EditorUtility.DisplayDialog("Edit Variable Name", "Please enter a variable name.", "OK");
return;
}
else if (variableDeclarations.Contains(newName))
{
EditorUtility.DisplayDialog("Edit Variable Name", "A variable with the same name already exists.", "OK");
return;
}
nameMetadata.RecordUndo();
variableDeclarations.EditorRename((VariableDeclaration)metadata.value, newName);
nameMetadata.value = newName;
}
}
public void OnValueGUI(Rect valuePosition)
{
LudiqGUI.Inspector(valueMetadata, valuePosition, GUIContent.none);
}
public void OnTypeGUI(Rect position)
{
LudiqGUI.Inspector(typeMetadata, position, GUIContent.none);
}
public static class Styles
{
public static readonly float labelWidth = SystemObjectInspector.Styles.labelWidth;
public static readonly float padding = 2;
public static readonly float spacing = EditorGUIUtility.standardVerticalSpacing;
}
}
}