diff options
Diffstat (limited to 'Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConsoleLogWindow.cs')
-rw-r--r-- | Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConsoleLogWindow.cs | 288 |
1 files changed, 288 insertions, 0 deletions
diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConsoleLogWindow.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConsoleLogWindow.cs new file mode 100644 index 00000000..937ebe21 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConsoleLogWindow.cs @@ -0,0 +1,288 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [System.Serializable] + public class Toast + { + public MessageSeverity ItemType; + public string ItemMessage; + public double ItemTime; + public int ItemOwnerId; + public Toast( MessageSeverity itemType, string itemMessage, double itemTime,int itemOwnerId ) + { + ItemType = itemType; + ItemMessage = itemMessage; + ItemTime = itemTime; + ItemOwnerId = itemOwnerId; + } + } + + public class ConsoleLogWindow + { + public const int MAXWIDTH = 400; + public const float FADETIME = 7; + + private readonly GUIContent m_boxToggleContent = new GUIContent( "\u2261", "Toggle Message Box" ); + private readonly GUIContent m_clearContent = new GUIContent( "\u00D7", "Clear Messages" ); + + protected AmplifyShaderEditorWindow m_parentWindow = null; + + // needs to be serialized + private Vector2 m_currentScrollPos; + + int lastCall = -1; + + public ConsoleLogWindow( AmplifyShaderEditorWindow parentWindow ) + { + m_parentWindow = parentWindow; + } + + public void AddMessage( MessageSeverity itemType, string itemMessage , int itemOwnerId ) + { + var toast = new Toast( itemType, itemMessage, Time.realtimeSinceStartup, itemOwnerId ); + m_parentWindow.Messages.Insert( 0, toast ); + m_currentScrollPos.y = Mathf.Infinity; + + if( !m_parentWindow.MaximizeMessages ) + lastCall = Mathf.Max( (int)itemType, lastCall ); + + GUIContent gc = new GUIContent( m_parentWindow.Messages.Count + ": " + itemMessage ); + float maxWidth = m_parentWindow.MaxMsgWidth; + maxWidth = Mathf.Max( GUIStyle.none.CalcSize( gc ).x + 16, maxWidth ); + maxWidth = Mathf.Min( maxWidth, MAXWIDTH ); + m_parentWindow.MaxMsgWidth = maxWidth; + } + + public void Draw( Rect parentPosition, Vector2 mousePosition, int mouseButtonId, bool hasKeyboadFocus, float rightSide ) + { + EventType currentEventType = Event.current.type; + var messages = m_parentWindow.Messages; + var maximize = m_parentWindow.MaximizeMessages; + + Rect button = parentPosition; + button.width = 22; + button.height = 22; + button.x = parentPosition.x + parentPosition.width - button.width - rightSide - 8; + button.y = parentPosition.y + parentPosition.height - button.height - ( m_parentWindow.CurrentSelection == ASESelectionMode.Material ? 52 : 8 ); + + Rect toolbarArea = button; + toolbarArea.y -= 5; + if( maximize ) + { + toolbarArea.xMin -= m_parentWindow.MaxMsgWidth; + toolbarArea.yMin -= 66; + } + toolbarArea.x -= 6; + + bool needsRepaint = false; + if( maximize ) + { + GUIStyle labelStyle = UIUtils.ConsoleLogLabel; + toolbarArea.y -= 16 + 8; + GUILayout.BeginArea( toolbarArea, UIUtils.ConsoleLogMessage ); + EditorGUILayout.BeginVertical(); + m_currentScrollPos = EditorGUILayout.BeginScrollView( m_currentScrollPos ); + { + int count = messages.Count; + for( int i = count - 1; i >= 0; i-- ) + { + switch( messages[ i ].ItemType ) + { + case MessageSeverity.Error: + labelStyle.normal.textColor = Color.red; + break; + case MessageSeverity.Warning: + labelStyle.normal.textColor = Color.yellow; + break; + default: + case MessageSeverity.Normal: + labelStyle.normal.textColor = Color.white; + break; + } + + if( messages[ i ].ItemOwnerId < 0 ) + { + GUILayout.Label( ( count - i ) + ": " + messages[ i ].ItemMessage, labelStyle ); + } + else + { + if( GUILayout.Button( ( count - i ) + ": " + messages[ i ].ItemMessage, labelStyle ) ) + { + UIUtils.CurrentWindow.FocusOnNode( messages[ i ].ItemOwnerId, 1, true ); + } + } + } + } + EditorGUILayout.EndScrollView(); + EditorGUILayout.EndVertical(); + + GUILayout.EndArea(); + } + else + { + // draw toaster + int count = messages.Count; + Rect rect = toolbarArea; + rect.xMin -= 200; + + float startFade = FADETIME - 1; + for( int i = 0; i < count; i++ ) + { + GUIStyle msgstyle = UIUtils.ConsoleLogMessage; + float delta = (float)(Time.realtimeSinceStartup - messages[ i ].ItemTime); + if( delta > FADETIME ) + continue; + + if( delta < 0.1f ) + { + msgstyle.normal.textColor = Color.cyan; + } + else if( delta < startFade ) + { + switch( messages[ i ].ItemType ) + { + case MessageSeverity.Error: + msgstyle.normal.textColor = Color.red; + break; + case MessageSeverity.Warning: + msgstyle.normal.textColor = Color.yellow; + break; + default: + case MessageSeverity.Normal: + msgstyle.normal.textColor = Color.white; + break; + } + } + else + { + switch( messages[ i ].ItemType ) + { + case MessageSeverity.Error: + msgstyle.normal.textColor = new Color( 1, 0, 0, FADETIME - delta ); + break; + case MessageSeverity.Warning: + msgstyle.normal.textColor = new Color( 1, 1, 0, FADETIME - delta ); + break; + default: + case MessageSeverity.Normal: + msgstyle.normal.textColor = new Color( 1, 1, 1, FADETIME - delta ); + break; + } + } + + needsRepaint = true; + + GUIContent gc = new GUIContent( messages[ i ].ItemMessage ); + var sizes = msgstyle.CalcSize( gc ); + rect.xMin -= sizes.x - rect.width; + rect.height = sizes.y; + rect.y -= rect.height + 2; + if( messages[ i ].ItemOwnerId < 0 ) + { + GUI.Label( rect, gc, msgstyle ); + } + else + { + if( GUI.Button( rect, gc, msgstyle )) + { + UIUtils.CurrentWindow.FocusOnNode( messages[ i ].ItemOwnerId, 1, true ); + } + } + } + } + //GUI.color = cached; + + if( needsRepaint ) + m_parentWindow.MarkToRepaint(); + + GUIStyle style = UIUtils.ConsoleLogCircle; + + button.size = Vector2.one * 16; + + switch( lastCall ) + { + case 0: + style.normal.textColor = Color.cyan; + break; + case 1: + style.normal.textColor = Color.yellow; + break; + case 2: + style.normal.textColor = Color.red; + break; + default: + style.normal.textColor = new Color( 1, 1, 1, 0.5f ); + break; + } + + if( GUI.Button( button, m_boxToggleContent, style ) ) + { + maximize = !maximize; + m_parentWindow.MaximizeMessages = maximize; + m_currentScrollPos.y = Mathf.Infinity; + lastCall = -1; + } + + style.normal.textColor = new Color( 1, 1, 1, 0.5f ); + //GUI.color = cached; + button.x -= button.width + 2; + + if( maximize && GUI.Button( button, m_clearContent, style ) ) + { + if( messages.Count == 0 ) + { + maximize = false; + m_parentWindow.MaximizeMessages = maximize; + } + ClearMessages(); + } + + button.width += button.width + 2; + bool mouseOnTop = button.Contains( mousePosition ); + + if( currentEventType == EventType.MouseMove && mouseOnTop ) + m_parentWindow.MarkToRepaint(); + + if( DebugConsoleWindow.DeveloperMode ) + { + if( Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Alpha1 ) + { + UIUtils.ShowMessage( "This is an info message\nwith two lines" ); + } + + if( Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Alpha2 ) + { + UIUtils.ShowMessage( "This is a warning message", MessageSeverity.Warning ); + } + + if( Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Alpha3 ) + { + + UIUtils.ShowMessage( "THIS IS AN ERROR MESSAGE!!", MessageSeverity.Error ); + } + } + } + + public void ClearMessages() + { + m_parentWindow.Messages.Clear(); + m_parentWindow.MaxMsgWidth = 100; + } + + public void Toggle() + { + + } + + public void Destroy() + { + m_parentWindow = null; + } + } +} |