1
0
mirror of https://github.com/Siccity/xNode.git synced 2026-03-26 22:49:02 +08:00
xNode/Scripts/Editor/Drawers/Odin/AsDynamicPortAttributes.cs

109 lines
2.7 KiB
C#

#if UNITY_EDITOR && ODIN_INSPECTOR
using Sirenix.OdinInspector.Editor;
using System;
using UnityEditor;
using UnityEngine;
using XNode;
using static XNode.Node;
namespace XNodeEditor.Odin
{
internal abstract class AsDynamicPortAtribute : System.Attribute
{
public string FieldName { get; set; }
public Node Node { get; set; }
public bool InList { get; set; }
public ShowBackingValue BackingValue { get; set; }
public NodePort Port
{
get
{
return Node.GetPort( FieldName );
}
}
}
internal class AsDynamicPortNoDataAtribute : AsDynamicPortAtribute { }
internal class AsDynamicPortWithDataAtribute : AsDynamicPortAtribute { }
internal struct AsDynamicPortScope : IDisposable
{
public AsDynamicPortScope( NodePort port, bool inList )
{
EditorGUILayout.BeginVertical();
var rect = GUILayoutUtility.GetRect( 0f, float.MaxValue, 0f, 0f, GUI.skin.label, GUILayout.ExpandWidth( true ) );
if ( port != null && NodeEditor.isNodeEditor )
{
if ( port.IsInput )
{
Vector2 offset;
if ( inList )
offset = new Vector2( -42, 0 );
else
offset = new Vector2( -18, 0 );
NodeEditorGUILayout.PortField( new Vector2( rect.xMin, rect.center.y ) + offset, port );
}
else
{
Vector2 offset;
if ( inList )
offset = new Vector2( 21, 0 );
else
offset = new Vector2( 0, 0 );
NodeEditorGUILayout.PortField( new Vector2( rect.xMax, rect.center.y ) + offset, port );
}
}
EditorGUILayout.BeginHorizontal();
EditorGUILayout.BeginVertical();
}
public void Dispose()
{
EditorGUILayout.EndVertical();
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
}
}
[DrawerPriority( 0.4, 0, 0 )]
internal class AsDynamicPortNoDataAttributeDrawer<T> : OdinAttributeDrawer<AsDynamicPortNoDataAtribute, T>
{
protected override void DrawPropertyLayout( GUIContent label )
{
if ( Attribute.Port == null )
return;
using ( new AsDynamicPortScope( Attribute.Port, Attribute.InList ) )
CallNextDrawer( label );
}
}
[DrawerPriority( 0.4, 0, 0 )]
internal class AsDynamicPortWithDataAtributeDrawer<T> : OdinAttributeDrawer<AsDynamicPortWithDataAtribute, T>
{
protected bool drawData = false;
protected override void DrawPropertyLayout( GUIContent label )
{
if ( Attribute.Port == null )
return;
if ( Event.current.type == EventType.Layout )
drawData = Attribute.BackingValue == ShowBackingValue.Always || Attribute.BackingValue == ShowBackingValue.Unconnected && !Attribute.Port.IsConnected;
using ( new AsDynamicPortScope( Attribute.Port, Attribute.InList ) )
{
if ( drawData )
CallNextDrawer( label );
else
EditorGUILayout.LabelField( label );
}
}
}
}
#endif