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();
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |