You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

249 lines
6.8 KiB

// Amplify Shader Editor - Visual Shader Editing Tool
// Copyright (c) Amplify Creations, Lda <info@amplify.pt>
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
namespace AmplifyShaderEditor
{
public sealed class ToolsMenuButton : ToolsMenuButtonParent
{
public delegate void ToolButtonPressed( ToolButtonType type );
public event ToolButtonPressed ToolButtonPressedEvt;
private Rect m_buttonArea;
private List<Texture2D> m_buttonTexture;
private string m_buttonTexturePath;
private ToolButtonType m_buttonType;
private GUIStyle m_style;
private bool m_enabled = true;
private bool m_drawOnFunction = true;
private List<string> m_cachedStates;
private int m_bufferedState = -1;
private string m_bufferedTooltip = string.Empty;
public ToolsMenuButton( AmplifyShaderEditorWindow parentWindow, ToolButtonType type, float x, float y, float width, float height, string texturePath, string text, string tooltip, float buttonSpacing = -1, bool drawOnFunction = true ) : base( parentWindow, text, tooltip, buttonSpacing )
{
m_buttonArea = new Rect( x, y, width, height );
m_buttonType = type;
m_buttonTexturePath = texturePath;
m_cachedStates = new List<string>();
m_drawOnFunction = drawOnFunction;
}
public void AddState( string state )
{
m_cachedStates.Add( state );
}
public override void Destroy()
{
ToolButtonPressedEvt = null;
if ( m_buttonTexture != null )
{
for ( int i = 0; i < m_buttonTexture.Count; i++ )
{
Resources.UnloadAsset( m_buttonTexture[ i ] );
}
m_buttonTexture.Clear();
}
m_buttonTexture = null;
}
protected override void Init()
{
base.Init();
if ( m_buttonTexture == null )
{
m_buttonTexturePath = AssetDatabase.GUIDToAssetPath( m_buttonTexturePath );
m_buttonTexture = new List<Texture2D>();
m_buttonTexture.Add( AssetDatabase.LoadAssetAtPath( m_buttonTexturePath, typeof( Texture2D ) ) as Texture2D );
}
if ( m_cachedStates.Count > 0 )
{
for ( int i = 0; i < m_cachedStates.Count; i++ )
{
m_cachedStates[ i ] = AssetDatabase.GUIDToAssetPath( m_cachedStates[ i ] );
m_buttonTexture.Add( AssetDatabase.LoadAssetAtPath( m_cachedStates[ i ], typeof( Texture2D ) ) as Texture2D );
}
m_cachedStates.Clear();
}
if ( m_style == null )
{
m_style = new GUIStyle( UIUtils.Button );
m_style.normal.background = m_buttonTexture[ 0 ];
m_style.hover.background = m_buttonTexture[ 0 ];
m_style.hover.textColor = m_style.normal.textColor;
m_style.active.background = m_buttonTexture[ 0 ];
m_style.active.textColor = m_style.normal.textColor;
m_style.onNormal.background = m_buttonTexture[ 0 ];
m_style.onNormal.textColor = m_style.normal.textColor;
m_style.onHover.background = m_buttonTexture[ 0 ];
m_style.onHover.textColor = m_style.normal.textColor;
m_style.onActive.background = m_buttonTexture[ 0 ];
m_style.onActive.textColor = m_style.normal.textColor;
m_style.clipping = TextClipping.Overflow;
m_style.fontStyle = FontStyle.Bold;
m_style.alignment = TextAnchor.LowerCenter;
m_style.contentOffset = new Vector2( 0, 15 );
m_style.fontSize = 10;
bool resizeFromTexture = false;
if ( m_buttonArea.width > 0 )
{
m_style.fixedWidth = m_buttonArea.width;
}
else
{
resizeFromTexture = true;
}
if ( m_buttonArea.height > 0 )
{
m_style.fixedHeight = m_buttonArea.height;
}
else
{
resizeFromTexture = true;
}
if ( resizeFromTexture )
{
m_buttonArea.width = m_style.fixedWidth = m_buttonTexture[ 0 ].width;
m_buttonArea.height = m_style.fixedHeight = m_buttonTexture[ 0 ].height;
}
}
}
public override void Draw()
{
base.Draw();
bool guiEnabledBuffer = GUI.enabled;
GUI.enabled = m_enabled;
if ( GUILayout.Button( m_content, m_style ) && ToolButtonPressedEvt != null )
{
ToolButtonPressedEvt( m_buttonType );
}
GUI.enabled = guiEnabledBuffer;
}
public override void Draw( float x, float y )
{
if ( !(m_parentWindow.CameraDrawInfo.CurrentEventType == EventType.MouseDown || m_parentWindow.CameraDrawInfo.CurrentEventType == EventType.Repaint ) )
return;
if ( m_parentWindow.CurrentGraph.CurrentMasterNode == null && !m_drawOnFunction)
return;
base.Draw( x, y );
if ( m_bufferedState > -1 )
{
if ( string.IsNullOrEmpty( m_bufferedTooltip ) )
{
SetStateOnButton( m_bufferedState );
}
else
{
SetStateOnButton( m_bufferedState, m_bufferedTooltip );
}
m_bufferedState = -1;
m_bufferedTooltip = string.Empty;
}
m_buttonArea.x = x;
m_buttonArea.y = y;
if ( m_parentWindow.CameraDrawInfo.CurrentEventType == EventType.MouseDown && m_buttonArea.Contains( m_parentWindow.CameraDrawInfo.MousePosition ) && ToolButtonPressedEvt != null )
{
ToolButtonPressedEvt( m_buttonType );
Event.current.Use();
m_parentWindow.CameraDrawInfo.CurrentEventType = EventType.Used;
}
else if ( m_parentWindow.CameraDrawInfo.CurrentEventType == EventType.Repaint )
{
GUI.Label( m_buttonArea, m_content, m_style );
}
//if ( GUI.Button( m_buttonArea, m_content, m_style ) && ToolButtonPressedEvt != null )
//{
// ToolButtonPressedEvt( m_buttonType );
//}
}
public override void Draw( Vector2 pos )
{
Draw( pos.x, pos.y );
}
public override void SetStateOnButton( int state, string tooltip )
{
if ( m_buttonTexture == null || m_style == null )
{
m_bufferedState = state;
m_bufferedTooltip = tooltip;
return;
}
if ( state < 0 || state >= m_buttonTexture.Count )
{
return;
}
base.SetStateOnButton( state, tooltip );
m_style.normal.background = m_buttonTexture[ state ];
m_style.hover.background = m_buttonTexture[ state ];
m_style.active.background = m_buttonTexture[ state ];
m_style.onNormal.background = m_buttonTexture[ state ];
m_style.onHover.background = m_buttonTexture[ state ];
m_style.onActive.background = m_buttonTexture[ state ];
}
public override void SetStateOnButton( int state )
{
if ( m_buttonTexture == null || m_style == null )
{
m_bufferedState = state;
return;
}
if ( state < 0 || state >= m_buttonTexture.Count )
{
return;
}
base.SetStateOnButton( state );
m_style.normal.background = m_buttonTexture[ state ];
m_style.hover.background = m_buttonTexture[ state ];
m_style.active.background = m_buttonTexture[ state ];
m_style.onNormal.background = m_buttonTexture[ state ];
m_style.onHover.background = m_buttonTexture[ state ];
m_style.onActive.background = m_buttonTexture[ state ];
}
public bool IsInside( Vector2 pos )
{
return m_buttonArea.Contains( pos );
}
public bool Enabled
{
get { return m_enabled; }
set { m_enabled = value; }
}
}
}