Editor/DynamicsControlWidget.cs
using Editor;
using Sandbox;

namespace Andicraft.SecondOrderDynamics.Editor;

[CustomEditor(typeof(DynamicsParameters))]
public class DynamicsControlWidget : ControlWidget
{
	public DynamicsControlWidget(SerializedProperty property) : base(property)
	{
		var l = Layout.Grid();
		Layout = l;
		l.SetMinimumRowHeight( 1, 100 );
		Layout.Spacing = 2;

		var serializedObject = property.GetValue<DynamicsParameters>()?.GetSerialized();

		if ( serializedObject is null ) return;
		
		serializedObject.TryGetProperty( "Frequency", out var f );
		serializedObject.TryGetProperty( "Damping", out var d );
		serializedObject.TryGetProperty( "Response", out var r );

		l.AddCell(0, 0, new FloatControlWidget( f) { Label = "f"});
		l.AddCell(1, 0, new FloatControlWidget( d ) { Label = "d"});
		l.AddCell(2, 0, new FloatControlWidget( r ) { Label = "r"});
		l.AddCell( 0, 1, new DynamicsGraphWidget( this, serializedObject ), xSpan: 3, ySpan: 5 );
		
		Height = 100f;
	}
}