From 917e9e0b320775634dc2e710f7deac74fd0822f0 Mon Sep 17 00:00:00 2001 From: chai Date: Thu, 22 Oct 2020 23:30:02 +0800 Subject: * amplify shader editor --- .../Plugins/Editor/Menu/Tools/ToolsMenuButton.cs | 249 +++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButton.cs (limited to 'Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButton.cs') diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButton.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButton.cs new file mode 100644 index 00000000..a1994638 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButton.cs @@ -0,0 +1,249 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +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 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 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(); + 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(); + 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*/ GUIStyle.none ); + 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; } + } + } +} -- cgit v1.1-26-g67d0