217 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			217 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C#
		
	
	
	
| 
								 | 
							
								//#define SR_CONSOLE_DEBUG
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace SRDebugger.UI.Tabs
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    using System;
							 | 
						|||
| 
								 | 
							
								    using Controls;
							 | 
						|||
| 
								 | 
							
								    using Internal;
							 | 
						|||
| 
								 | 
							
								    using Services;
							 | 
						|||
| 
								 | 
							
								    using SRF;
							 | 
						|||
| 
								 | 
							
								    using UnityEngine;
							 | 
						|||
| 
								 | 
							
								    using UnityEngine.UI;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    public class ConsoleTabController : SRMonoBehaviourEx
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        private const int MaxLength = 2600;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private Canvas _consoleCanvas;
							 | 
						|||
| 
								 | 
							
								        private bool _isDirty;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        [RequiredField]
							 | 
						|||
| 
								 | 
							
								        public ConsoleLogControl ConsoleLogControl;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        [RequiredField]
							 | 
						|||
| 
								 | 
							
								        public Toggle PinToggle;
							 | 
						|||
| 
								 | 
							
								        //public bool IsListening = true;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        [RequiredField]
							 | 
						|||
| 
								 | 
							
								        public ScrollRect StackTraceScrollRect;
							 | 
						|||
| 
								 | 
							
								        [RequiredField]
							 | 
						|||
| 
								 | 
							
								        public Text StackTraceText;
							 | 
						|||
| 
								 | 
							
								        [RequiredField]
							 | 
						|||
| 
								 | 
							
								        public Toggle ToggleErrors;
							 | 
						|||
| 
								 | 
							
								        [RequiredField]
							 | 
						|||
| 
								 | 
							
								        public Text ToggleErrorsText;
							 | 
						|||
| 
								 | 
							
								        [RequiredField]
							 | 
						|||
| 
								 | 
							
								        public Toggle ToggleInfo;
							 | 
						|||
| 
								 | 
							
								        [RequiredField]
							 | 
						|||
| 
								 | 
							
								        public Text ToggleInfoText;
							 | 
						|||
| 
								 | 
							
								        [RequiredField]
							 | 
						|||
| 
								 | 
							
								        public Toggle ToggleWarnings;
							 | 
						|||
| 
								 | 
							
								        [RequiredField]
							 | 
						|||
| 
								 | 
							
								        public Text ToggleWarningsText;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        [RequiredField]
							 | 
						|||
| 
								 | 
							
								        public Toggle FilterToggle;
							 | 
						|||
| 
								 | 
							
								        [RequiredField]
							 | 
						|||
| 
								 | 
							
								        public InputField FilterField;
							 | 
						|||
| 
								 | 
							
								        [RequiredField]
							 | 
						|||
| 
								 | 
							
								        public GameObject FilterBarContainer;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        protected override void Start()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            base.Start();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            _consoleCanvas = GetComponent<Canvas>();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            ToggleErrors.onValueChanged.AddListener(isOn => _isDirty = true);
							 | 
						|||
| 
								 | 
							
								            ToggleWarnings.onValueChanged.AddListener(isOn => _isDirty = true);
							 | 
						|||
| 
								 | 
							
								            ToggleInfo.onValueChanged.AddListener(isOn => _isDirty = true);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            PinToggle.onValueChanged.AddListener(PinToggleValueChanged);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            FilterToggle.onValueChanged.AddListener(FilterToggleValueChanged);
							 | 
						|||
| 
								 | 
							
								            FilterBarContainer.SetActive(FilterToggle.isOn);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#if UNITY_5_3_OR_NEWER
							 | 
						|||
| 
								 | 
							
								            FilterField.onValueChanged.AddListener(FilterValueChanged);
							 | 
						|||
| 
								 | 
							
								#else
							 | 
						|||
| 
								 | 
							
								            FilterField.onValueChange.AddListener(FilterValueChanged);
							 | 
						|||
