ConsoleTabController.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. //#define SR_CONSOLE_DEBUG
  2. using System.Collections;
  3. namespace SRDebugger.UI.Tabs
  4. {
  5. using System;
  6. using Controls;
  7. using Internal;
  8. using Services;
  9. using SRF;
  10. using UnityEngine;
  11. using UnityEngine.UI;
  12. public class ConsoleTabController : SRMonoBehaviourEx
  13. {
  14. private const int MaxLength = 2600;
  15. private Canvas _consoleCanvas;
  16. private bool _isDirty;
  17. private static bool _hasWarnedAboutLogHandler;
  18. private static bool _hasWarnedAboutLoggingDisabled;
  19. [RequiredField]
  20. public ConsoleLogControl ConsoleLogControl;
  21. [RequiredField]
  22. public Toggle PinToggle;
  23. //public bool IsListening = true;
  24. [RequiredField]
  25. public ScrollRect StackTraceScrollRect;
  26. [RequiredField]
  27. public Text StackTraceText;
  28. [RequiredField]
  29. public Toggle ToggleErrors;
  30. [RequiredField]
  31. public Text ToggleErrorsText;
  32. [RequiredField]
  33. public Toggle ToggleInfo;
  34. [RequiredField]
  35. public Text ToggleInfoText;
  36. [RequiredField]
  37. public Toggle ToggleWarnings;
  38. [RequiredField]
  39. public Text ToggleWarningsText;
  40. [RequiredField]
  41. public GameObject CopyToClipboardContainer;
  42. [RequiredField]
  43. public GameObject CopyToClipboardButton;
  44. [RequiredField]
  45. public GameObject CopyToClipboardMessage;
  46. [RequiredField]
  47. public CanvasGroup CopyToClipboardMessageCanvasGroup;
  48. [RequiredField]
  49. public GameObject LoggingIsDisabledCanvasGroup;
  50. [RequiredField]
  51. public GameObject LogHandlerHasBeenOverridenGroup;
  52. [RequiredField]
  53. public Toggle FilterToggle;
  54. [RequiredField]
  55. public InputField FilterField;
  56. [RequiredField]
  57. public GameObject FilterBarContainer;
  58. private ConsoleEntry _selectedItem;
  59. private Coroutine _fadeButtonCoroutine;
  60. protected override void Start()
  61. {
  62. base.Start();
  63. _consoleCanvas = GetComponent<Canvas>();
  64. ToggleErrors.onValueChanged.AddListener(isOn => _isDirty = true);
  65. ToggleWarnings.onValueChanged.AddListener(isOn => _isDirty = true);
  66. ToggleInfo.onValueChanged.AddListener(isOn => _isDirty = true);
  67. PinToggle.onValueChanged.AddListener(PinToggleValueChanged);
  68. FilterToggle.onValueChanged.AddListener(FilterToggleValueChanged);
  69. FilterBarContainer.SetActive(FilterToggle.isOn);
  70. #if UNITY_5_3_OR_NEWER
  71. FilterField.onValueChanged.AddListener(FilterValueChanged);
  72. #else
  73. FilterField.onValueChange.AddListener(FilterValueChanged);
  74. #endif
  75. ConsoleLogControl.SelectedItemChanged = ConsoleLogSelectedItemChanged;
  76. Service.Console.Updated += ConsoleOnUpdated;
  77. Service.Panel.VisibilityChanged += PanelOnVisibilityChanged;
  78. StackTraceText.supportRichText = Settings.Instance.RichTextInConsole;
  79. PopulateStackTraceArea(null);
  80. Refresh();
  81. }
  82. private void FilterToggleValueChanged(bool isOn)
  83. {
  84. if (isOn)
  85. {
  86. FilterBarContainer.SetActive(true);
  87. ConsoleLogControl.Filter = FilterField.text;
  88. }
  89. else
  90. {
  91. ConsoleLogControl.Filter = null;
  92. FilterBarContainer.SetActive(false);
  93. }
  94. }
  95. private void FilterValueChanged(string filterText)
  96. {
  97. if (FilterToggle.isOn && !string.IsNullOrEmpty(filterText) && filterText.Trim().Length != 0)
  98. {
  99. ConsoleLogControl.Filter = filterText;
  100. }
  101. else
  102. {
  103. ConsoleLogControl.Filter = null;
  104. }
  105. }
  106. private void PanelOnVisibilityChanged(IDebugPanelService debugPanelService, bool b)
  107. {
  108. if (_consoleCanvas == null)
  109. {
  110. return;
  111. }
  112. if (b)
  113. {
  114. _consoleCanvas.enabled = true;
  115. }
  116. else
  117. {
  118. _consoleCanvas.enabled = false;
  119. StopAnimations();
  120. }
  121. }
  122. private void PinToggleValueChanged(bool isOn)
  123. {
  124. Service.DockConsole.IsVisible = isOn;
  125. }
  126. protected override void OnDestroy()
  127. {
  128. StopAnimations();
  129. if (Service.Console != null)
  130. {
  131. Service.Console.Updated -= ConsoleOnUpdated;
  132. }
  133. base.OnDestroy();
  134. }
  135. protected override void OnEnable()
  136. {
  137. base.OnEnable();
  138. _isDirty = true;
  139. }
  140. protected override void OnDisable()
  141. {
  142. base.OnDisable();
  143. StopAnimations();
  144. }
  145. private void ConsoleLogSelectedItemChanged(object item)
  146. {
  147. var log = item as ConsoleEntry;
  148. PopulateStackTraceArea(log);
  149. }
  150. protected override void Update()
  151. {
  152. base.Update();
  153. if (_isDirty)
  154. {
  155. Refresh();
  156. }
  157. }
  158. private void PopulateStackTraceArea(ConsoleEntry entry)
  159. {
  160. if (entry == null)
  161. {
  162. SetCopyToClipboardButtonState(CopyToClipboardStates.Hidden);
  163. StackTraceText.text = "";
  164. }
  165. else
  166. {
  167. if (SRDebug.CopyConsoleItemCallback != null)
  168. {
  169. SetCopyToClipboardButtonState(CopyToClipboardStates.Visible);
  170. }
  171. var text = entry.Message + Environment.NewLine +
  172. (!string.IsNullOrEmpty(entry.StackTrace)
  173. ? entry.StackTrace
  174. : SRDebugStrings.Current.Console_NoStackTrace);
  175. if (text.Length > MaxLength)
  176. {
  177. text = text.Substring(0, MaxLength);
  178. text += "\n" + SRDebugStrings.Current.Console_MessageTruncated;
  179. }
  180. StackTraceText.text = text;
  181. }
  182. StackTraceScrollRect.normalizedPosition = new Vector2(0, 1);
  183. _selectedItem = entry;
  184. }
  185. public void CopyToClipboard()
  186. {
  187. if (_selectedItem != null)
  188. {
  189. SetCopyToClipboardButtonState(CopyToClipboardStates.Activated);
  190. if (SRDebug.CopyConsoleItemCallback != null)
  191. {
  192. SRDebug.CopyConsoleItemCallback(_selectedItem);
  193. }
  194. else
  195. {
  196. Debug.LogError("[SRDebugger] Copy to clipboard is not available.");
  197. }
  198. }
  199. }
  200. public enum CopyToClipboardStates
  201. {
  202. Hidden,
  203. Visible,
  204. Activated
  205. }
  206. void SetCopyToClipboardButtonState(CopyToClipboardStates state)
  207. {
  208. StopAnimations();
  209. switch (state)
  210. {
  211. case CopyToClipboardStates.Hidden:
  212. CopyToClipboardContainer.SetActive(false);
  213. CopyToClipboardButton.SetActive(false);
  214. CopyToClipboardMessage.SetActive(false);
  215. break;
  216. case CopyToClipboardStates.Visible:
  217. CopyToClipboardContainer.SetActive(true);
  218. CopyToClipboardButton.SetActive(true);
  219. CopyToClipboardMessage.SetActive(false);
  220. break;
  221. case CopyToClipboardStates.Activated:
  222. CopyToClipboardMessageCanvasGroup.alpha = 1;
  223. CopyToClipboardContainer.SetActive(true);
  224. CopyToClipboardButton.SetActive(false);
  225. CopyToClipboardMessage.SetActive(true);
  226. _fadeButtonCoroutine = StartCoroutine(FadeCopyButton());
  227. break;
  228. default:
  229. throw new ArgumentOutOfRangeException("state", state, null);
  230. }
  231. }
  232. IEnumerator FadeCopyButton()
  233. {
  234. yield return new WaitForSecondsRealtime(2f);
  235. float startTime = Time.realtimeSinceStartup;
  236. float endTime = Time.realtimeSinceStartup + 1f;
  237. while (Time.realtimeSinceStartup < endTime)
  238. {
  239. float currentAlpha = Mathf.InverseLerp(endTime, startTime, Time.realtimeSinceStartup);
  240. CopyToClipboardMessageCanvasGroup.alpha = currentAlpha;
  241. yield return new WaitForEndOfFrame();
  242. }
  243. CopyToClipboardMessageCanvasGroup.alpha = 0;
  244. _fadeButtonCoroutine = null;
  245. }
  246. void StopAnimations()
  247. {
  248. if (_fadeButtonCoroutine != null)
  249. {
  250. StopCoroutine(_fadeButtonCoroutine);
  251. _fadeButtonCoroutine = null;
  252. CopyToClipboardMessageCanvasGroup.alpha = 0;
  253. }
  254. }
  255. private void Refresh()
  256. {
  257. // Update total counts labels
  258. ToggleInfoText.text = SRDebuggerUtil.GetNumberString(Service.Console.InfoCount, 999, "999+");
  259. ToggleWarningsText.text = SRDebuggerUtil.GetNumberString(Service.Console.WarningCount, 999, "999+");
  260. ToggleErrorsText.text = SRDebuggerUtil.GetNumberString(Service.Console.ErrorCount, 999, "999+");
  261. ConsoleLogControl.ShowErrors = ToggleErrors.isOn;
  262. ConsoleLogControl.ShowWarnings = ToggleWarnings.isOn;
  263. ConsoleLogControl.ShowInfo = ToggleInfo.isOn;
  264. PinToggle.isOn = Service.DockConsole.IsVisible;
  265. _isDirty = false;
  266. if (!_hasWarnedAboutLogHandler && Service.Console.LogHandlerIsOverriden)
  267. {
  268. LogHandlerHasBeenOverridenGroup.SetActive(true);
  269. _hasWarnedAboutLogHandler = true;
  270. }
  271. if (!_hasWarnedAboutLoggingDisabled && !Service.Console.LoggingEnabled)
  272. {
  273. LoggingIsDisabledCanvasGroup.SetActive(true);
  274. }
  275. }
  276. private void ConsoleOnUpdated(IConsoleService console)
  277. {
  278. _isDirty = true;
  279. }
  280. public void Clear()
  281. {
  282. Service.Console.Clear();
  283. _isDirty = true;
  284. }
  285. public void LogHandlerHasBeenOverridenOkayButtonPress()
  286. {
  287. _hasWarnedAboutLogHandler = true;
  288. LogHandlerHasBeenOverridenGroup.SetActive(false);
  289. }
  290. public void LoggingDisableCloseAndIgnorePressed()
  291. {
  292. LoggingIsDisabledCanvasGroup.SetActive(false);
  293. _hasWarnedAboutLoggingDisabled = true;
  294. }
  295. public void LoggingDisableReenablePressed()
  296. {
  297. Service.Console.LoggingEnabled = true;
  298. LoggingIsDisabledCanvasGroup.SetActive(false);
  299. Debug.Log("[SRDebugger] Re-enabled logging.");
  300. }
  301. }
  302. }