Editor/Sprite/SpriteComponent/CurrentAnimationWidget.cs
using System;
using Editor;
using Sandbox;

namespace SpriteTools;

[CustomEditor(typeof(string), WithAllAttributes = new[] { typeof(SpriteComponent.AnimationNameAttribute) })]
public class AnimationNameControlWidget : ControlWidget
{
	public AnimationNameControlWidget(SerializedProperty property) : base(property)
	{
		Layout = Layout.Column();
		Layout.Spacing = 2;

		AcceptDrops = false;

		Rebuild();
	}

	protected override void OnPaint()
	{

	}

	SpriteResource Sprite
	{
		get
		{
			if (!SerializedProperty.TryGetAttribute<SpriteComponent.AnimationNameAttribute>(out var attr))
				return null;

			var spriteProperty = SerializedProperty.Parent.GetProperty(attr.Parameter);
			if (spriteProperty is null)
				return null;

			return spriteProperty.GetValue<SpriteResource>(null);
		}
	}

	public void Rebuild()
	{
		Layout.Clear(true);

		var sprite = Sprite;
		if (sprite is null) return;

		if (sprite.Animations.Count <= 0)
		{
			Layout.Add(new Label("None"));
			return;
		}

		var comboBox = new ComboBox(this);
		var v = SerializedProperty.GetValue<string>();

		for (int i = 0; i < sprite.Animations.Count; ++i)
		{
			var name = sprite.Animations[i].Name;
			comboBox.AddItem(name, onSelected: () => SerializedProperty.SetValue(name), selected: string.Equals(v, name, StringComparison.OrdinalIgnoreCase));
		}

		Layout.Add(comboBox);
	}

	protected override void OnValueChanged()
	{
		Rebuild();
	}

	protected override int ValueHash
	{
		get
		{
			var hc = new HashCode();
			hc.Add(base.ValueHash);
			hc.Add(Sprite);

			if (Sprite is not null)
			{
				for (int i = 0; i < Sprite.Animations.Count; ++i)
				{
					hc.Add(Sprite.Animations[i].Name);
				}
			}

			return hc.ToHashCode();
		}
	}
}