| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 | // 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 = 500;		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( UIUtils.ConsoleLogLabel.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 )						{							if( Event.current.control && Event.current.shift )							{								if( GUILayout.Button( ( count - i ) + ": " + messages[ i ].ItemMessage, labelStyle ) )								{									if( Event.current.button == 1 )									{										EditorGUIUtility.systemCopyBuffer = messages[ i ].ItemMessage;									}								}							}							else							{								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 = MAXWIDTH;		}		public void Toggle()		{					}		public void Destroy()		{			m_parentWindow = null;		}	}}
 |