//#define SR_CONSOLE_DEBUG using System.Collections; 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; private static bool _hasWarnedAboutLogHandler; private static bool _hasWarnedAboutLoggingDisabled; [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 GameObject CopyToClipboardContainer; [RequiredField] public GameObject CopyToClipboardButton; [RequiredField] public GameObject CopyToClipboardMessage; [RequiredField] public CanvasGroup CopyToClipboardMessageCanvasGroup; [RequiredField] public GameObject LoggingIsDisabledCanvasGroup; [RequiredField] public GameObject LogHandlerHasBeenOverridenGroup; [RequiredField] public Toggle FilterToggle; [RequiredField] public InputField FilterField; [RequiredField] public GameObject FilterBarContainer; private ConsoleEntry _selectedItem; private Coroutine _fadeButtonCoroutine; protected override void Start() { base.Start(); _consoleCanvas = GetComponent(); 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; StopAnimations(); } } private void PinToggleValueChanged(bool isOn) { Service.DockConsole.IsVisible = isOn; } protected override void OnDestroy() { StopAnimations(); if (Service.Console != null) { Service.Console.Updated -= ConsoleOnUpdated; } base.OnDestroy(); } protected override void OnEnable() { base.OnEnable(); _isDirty = true; } protected override void OnDisable() { base.OnDisable(); StopAnimations(); } 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) { SetCopyToClipboardButtonState(CopyToClipboardStates.Hidden); StackTraceText.text = ""; } else { if (SRDebug.CopyConsoleItemCallback != null) { SetCopyToClipboardButtonState(CopyToClipboardStates.Visible); } 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); _selectedItem = entry; } public void CopyToClipboard() { if (_selectedItem != null) { SetCopyToClipboardButtonState(CopyToClipboardStates.Activated); if (SRDebug.CopyConsoleItemCallback != null) { SRDebug.CopyConsoleItemCallback(_selectedItem); } else { Debug.LogError("[SRDebugger] Copy to clipboard is not available."); } } } public enum CopyToClipboardStates { Hidden, Visible, Activated } void SetCopyToClipboardButtonState(CopyToClipboardStates state) { StopAnimations(); switch (state) { case CopyToClipboardStates.Hidden: CopyToClipboardContainer.SetActive(false); CopyToClipboardButton.SetActive(false); CopyToClipboardMessage.SetActive(false); break; case CopyToClipboardStates.Visible: CopyToClipboardContainer.SetActive(true); CopyToClipboardButton.SetActive(true); CopyToClipboardMessage.SetActive(false); break; case CopyToClipboardStates.Activated: CopyToClipboardMessageCanvasGroup.alpha = 1; CopyToClipboardContainer.SetActive(true); CopyToClipboardButton.SetActive(false); CopyToClipboardMessage.SetActive(true); _fadeButtonCoroutine = StartCoroutine(FadeCopyButton()); break; default: throw new ArgumentOutOfRangeException("state", state, null); } } IEnumerator FadeCopyButton() { yield return new WaitForSecondsRealtime(2f); float startTime = Time.realtimeSinceStartup; float endTime = Time.realtimeSinceStartup + 1f; while (Time.realtimeSinceStartup < endTime) { float currentAlpha = Mathf.InverseLerp(endTime, startTime, Time.realtimeSinceStartup); CopyToClipboardMessageCanvasGroup.alpha = currentAlpha; yield return new WaitForEndOfFrame(); } CopyToClipboardMessageCanvasGroup.alpha = 0; _fadeButtonCoroutine = null; } void StopAnimations() { if (_fadeButtonCoroutine != null) { StopCoroutine(_fadeButtonCoroutine); _fadeButtonCoroutine = null; CopyToClipboardMessageCanvasGroup.alpha = 0; } } 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; if (!_hasWarnedAboutLogHandler && Service.Console.LogHandlerIsOverriden) { LogHandlerHasBeenOverridenGroup.SetActive(true); _hasWarnedAboutLogHandler = true; } if (!_hasWarnedAboutLoggingDisabled && !Service.Console.LoggingEnabled) { LoggingIsDisabledCanvasGroup.SetActive(true); } } private void ConsoleOnUpdated(IConsoleService console) { _isDirty = true; } public void Clear() { Service.Console.Clear(); _isDirty = true; } public void LogHandlerHasBeenOverridenOkayButtonPress() { _hasWarnedAboutLogHandler = true; LogHandlerHasBeenOverridenGroup.SetActive(false); } public void LoggingDisableCloseAndIgnorePressed() { LoggingIsDisabledCanvasGroup.SetActive(false); _hasWarnedAboutLoggingDisabled = true; } public void LoggingDisableReenablePressed() { Service.Console.LoggingEnabled = true; LoggingIsDisabledCanvasGroup.SetActive(false); Debug.Log("[SRDebugger] Re-enabled logging."); } } }