You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/3rd/StompyRobot/SRDebugger/Scripts/UI/Tabs/ConsoleTabController.cs

372 lines
11 KiB
C#

3 months ago
//#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<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;
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.");
}
}
}