Editor/PropertyControlSheet.cs
using Sandbox;
using Editor;
namespace SFXR.Editor;
public class PropertyControlSheet : GridLayout
{
public SerializedObject TargetObject { get; set; }
int rows = 0;
public PropertyControlSheet() : base()
{
Margin = new Sandbox.UI.Margin( 16, 8, 16, 8 );
HorizontalSpacing = 10;
VerticalSpacing = 2;
SetColumnStretch( 1, 2 );
SetMinimumColumnWidth( 0, 120 );
}
public void AddObject( SerializedObject obj )
{
foreach ( var entry in obj )
{
if ( !entry.HasAttribute<PropertyAttribute>() )
{
continue;
}
if ( entry.PropertyType.Name.StartsWith( "Action" ) )
{
continue;
}
AddRow( entry );
}
}
/// <summary>
/// Add a serialized property row. This will create an editor for the row and a label.
/// </summary>
public void AddRow( SerializedProperty property, float labelIndent = 0.0f )
{
var editor = ControlWidget.Create( property );
if ( editor is null )
return;
if ( editor.IsWideMode )
{
AddCell( 0, rows++, new Label( property.DisplayName ) { MinimumHeight = Theme.RowHeight, Alignment = TextFlag.LeftCenter }, 2, 1, TextFlag.LeftTop );
var lo = AddCell( 0, rows, Layout.Column(), 2, 1, TextFlag.LeftTop );
lo.Margin = new Sandbox.UI.Margin( 16, 0, 0, 0 );
lo.Add( editor );
}
else
{
int cell = 0;
var label = AddCell( cell++, rows, new Label( property.DisplayName ), 1, 1, TextFlag.LeftTop );
label.MinimumHeight = Theme.RowHeight;
label.Alignment = TextFlag.LeftCenter;
label.SetStyles( "color: #aaa;" );
label.ToolTip = property.Description ?? property.DisplayName;
if ( labelIndent > 0 )
{
label.ContentMargins = new Sandbox.UI.Margin( labelIndent, 0, 0, 0 );
}
AddCell( cell++, rows, editor, 1, 1, TextFlag.LeftTop );
}
rows++;
}
/// <summary>
/// Add a layout to a double wide cell
/// </summary>
public void AddLayout( Layout layout )
{
AddCell( 0, rows++, layout, 2, 1, TextFlag.LeftTop );
}
}