| 
								 | 
							
								#endif
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            ConsoleLogControl.SelectedItemChanged = ConsoleLogSelectedItemChanged;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            Service.Console.Updated += ConsoleOnUpdated;
							 | 
						|||
| 
								 | 
							
								            Service.Panel.VisibilityChanged += PanelOnVisibilityChanged;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            StackTraceText.supportRichText = Settings.Instance.RichTextInConsole;
							 | 
						|||
| 
								 | 
							
								            PopulateStackTraceArea(null);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            Refresh();
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private void FilterToggleValueChanged(bool isOn)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (isOn)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                FilterBarContainer.SetActive(true);
							 | 
						|||
| 
								 | 
							
								                ConsoleLogControl.Filter = FilterField.text;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            else
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                ConsoleLogControl.Filter = null;
							 | 
						|||
| 
								 | 
							
								                FilterBarContainer.SetActive(false);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        private void FilterValueChanged(string filterText)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (FilterToggle.isOn && !string.IsNullOrEmpty(filterText) && filterText.Trim().Length != 0)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                ConsoleLogControl.Filter = filterText;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            else
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                ConsoleLogControl.Filter = null;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private void PanelOnVisibilityChanged(IDebugPanelService debugPanelService, bool b)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (_consoleCanvas == null)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                return;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            if (b)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _consoleCanvas.enabled = true;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            else
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _consoleCanvas.enabled = false;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private void PinToggleValueChanged(bool isOn)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            Service.DockConsole.IsVisible = isOn;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        protected override void OnDestroy()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (Service.Console != null)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                Service.Console.Updated -= ConsoleOnUpdated;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            base.OnDestroy();
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        protected override void OnEnable()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            base.OnEnable();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            _isDirty = true;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private void ConsoleLogSelectedItemChanged(object item)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var log = item as ConsoleEntry;
							 | 
						|||
| 
								 | 
							
								            PopulateStackTraceArea(log);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        protected override void Update()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            base.Update();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            if (_isDirty)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                Refresh();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private void PopulateStackTraceArea(ConsoleEntry entry)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (entry == null)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                StackTraceText.text = "";
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            else
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                var text = entry.Message + Environment.NewLine +
							 | 
						|||
| 
								 | 
							
								                           (!string.IsNullOrEmpty(entry.StackTrace)
							 | 
						|||
| 
								 | 
							
								                               ? entry.StackTrace
							 | 
						|||
| 
								 | 
							
								                               : SRDebugStrings.Current.Console_NoStackTrace);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                if (text.Length > MaxLength)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    text = text.Substring(0, MaxLength);
							 | 
						|||
| 
								 | 
							
								                    text += "\n" + SRDebugStrings.Current.Console_MessageTruncated;
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                StackTraceText.text = text;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            StackTraceScrollRect.normalizedPosition = new Vector2(0, 1);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private void Refresh()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            // Update total counts labels
							 | 
						|||
| 
								 | 
							
								            ToggleInfoText.text = SRDebuggerUtil.GetNumberString(Service.Console.InfoCount, 999, "999+");
							 | 
						|||
| 
								 | 
							
								            ToggleWarningsText.text = SRDebuggerUtil.GetNumberString(Service.Console.WarningCount, 999, "999+");
							 | 
						|||
| 
								 | 
							
								            ToggleErrorsText.text = SRDebuggerUtil.GetNumberString(Service.Console.ErrorCount, 999, "999+");
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            ConsoleLogControl.ShowErrors = ToggleErrors.isOn;
							 | 
						|||
| 
								 | 
							
								            ConsoleLogControl.ShowWarnings = ToggleWarnings.isOn;
							 | 
						|||
| 
								 | 
							
								            ConsoleLogControl.ShowInfo = ToggleInfo.isOn;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            PinToggle.isOn = Service.DockConsole.IsVisible;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            _isDirty = false;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private void ConsoleOnUpdated(IConsoleService console)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            _isDirty = true;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public void Clear()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            Service.Console.Clear();
							 | 
						|||
| 
								 | 
							
								            _isDirty = true;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |