// 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 );
|
|
if( Event.current.button == 1 )
|
|
{
|
|
EditorGUIUtility.systemCopyBuffer = messages[ i ].ItemMessage;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
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 );
|
|
if( Event.current.button == 1 )
|
|
{
|
|
EditorGUIUtility.systemCopyBuffer = messages[ i ].ItemMessage;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//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;
|
|
}
|
|
}
|
|
}
|