197 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C#
		
	
	
	
| 
 | |
| #pragma warning disable 169
 | |
| #pragma warning disable 649
 | |
| 
 | |
| namespace SRDebugger.UI.Controls
 | |
| {
 | |
|     using System;
 | |
|     using System.Collections;
 | |
|     using Internal;
 | |
|     using Services;
 | |
|     using SRF;
 | |
|     using SRF.UI.Layout;
 | |
|     using UnityEngine;
 | |
|     using UnityEngine.UI;
 | |
| 
 | |
|     public class ConsoleLogControl : SRMonoBehaviourEx
 | |
|     {
 | |
|         [RequiredField] [SerializeField] private VirtualVerticalLayoutGroup _consoleScrollLayoutGroup;
 | |
| 
 | |
|         [RequiredField] [SerializeField] private ScrollRect _consoleScrollRect;
 | |
| 
 | |
|         private bool _isDirty;
 | |
|         private Vector2? _scrollPosition;
 | |
|         private bool _showErrors = true;
 | |
|         private bool _showInfo = true;
 | |
|         private bool _showWarnings = true;
 | |
|         public Action<ConsoleEntry> SelectedItemChanged;
 | |
|         private string _filter;
 | |
| 
 | |
|         public bool ShowErrors
 | |
|         {
 | |
|             get { return _showErrors; }
 | |
|             set
 | |
|             {
 | |
|                 _showErrors = value;
 | |
|                 SetIsDirty();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public bool ShowWarnings
 | |
|         {
 | |
|             get { return _showWarnings; }
 | |
|             set
 | |
|             {
 | |
|                 _showWarnings = value;
 | |
|                 SetIsDirty();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public bool ShowInfo
 | |
|         {
 | |
|             get { return _showInfo; }
 | |
|             set
 | |
|             {
 | |
|                 _showInfo = value;
 | |
|                 SetIsDirty();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public bool EnableSelection
 | |
|         {
 | |
|             get { return _consoleScrollLayoutGroup.EnableSelection; }
 | |
|             set { _consoleScrollLayoutGroup.EnableSelection = value; }
 | |
|         }
 | |
| 
 | |
|         public string Filter
 | |
|         {
 | |
|             get { return _filter; }
 | |
|             set {
 | |
|                 if (_filter != value)
 | |
|                 {
 | |
|                     _filter = value;
 | |
|                     _isDirty = true;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         protected override void Awake()
 | |
|         {
 | |
|             base.Awake();
 | |
| 
 | |
|             _consoleScrollLayoutGroup.SelectedItemChanged.AddListener(OnSelectedItemChanged);
 | |
|             Service.Console.Updated += ConsoleOnUpdated;
 | |
|         }
 | |
| 
 | |
|         protected override void Start()
 | |
|         {
 | |
|             base.Start();
 | |
|             SetIsDirty();
 | |
|             StartCoroutine(ScrollToBottom());
 | |
|         }
 | |
| 
 | |
|         IEnumerator ScrollToBottom()
 | |
|         {
 | |
|             yield return new WaitForEndOfFrame();
 | |
|             yield return new WaitForEndOfFrame();
 | |
|             yield return new WaitForEndOfFrame();
 | |
|             _scrollPosition = new Vector2(0,0);
 | |
|         }
 | |
| 
 | |
|         protected override void OnDestroy()
 | |
|         {
 | |
|             if (Service.Console != null)
 | |
|             {
 | |
|                 Service.Console.Updated -= ConsoleOnUpdated;
 | |
|             }
 | |
| 
 | |
|             base.OnDestroy();
 | |
|         }
 | |
| 
 | |
|         private void OnSelectedItemChanged(object arg0)
 | |
|         {
 | |
|             var entry = arg0 as ConsoleEntry;
 | |
| 
 | |
|             if (SelectedItemChanged != null)
 | |
|             {
 | |
|                 SelectedItemChanged(entry);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         protected override void Update()
 | |
|         {
 | |
|             base.Update();
 | |
| 
 | |
|             if (_scrollPosition.HasValue)
 | |
|             {
 | |
|                 _consoleScrollRect.normalizedPosition = _scrollPosition.Value;
 | |
|                 _scrollPosition = null;
 | |
|             }
 | |
| 
 | |
|             if (_isDirty)
 | |
|             {
 | |
|                 Refresh();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void Refresh()
 | |
|         {
 | |
|             if (_consoleScrollRect.normalizedPosition.y.ApproxZero())
 | |
|             {
 | |
|                 _scrollPosition = _consoleScrollRect.normalizedPosition;
 | |
|             }
 | |
| 
 | |
|             _consoleScrollLayoutGroup.ClearItems();
 | |
| 
 | |
|             var entries = Service.Console.Entries;
 | |
| 
 | |
|             for (var i = 0; i < entries.Count; i++)
 | |
|             {
 | |
|                 var e = entries[i];
 | |
| 
 | |
|                 if ((e.LogType == LogType.Error || e.LogType == LogType.Exception || e.LogType == LogType.Assert) &&
 | |
|                     !ShowErrors)
 | |
|                 {
 | |
|                     if (e == _consoleScrollLayoutGroup.SelectedItem) _consoleScrollLayoutGroup.SelectedItem = null;
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 if (e.LogType == LogType.Warning && !ShowWarnings)
 | |
|                 {
 | |
|                     if (e == _consoleScrollLayoutGroup.SelectedItem) _consoleScrollLayoutGroup.SelectedItem = null;
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 if (e.LogType == LogType.Log && !ShowInfo)
 | |
|                 {
 | |
|                     if (e == _consoleScrollLayoutGroup.SelectedItem) _consoleScrollLayoutGroup.SelectedItem = null;
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 if (!string.IsNullOrEmpty(Filter))
 | |
|                 {
 | |
|                     if (e.Message.IndexOf(Filter, StringComparison.OrdinalIgnoreCase) < 0)
 | |
|                     {
 | |
|                         if (e == _consoleScrollLayoutGroup.SelectedItem) _consoleScrollLayoutGroup.SelectedItem = null;
 | |
|                         continue;
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 _consoleScrollLayoutGroup.AddItem(e);
 | |
|             }
 | |
| 
 | |
|             _isDirty = false;
 | |
|         }
 | |
| 
 | |
|         private void SetIsDirty()
 | |
|         {
 | |
|             _isDirty = true;
 | |
|         }
 | |
| 
 | |
|         private void ConsoleOnUpdated(IConsoleService console)
 | |
|         {
 | |
|             SetIsDirty();
 | |
|         }
 | |
|     }
 | |
| }
 |