Editor/ShaderGraphPlus/Widgets/ControlWidgets/SGPFeatureEnumPreviewIndexControlWidget.cs
using Editor;
using static ShaderGraphPlus.ShaderGraphPlusGlobals;
namespace ShaderGraphPlus;
[CustomEditor( typeof( int ), NamedEditor = ControlWidgetCustomEditors.ShaderFeatureEnumPreviewIndexEditor )]
internal sealed class SGPFeatureEnumPreviewIndexControlWidget : DropdownControlWidgetPlus<int>
{
private ShaderFeatureEnumParameter _featureEnumParameter;
private Entry _selectedEntry;
private int _selectedIndex;
public SGPFeatureEnumPreviewIndexControlWidget( SerializedProperty property ) : base( property )
{
_featureEnumParameter = property.Parent.Targets.OfType<ShaderFeatureEnumParameter>().FirstOrDefault();
if ( _featureEnumParameter is null ) return;
var currentSelctedIndex = SerializedProperty.GetValue<int>();
if ( TryGetEntryFromIndex( currentSelctedIndex, out var entry ) )
{
_selectedEntry = entry;
_selectedIndex = currentSelctedIndex;
}
else
{
SGPLogger.Error( $"Couldnt find entry at index \"{currentSelctedIndex}\"" );
}
}
private bool TryGetEntryFromIndex( int selectedIndex, out Entry foundEntry )
{
foundEntry = new();
foreach ( var entry in GetDropdownValues().OfType<Entry>().Index() )
{
if ( entry.Index == selectedIndex )
{
foundEntry = entry.Item;
return true;
}
}
return false;
}
private bool TryGetyIndexFromEntry( Entry selectedEntry, out int foundIndex )
{
foundIndex = new();
foreach ( var entry in _featureEnumParameter.Options.Index() )
{
if ( entry.Item.Name == selectedEntry.Label )
{
foundIndex = entry.Index;
return true;
}
}
return false;
}
protected override void OnSelectItem( object item )
{
base.OnSelectItem( item );
if ( item is Entry e )
{
_selectedEntry = e;
if ( TryGetyIndexFromEntry( _selectedEntry, out var newSelectedIndex ) )
{
_selectedIndex = newSelectedIndex;
}
}
}
protected override IEnumerable<object> GetDropdownValues()
{
List<object> list = new();
foreach ( var option in _featureEnumParameter.Options.Index() )
{
var entry = new Entry();
entry.Value = option.Index;
entry.Label = option.Item.Name;
entry.Description = "";
list.Add( entry );
}
return list;
}
protected override void OnPaint()
{
Paint.Antialiasing = true;
Paint.TextAntialiasing = true;
PaintUnder();
PaintControl();
PaintOver();
}
protected override void PaintControl()
{
var entryLabel = _selectedEntry.Label; // at index {SelectedIndex}";
var color = IsControlHovered ? Theme.Blue : Theme.TextControl;
var rect = LocalRect;
rect = rect.Shrink( 8, 0 );
Paint.SetPen( color );
Paint.SetDefaultFont();
if ( SerializedProperty.IsMultipleDifferentValues )
{
Paint.SetPen( Theme.MultipleValues );
Paint.DrawText( rect, "Multiple Values", TextFlag.LeftCenter );
}
else
{
Paint.DrawText( rect, entryLabel ?? "None", TextFlag.LeftCenter );
}
Paint.SetPen( color );
Paint.DrawIcon( rect, "Arrow_Drop_Down", 17, TextFlag.RightCenter );
}
}