870 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			870 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C#
		
	
	
	
| namespace SRDebugger.Editor
 | |
| {
 | |
|     using System;
 | |
|     using System.Collections;
 | |
|     using System.Collections.Generic;
 | |
|     using System.Globalization;
 | |
|     using System.Linq;
 | |
|     using SRDebugger.Internal;
 | |
|     using SRDebugger.Internal.Editor;
 | |
|     using SRF;
 | |
|     using UnityEditor;
 | |
|     using UnityEditorInternal;
 | |
|     using UnityEngine;
 | |
| 
 | |
|     public class SRDebuggerSettingsWindow : EditorWindow
 | |
|     {
 | |
|         private enum ProfilerAlignment
 | |
|         {
 | |
|             TopLeft = 0,
 | |
|             TopRight = 1,
 | |
|             BottomLeft = 2,
 | |
|             BottomRight = 3
 | |
|         }
 | |
| 
 | |
|         private enum OptionsAlignment
 | |
|         {
 | |
|             TopLeft = 0,
 | |
|             TopRight = 1,
 | |
|             BottomLeft = 2,
 | |
|             BottomRight = 3,
 | |
|             TopCenter = 6,
 | |
|             BottomCenter = 7
 | |
|         }
 | |
| 
 | |
|         private string _currentEntryCode;
 | |
|         private bool _enableTabChange = true;
 | |
|         private Tabs _selectedTab;
 | |
|         private bool _showBugReportSignupForm;
 | |
|         private string[] _tabs = Enum.GetNames(typeof (Tabs)).Select(s => s.Replace('_', ' ')).ToArray();
 | |
| 
 | |
|         [MenuItem("SRDebugger/OpenSetting")]
 | |
|         public static void OpenSettting()
 | |
|         {
 | |
|             Open();
 | |
|         }
 | |
| 
 | |
|         [MenuItem(SRDebugPaths.SettingsMenuItemPath)]
 | |
|         public static void Open()
 | |
|         {
 | |
|             GetWindowWithRect<SRDebuggerSettingsWindow>(new Rect(0, 0, 449, 520), true, "SRDebugger - Settings", true);
 | |
|         }
 | |
| 
 | |
|         private void OnEnable()
 | |
|         {
 | |
|             _currentEntryCode = GetEntryCodeString();
 | |
| 
 | |
|             if (string.IsNullOrEmpty(Settings.Instance.ApiKey))
 | |
|             {
 | |
|                 _showBugReportSignupForm = true;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void OnGUI()
 | |
|         {
 | |
|             // Draw header area 
 | |
|             SRDebugEditorUtil.BeginDrawBackground();
 | |
|             SRDebugEditorUtil.DrawLogo(SRDebugEditorUtil.GetLogo());
 | |
|             SRDebugEditorUtil.EndDrawBackground();
 | |
| 
 | |
|             // Draw header/content divider
 | |
|             EditorGUILayout.BeginVertical(SRDebugEditorUtil.Styles.SettingsHeaderBoxStyle);
 | |
|             EditorGUILayout.EndVertical();
 | |
| 
 | |
|             // Draw tab buttons
 | |
|             var rect = EditorGUILayout.BeginVertical(GUI.skin.box);
 | |
| 
 | |
|             --rect.width;
 | |
|             var height = 18;
 | |
| 
 | |
|             EditorGUI.BeginChangeCheck();
 | |
|             EditorGUI.BeginDisabledGroup(!_enableTabChange);
 | |
| 
 | |
|             for (var i = 0; i < _tabs.Length; ++i)
 | |
|             {
 | |
|                 var xStart = Mathf.RoundToInt(i*rect.width/_tabs.Length);
 | |
|                 var xEnd = Mathf.RoundToInt((i + 1)*rect.width/_tabs.Length);
 | |
| 
 | |
|                 var pos = new Rect(rect.x + xStart, rect.y, xEnd - xStart, height);
 | |
| 
 | |
|                 if (GUI.Toggle(pos, (int) _selectedTab == i, new GUIContent(_tabs[i]), EditorStyles.toolbarButton))
 | |
|                 {
 | |
|                     _selectedTab = (Tabs) i;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             GUILayoutUtility.GetRect(10f, height);
 | |
| 
 | |
|             EditorGUI.EndDisabledGroup();
 | |
| 
 | |
|             if (EditorGUI.EndChangeCheck())
 | |
|             {
 | |
|                 _scrollPosition = Vector2.zero;
 | |
|                 GUIUtility.keyboardControl = 0;
 | |
|             }
 | |
| 
 | |
|             // Draw selected tab
 | |
| 
 | |
|             switch (_selectedTab)
 | |
|             {
 | |
|                 case Tabs.General:
 | |
|                     DrawTabGeneral();
 | |
|                     break;
 | |
| 
 | |
|                 case Tabs.Layout:
 | |
|                     DrawTabLayout();
 | |
|                     break;
 | |
| 
 | |
|                 case Tabs.Bug_Reporter:
 | |
|                     DrawTabBugReporter();
 | |
|                     break;
 | |
| 
 | |
|                 case Tabs.Shortcuts:
 | |
|                     DrawTabShortcuts();
 | |
|                     break;
 | |
| 
 | |
|                 case Tabs.Advanced:
 | |
|                     DrawTabAdvanced();
 | |
|                     break;
 | |
|             }
 | |
| 
 | |
|             EditorGUILayout.EndVertical();
 | |
| 
 | |
|             // Display rating prompt and link buttons
 | |
| 
 | |
|             EditorGUILayout.LabelField(SRDebugStrings.Current.SettingsRateBoxContents, EditorStyles.miniLabel);
 | |
| 
 | |
|             SRDebugEditorUtil.DrawFooterLayout(position.width);
 | |
| 
 | |
|             if (GUI.changed)
 | |
|             {
 | |
|                 EditorUtility.SetDirty(Settings.Instance);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private enum Tabs
 | |
|         {
 | |
|             General,
 | |
|             Layout,
 | |
|             Bug_Reporter,
 | |
|             Shortcuts,
 | |
|             Advanced
 | |
|         }
 | |
| 
 | |
|         #region Tabs
 | |
| 
 | |
|         private void DrawTabGeneral()
 | |
|         {
 | |
|             GUILayout.Label("Loading", SRDebugEditorUtil.Styles.InspectorHeaderStyle);
 | |
| 
 | |
|             EditorGUILayout.BeginVertical(EditorStyles.inspectorDefaultMargins);
 | |
| 
 | |
|             if (GUILayout.Toggle(!Settings.Instance.IsEnabled, "Disabled", SRDebugEditorUtil.Styles.RadioButton))
 | |
|             {
 | |
|                 Settings.Instance.IsEnabled = false;
 | |
|             }
 | |
| 
 | |
|             GUILayout.Label("Do not load SRDebugger until a manual call to <i>SRDebug.Init()</i>.",
 | |
|                 SRDebugEditorUtil.Styles.RadioButtonDescription);
 | |
| 
 | |
|             var msg = "Automatic (recommended)";
 | |
|             
 | |
|             if (GUILayout.Toggle(Settings.Instance.IsEnabled, msg,
 | |
|                 SRDebugEditorUtil.Styles.RadioButton))
 | |
|             {
 | |
|                 Settings.Instance.IsEnabled = true;
 | |
|             }
 | |
| 
 | |
|             GUILayout.Label("SRDebugger loads automatically when your game starts.",
 | |
|                 SRDebugEditorUtil.Styles.RadioButtonDescription);
 | |
| 
 | |
|             EditorGUILayout.EndVertical();
 | |
| 
 | |
|             GUILayout.Label("Panel Access", SRDebugEditorUtil.Styles.InspectorHeaderStyle);
 | |
| 
 | |
|             EditorGUILayout.HelpBox("Configure trigger location in the layout tab.", MessageType.None, true);
 | |
| 
 | |
|             Settings.Instance.EnableTrigger =
 | |
|                 (Settings.TriggerEnableModes)
 | |
|                     EditorGUILayout.EnumPopup(new GUIContent("Trigger Mode"),
 | |
|                         Settings.Instance.EnableTrigger);
 | |
| 
 | |
|             EditorGUI.BeginDisabledGroup(Settings.Instance.EnableTrigger == Settings.TriggerEnableModes.Off);
 | |
| 
 | |
|             Settings.Instance.TriggerBehaviour =
 | |
|                 (Settings.TriggerBehaviours)
 | |
|                     EditorGUILayout.EnumPopup(new GUIContent("Trigger Behaviour"),
 | |
|                         Settings.Instance.TriggerBehaviour);
 | |
| 
 | |
|             Settings.Instance.ErrorNotification =
 | |
|                 EditorGUILayout.Toggle(
 | |
|                     new GUIContent("Error Notification",
 | |
|                         "Display a notification on the panel trigger when an error is printed to the log."),
 | |
|                     Settings.Instance.ErrorNotification);
 | |
|             
 | |
|             EditorGUI.EndDisabledGroup();
 | |
| 
 | |
|             EditorGUILayout.Space();
 | |
| 
 | |
|             Settings.Instance.DefaultTab =
 | |
|                 (DefaultTabs)
 | |
|                     EditorGUILayout.EnumPopup(
 | |
|                         new GUIContent("Default Tab", SRDebugStrings.Current.SettingsDefaultTabTooltip),
 | |
|                         Settings.Instance.DefaultTab);
 | |
| 
 | |
|             EditorGUILayout.Space();
 | |
| 
 | |
|             EditorGUILayout.BeginHorizontal();
 | |
| 
 | |
|             Settings.Instance.RequireCode = EditorGUILayout.Toggle(new GUIContent("Require Entry Code"),
 | |
|                 Settings.Instance.RequireCode);
 | |
| 
 | |
|             EditorGUI.BeginDisabledGroup(!Settings.Instance.RequireCode);
 | |
| 
 | |
|             Settings.Instance.RequireEntryCodeEveryTime = EditorGUILayout.Toggle(new GUIContent("...Every Time", "Require the user to enter the PIN every time they access the debug panel."),
 | |
|                 Settings.Instance.RequireEntryCodeEveryTime);
 | |
| 
 | |
|             EditorGUILayout.EndHorizontal();
 | |
| 
 | |
|             var newCode = EditorGUILayout.TextField("Entry Code", _currentEntryCode);
 | |
| 
 | |
|             if (newCode != _currentEntryCode)
 | |
|             {
 | |
|                 // Strip out alpha numeric chars
 | |
|                 newCode = new string(newCode.Where(char.IsDigit).ToArray());
 | |
| 
 | |
|                 // Max length = 4
 | |
|                 newCode = newCode.Substring(0, Mathf.Min(4, newCode.Length));
 | |
| 
 | |
|                 if (newCode.Length == 4)
 | |
|                 {
 | |
|                     UpdateEntryCode(newCode);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             EditorGUI.EndDisabledGroup();
 | |
| 
 | |
|             EditorGUILayout.Space();
 | |
| 
 | |
|             Settings.Instance.AutomaticallyShowCursor =
 | |
|                 EditorGUILayout.Toggle(
 | |
|                     new GUIContent("Show Cursor",
 | |
|                         "Automatically set the cursor to visible when the debug panel is opened, and revert when closed."),
 | |
|                     Settings.Instance.AutomaticallyShowCursor);
 | |
| 
 | |
| 
 | |
| 
 | |
|             // Expand content area to fit all available space
 | |
|             GUILayout.FlexibleSpace();
 | |
|         }
 | |
| 
 | |
|         private void DrawTabLayout()
 | |
|         {
 | |
|             GUILayout.Label("Pinned Tool Positions", SRDebugEditorUtil.Styles.HeaderLabel);
 | |
| 
 | |
|             EditorGUILayout.BeginHorizontal();
 | |
|             GUILayout.FlexibleSpace();
 | |
|             var rect = GUILayoutUtility.GetRect(360, 210);
 | |
|             GUILayout.FlexibleSpace();
 | |
|             EditorGUILayout.EndHorizontal();
 | |
|             SRDebugEditorUtil.DrawLayoutPreview(rect);
 | |
| 
 | |
|             EditorGUILayout.BeginHorizontal();
 | |
| 
 | |
|             {
 | |
|                 EditorGUILayout.BeginVertical();
 | |
| 
 | |
|                 GUILayout.Label("Console", SRDebugEditorUtil.Styles.InspectorHeaderStyle);
 | |
| 
 | |
|                 Settings.Instance.ConsoleAlignment =
 | |
|                     (ConsoleAlignment) EditorGUILayout.EnumPopup(Settings.Instance.ConsoleAlignment);
 | |
| 
 | |
|                 EditorGUILayout.EndVertical();
 | |
|             }
 | |
| 
 | |
|             {
 | |
|                 EditorGUI.BeginDisabledGroup(Settings.Instance.EnableTrigger == Settings.TriggerEnableModes.Off);
 | |
| 
 | |
|                 EditorGUILayout.BeginVertical();
 | |
| 
 | |
|                 GUILayout.Label("Entry Trigger", SRDebugEditorUtil.Styles.InspectorHeaderStyle);
 | |
| 
 | |
|                 Settings.Instance.TriggerPosition =
 | |
|                     (PinAlignment) EditorGUILayout.EnumPopup(Settings.Instance.TriggerPosition);
 | |
| 
 | |
|                 EditorGUILayout.EndVertical();
 | |
| 
 | |
|                 EditorGUI.EndDisabledGroup();
 | |
|             }
 | |
| 
 | |
|             EditorGUILayout.EndHorizontal();
 | |
| 
 | |
|             EditorGUILayout.BeginHorizontal();
 | |
| 
 | |
|             {
 | |
|                 EditorGUILayout.BeginVertical();
 | |
| 
 | |
|                 GUILayout.Label("Profiler", SRDebugEditorUtil.Styles.InspectorHeaderStyle);
 | |
| 
 | |
|                 Settings.Instance.ProfilerAlignment =
 | |
|                     (PinAlignment) EditorGUILayout.EnumPopup((ProfilerAlignment)Settings.Instance.ProfilerAlignment);
 | |
| 
 | |
|                 EditorGUILayout.EndVertical();
 | |
|             }
 | |
| 
 | |
|             {
 | |
|                 EditorGUILayout.BeginVertical();
 | |
| 
 | |
|                 GUILayout.Label("Options", SRDebugEditorUtil.Styles.InspectorHeaderStyle);
 | |
| 
 | |
|                 Settings.Instance.OptionsAlignment =
 | |
|                     (PinAlignment) EditorGUILayout.EnumPopup((OptionsAlignment)Settings.Instance.OptionsAlignment);
 | |
| 
 | |
|                 EditorGUILayout.EndVertical();
 | |
|             }
 | |
| 
 | |
|             EditorGUILayout.EndHorizontal();
 | |
| 
 | |
|             // Expand content area to fit all available space
 | |
|             GUILayout.FlexibleSpace();
 | |
|         }
 | |
| 
 | |
|         private bool _enableButton;
 | |
| 
 | |
|         private void DrawTabBugReporter()
 | |
|         {
 | |
|             if (_showBugReportSignupForm)
 | |
|             {
 | |
|                 DrawBugReportSignupForm();
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             GUILayout.Label("Bug Reporter", SRDebugEditorUtil.Styles.HeaderLabel);
 | |
| 
 | |
|             EditorGUI.BeginDisabledGroup(string.IsNullOrEmpty(Settings.Instance.ApiKey));
 | |
| 
 | |
|             Settings.Instance.EnableBugReporter = EditorGUILayout.Toggle("Enable Bug Reporter",
 | |
|                 Settings.Instance.EnableBugReporter);
 | |
| 
 | |
|             EditorGUI.EndDisabledGroup();
 | |
| 
 | |
|             EditorGUILayout.BeginHorizontal();
 | |
| 
 | |
|             Settings.Instance.ApiKey = EditorGUILayout.TextField("API Key", Settings.Instance.ApiKey);
 | |
| 
 | |
|             if (GUILayout.Button("Verify", GUILayout.ExpandWidth(false)))
 | |
|             {
 | |
|                 EditorUtility.DisplayDialog("Verify API Key", ApiSignup.Verify(Settings.Instance.ApiKey), "OK");
 | |
|             }
 | |
| 
 | |
|             EditorGUILayout.EndHorizontal();
 | |
| 
 | |
|             EditorGUILayout.Space();
 | |
| 
 | |
|             GUILayout.Label(
 | |
|                 "If you need to change your account email address, or have any other questions or concerns, please email us at contact@stompyrobot.uk.",
 | |
|                 SRDebugEditorUtil.Styles.ParagraphLabel);
 | |
| 
 | |
|             GUILayout.FlexibleSpace();
 | |
| 
 | |
|             if (!string.IsNullOrEmpty(Settings.Instance.ApiKey))
 | |
|             {
 | |
|                 GUILayout.Label("Reset", SRDebugEditorUtil.Styles.InspectorHeaderStyle);
 | |
|                 GUILayout.Label("Click the button below to clear the API key and show the signup form.",
 | |
|                     SRDebugEditorUtil.Styles.ParagraphLabel);
 | |
| 
 | |
|                 EditorGUILayout.BeginHorizontal();
 | |
| 
 | |
|                 _enableButton = EditorGUILayout.Toggle("Enable Button", _enableButton, GUILayout.ExpandWidth(false));
 | |
| 
 | |
|                 EditorGUI.BeginDisabledGroup(!_enableButton);
 | |
| 
 | |
|                 if (GUILayout.Button("Reset"))
 | |
|                 {
 | |
|                     Settings.Instance.ApiKey = null;
 | |
|                     Settings.Instance.EnableBugReporter = false;
 | |
|                     _enableButton = false;
 | |
|                     _showBugReportSignupForm = true;
 | |
|                 }
 | |
| 
 | |
|                 EditorGUI.EndDisabledGroup();
 | |
| 
 | |
|                 EditorGUILayout.EndHorizontal();
 | |
| 
 | |
|                 EditorGUILayout.Space();
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 if (GUILayout.Button("Show Signup Form"))
 | |
|                 {
 | |
|                     _showBugReportSignupForm = true;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private string _invoiceNumber;
 | |
|         private string _emailAddress;
 | |
|         private bool _agreeLegal;
 | |
|         private string _errorMessage;
 | |
| 
 | |
|         private void DrawBugReportSignupForm()
 | |
|         {
 | |
|             var isWeb = false;
 | |
| 
 | |
| #if UNITY_WEBPLAYER
 | |
| 			EditorGUILayout.HelpBox("Signup form is not available when build target is Web Player.", MessageType.Error);
 | |
| 			isWeb = true;
 | |
| #endif
 | |
| 
 | |
|             EditorGUI.BeginDisabledGroup(isWeb || !_enableTabChange);
 | |
| 
 | |
|             GUILayout.Label("Signup Form", SRDebugEditorUtil.Styles.HeaderLabel);
 | |
|             GUILayout.Label(
 | |
|                 "SRDebugger requires a free API key to enable the bug reporter system. This form will acquire one for you.",
 | |
|                 SRDebugEditorUtil.Styles.ParagraphLabel);
 | |
| 
 | |
|             if (
 | |
|                 SRDebugEditorUtil.ClickableLabel(
 | |
|                     "Already got an API key? <color={0}>Click here</color>.".Fmt(SRDebugEditorUtil.Styles.LinkColour),
 | |
|                     SRDebugEditorUtil.Styles.RichTextLabel))
 | |
|             {
 | |
|                 _showBugReportSignupForm = false;
 | |
|                 Repaint();
 | |
|             }
 | |
| 
 | |
|             EditorGUILayout.Space();
 | |
| 
 | |
|             GUILayout.Label("Invoice/Order Number", EditorStyles.boldLabel);
 | |
| 
 | |
|             GUILayout.Label(
 | |
|                 "Enter the order number from your Asset Store purchase email.",
 | |
|                 EditorStyles.miniLabel);
 | |
| 
 | |
|             _invoiceNumber = EditorGUILayout.TextField(_invoiceNumber);
 | |
| 
 | |
|             EditorGUILayout.Space();
 | |
| 
 | |
|             GUILayout.Label("Email Address", EditorStyles.boldLabel);
 | |
| 
 | |
|             GUILayout.Label(
 | |
|                 "Provide an email address where the bug reports should be sent.",
 | |
|                 EditorStyles.miniLabel);
 | |
| 
 | |
|             _emailAddress = EditorGUILayout.TextField(_emailAddress);
 | |
| 
 | |
|             EditorGUILayout.Space();
 | |
| 
 | |
|             EditorGUILayout.BeginHorizontal();
 | |
| 
 | |
|             if (SRDebugEditorUtil.ClickableLabel(
 | |
|                 "I agree to the <color={0}>terms and conditions</color>.".Fmt(SRDebugEditorUtil.Styles.LinkColour),
 | |
|                 SRDebugEditorUtil.Styles.RichTextLabel))
 | |
|             {
 | |
|                 ApiSignupTermsWindow.Open();
 | |
|             }
 | |
| 
 | |
|             _agreeLegal = EditorGUILayout.Toggle(_agreeLegal);
 | |
| 
 | |
|             EditorGUILayout.EndHorizontal();
 | |
| 
 | |
|             EditorGUILayout.Space();
 | |
| 
 | |
|             var isEnabled = !string.IsNullOrEmpty(_invoiceNumber) && !string.IsNullOrEmpty(_emailAddress) && _agreeLegal;
 | |
|             EditorGUI.BeginDisabledGroup(!isEnabled);
 | |
| 
 | |
|             if (GUILayout.Button("Submit"))
 | |
|             {
 | |
|                 _errorMessage = null;
 | |
|                 _enableTabChange = false;
 | |
| 
 | |
|                 EditorApplication.delayCall += () =>
 | |
|                 {
 | |
|                     ApiSignup.SignUp(_emailAddress, _invoiceNumber, OnSignupResult);
 | |
|                     Repaint();
 | |
|                 };
 | |
|             }
 | |
| 
 | |
|             EditorGUI.EndDisabledGroup();
 | |
| 
 | |
|             if (!string.IsNullOrEmpty(_errorMessage))
 | |
|             {
 | |
|                 EditorGUILayout.HelpBox(_errorMessage, MessageType.Error, true);
 | |
|             }
 | |
| 
 | |
|             GUILayout.FlexibleSpace();
 | |
| 
 | |
|             GUILayout.Label("Having trouble? Please email contact@stompyrobot.uk for assistance.",
 | |
|                 EditorStyles.miniLabel);
 | |
| 
 | |
|             EditorGUI.EndDisabledGroup();
 | |
|         }
 | |
| 
 | |
|         private void OnSignupResult(bool didSucceed, string apiKey, string email, string error)
 | |
|         {
 | |
|             _enableTabChange = true;
 | |
|             _selectedTab = Tabs.Bug_Reporter;
 | |
| 
 | |
|             if (!didSucceed)
 | |
|             {
 | |
|                 _errorMessage = error;
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             Settings.Instance.ApiKey = apiKey;
 | |
|             Settings.Instance.EnableBugReporter = true;
 | |
| 
 | |
|             EditorUtility.DisplayDialog("SRDebugger API",
 | |
|                 "API key has been created successfully. An email has been sent to your email address ({0}) with a verification link. You must verify your email before you can receive any bug reports."
 | |
|                     .Fmt(email), "OK");
 | |
| 
 | |
|             _showBugReportSignupForm = false;
 | |
|         }
 | |
| 
 | |
|         private ReorderableList _keyboardShortcutList;
 | |
|         private Vector2 _scrollPosition;
 | |
| 
 | |
|         private void DrawTabShortcuts()
 | |
|         {
 | |
|             if (_keyboardShortcutList == null)
 | |
|             {
 | |
|                 _keyboardShortcutList = new ReorderableList((IList) Settings.Instance.KeyboardShortcuts,
 | |
|                     typeof (Settings.KeyboardShortcut), false, true, true, true);
 | |
|                 _keyboardShortcutList.drawHeaderCallback = DrawKeyboardListHeaderCallback;
 | |
|                 _keyboardShortcutList.drawElementCallback = DrawKeyboardListItemCallback;
 | |
|                 _keyboardShortcutList.onAddCallback += OnAddKeyboardListCallback;
 | |
|                 _keyboardShortcutList.onRemoveCallback += OnRemoveKeyboardListCallback;
 | |
|             }
 | |
| 
 | |
|             EditorGUILayout.Space();
 | |
| 
 | |
|             EditorGUILayout.BeginHorizontal();
 | |
| 
 | |
|             Settings.Instance.EnableKeyboardShortcuts = EditorGUILayout.Toggle(
 | |
|                 new GUIContent("Enable", SRDebugStrings.Current.SettingsKeyboardShortcutsTooltip),
 | |
|                 Settings.Instance.EnableKeyboardShortcuts);
 | |
| 
 | |
|             EditorGUI.BeginDisabledGroup(!Settings.Instance.EnableKeyboardShortcuts);
 | |
| 
 | |
|             Settings.Instance.KeyboardEscapeClose =
 | |
|                 EditorGUILayout.Toggle(
 | |
|                     new GUIContent("Close on Esc", SRDebugStrings.Current.SettingsCloseOnEscapeTooltip),
 | |
|                     Settings.Instance.KeyboardEscapeClose);
 | |
| 
 | |
|             EditorGUILayout.EndHorizontal();
 | |
| 
 | |
|             EditorGUILayout.Separator();
 | |
| 
 | |
|             var dupe = DetectDuplicateKeyboardShortcuts();
 | |
| 
 | |
|             if (dupe != null)
 | |
|             {
 | |
|                 var shortcut = "";
 | |
| 
 | |
|                 if (dupe.Control)
 | |
|                 {
 | |
|                     shortcut += "Ctrl";
 | |
|                 }
 | |
| 
 | |
|                 if (dupe.Shift)
 | |
|                 {
 | |
|                     if (shortcut.Length > 0)
 | |
|                     {
 | |
|                         shortcut += "-";
 | |
|                     }
 | |
| 
 | |
|                     shortcut += "Shift";
 | |
|                 }
 | |
| 
 | |
|                 if (dupe.Alt)
 | |
|                 {
 | |
|                     if (shortcut.Length > 0)
 | |
|                     {
 | |
|                         shortcut += "-";
 | |
|                     }
 | |
| 
 | |
|                     shortcut += "Alt";
 | |
|                 }
 | |
| 
 | |
|                 if (shortcut.Length > 0)
 | |
|                 {
 | |
|                     shortcut += "-";
 | |
|                 }
 | |
| 
 | |
|                 shortcut += dupe.Key;
 | |
| 
 | |
|                 EditorGUILayout.HelpBox(
 | |
|                     "Duplicate shortcut ({0}). Only one shortcut per key is supported.".Fmt(shortcut),
 | |
|                     MessageType.Warning);
 | |
|             }
 | |
| 
 | |
|             _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition, false, false,
 | |
|                 GUILayout.Width(position.width - 11));
 | |
| 
 | |
|             EditorGUILayout.BeginVertical(GUILayout.Width(position.width - 30));
 | |
| 
 | |
|             _keyboardShortcutList.DoLayoutList();
 | |
| 
 | |
|             GUILayout.FlexibleSpace();
 | |
| 
 | |
|             EditorGUILayout.EndVertical();
 | |
| 
 | |
|             EditorGUILayout.EndScrollView();
 | |
| 
 | |
|             EditorGUI.EndDisabledGroup();
 | |
|         }
 | |
| 
 | |
|         private void DrawTabAdvanced()
 | |
|         {
 | |
|             _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition, false, true);
 | |
| 
 | |
|             GUILayout.Label("Console", SRDebugEditorUtil.Styles.InspectorHeaderStyle);
 | |
| 
 | |
|             Settings.Instance.CollapseDuplicateLogEntries =
 | |
|                 EditorGUILayout.Toggle(
 | |
|                     new GUIContent("Collapse Log Entries", "Collapse duplicate log entries into single log."),
 | |
|                     Settings.Instance.CollapseDuplicateLogEntries);
 | |
| 
 | |
|             Settings.Instance.RichTextInConsole =
 | |
|                 EditorGUILayout.Toggle(
 | |
|                     new GUIContent("Rich Text in Console", "Parse rich text tags in console log entries."),
 | |
|                     Settings.Instance.RichTextInConsole);
 | |
| 
 | |
|             Settings.Instance.MaximumConsoleEntries =
 | |
|                 EditorGUILayout.IntSlider(
 | |
|                     new GUIContent("Max Console Entries",
 | |
|                         "The maximum size of the console buffer. Higher values may cause performance issues on slower devices."),
 | |
|                     Settings.Instance.MaximumConsoleEntries, 100, 6000);
 | |
| 
 | |
|             EditorGUILayout.Separator();
 | |
|             GUILayout.Label("Display", SRDebugEditorUtil.Styles.InspectorHeaderStyle);
 | |
| 
 | |
|             Settings.Instance.EnableBackgroundTransparency =
 | |
|                 EditorGUILayout.Toggle(new GUIContent("Transparent Background"),
 | |
|                     Settings.Instance.EnableBackgroundTransparency);
 | |
| 
 | |
|             EditorGUILayout.BeginHorizontal();
 | |
| 
 | |
|             EditorGUILayout.PrefixLabel(new GUIContent("Layer", "The layer the debug panel UI will be drawn to"));
 | |
| 
 | |
|             Settings.Instance.DebugLayer = EditorGUILayout.LayerField(Settings.Instance.DebugLayer);
 | |
| 
 | |
|             EditorGUILayout.EndHorizontal();
 | |
| 
 | |
|             Settings.Instance.UseDebugCamera =
 | |
|                 EditorGUILayout.Toggle(
 | |
|                     new GUIContent("Use Debug Camera", SRDebugStrings.Current.SettingsDebugCameraTooltip),
 | |
|                     Settings.Instance.UseDebugCamera);
 | |
| 
 | |
|             EditorGUI.BeginDisabledGroup(!Settings.Instance.UseDebugCamera);
 | |
| 
 | |
|             Settings.Instance.DebugCameraDepth = EditorGUILayout.Slider(new GUIContent("Debug Camera Depth"),
 | |
|                 Settings.Instance.DebugCameraDepth, -100, 100);
 | |
| 
 | |
|             EditorGUI.EndDisabledGroup();
 | |
| 
 | |
|             Settings.Instance.UIScale =
 | |
|                 EditorGUILayout.Slider(new GUIContent("UI Scale"), Settings.Instance.UIScale, 1f, 3f);
 | |
| 
 | |
|             EditorGUILayout.Separator();
 | |
|             GUILayout.Label("Enabled Tabs", SRDebugEditorUtil.Styles.InspectorHeaderStyle);
 | |
| 
 | |
|             GUILayout.Label(SRDebugStrings.Current.SettingsEnabledTabsDescription, EditorStyles.wordWrappedLabel);
 | |
|             EditorGUILayout.Space();
 | |
| 
 | |
|             var disabledTabs = Settings.Instance.DisabledTabs.ToList();
 | |
| 
 | |
|             var tabNames = Enum.GetNames(typeof (DefaultTabs));
 | |
|             var tabValues = Enum.GetValues(typeof (DefaultTabs));
 | |
| 
 | |
|             EditorGUILayout.BeginVertical(EditorStyles.inspectorDefaultMargins);
 | |
| 
 | |
|             var changed = false;
 | |
|             for (var i = 0; i < tabNames.Length; i++)
 | |
|             {
 | |
|                 var tabName = tabNames[i];
 | |
|                 var tabValue = (DefaultTabs) (tabValues.GetValue(i));
 | |
| 
 | |
|                 if (tabName == "BugReporter")
 | |
|                 {
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 if (tabName == "SystemInformation")
 | |
|                 {
 | |
|                     tabName = "System Information";
 | |
|                 }
 | |
| 
 | |
|                 EditorGUILayout.BeginHorizontal();
 | |
| 
 | |
|                 var isEnabled = !disabledTabs.Contains(tabValue);
 | |
| 
 | |
|                 var isNowEnabled = EditorGUILayout.ToggleLeft(tabName, isEnabled,
 | |
|                     SRDebugEditorUtil.Styles.LeftToggleButton);
 | |
| 
 | |
|                 if (isEnabled && !isNowEnabled)
 | |
|                 {
 | |
|                     disabledTabs.Add(tabValue);
 | |
|                     changed = true;
 | |
|                 }
 | |
|                 else if (!isEnabled && isNowEnabled)
 | |
|                 {
 | |
|                     disabledTabs.Remove(tabValue);
 | |
|                     changed = true;
 | |
|                 }
 | |
| 
 | |
|                 EditorGUILayout.EndHorizontal();
 | |
|             }
 | |
| 
 | |
|             EditorGUILayout.EndVertical();
 | |
| 
 | |
|             if (changed)
 | |
|             {
 | |
|                 Settings.Instance.DisabledTabs = disabledTabs;
 | |
|             }
 | |
| 
 | |
|             GUILayout.Label("Other", SRDebugEditorUtil.Styles.InspectorHeaderStyle);
 | |
| 
 | |
|             Settings.Instance.EnableEventSystemGeneration =
 | |
|             EditorGUILayout.Toggle(
 | |
|                 new GUIContent("Automatic Event System", "Automatically create a UGUI EventSystem if none is found in the scene."),
 | |
|                 Settings.Instance.EnableEventSystemGeneration);
 | |
| 
 | |
|             Settings.Instance.UnloadOnClose =
 | |
|             EditorGUILayout.Toggle(
 | |
|                 new GUIContent("Unload When Closed", "Unload the debug panel from the scene when it is closed."),
 | |
|                 Settings.Instance.UnloadOnClose);
 | |
| 
 | |
|             EditorGUILayout.HelpBox(
 | |
|                 "The panel loads again automatically when opened. You can always unload the panel by holding down the close button.",
 | |
|                 MessageType.Info);
 | |
| 
 | |
|             EditorGUILayout.Separator();
 | |
| 
 | |
|             if (GUILayout.Button("Run Migrations"))
 | |
|             {
 | |
|                 Migrations.RunMigrations(true);
 | |
|             }
 | |
| 
 | |
|             EditorGUILayout.EndScrollView();
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region Entry Code Utility
 | |
| 
 | |
|         private string GetEntryCodeString()
 | |
|         {
 | |
|             var entryCode = Settings.Instance.EntryCode;
 | |
| 
 | |
|             if (entryCode.Count == 0)
 | |
|             {
 | |
|                 Settings.Instance.EntryCode = new[] {0, 0, 0, 0};
 | |
|             }
 | |
| 
 | |
|             var code = "";
 | |
| 
 | |
|             for (var i = 0; i < entryCode.Count; i++)
 | |
|             {
 | |
|                 code += entryCode[i];
 | |
|             }
 | |
| 
 | |
|             return code;
 | |
|         }
 | |
| 
 | |
|         private void UpdateEntryCode(string str)
 | |
|         {
 | |
|             var newCode = new List<int>();
 | |
| 
 | |
|             for (var i = 0; i < str.Length; i++)
 | |
|             {
 | |
|                 newCode.Add(int.Parse(str[i].ToString(), NumberStyles.Integer));
 | |
|             }
 | |
| 
 | |
|             Settings.Instance.EntryCode = newCode;
 | |
|             _currentEntryCode = GetEntryCodeString();
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region Keyboard Shortcut Utility
 | |
| 
 | |
|         private Settings.KeyboardShortcut DetectDuplicateKeyboardShortcuts()
 | |
|         {
 | |
|             var s = Settings.Instance.KeyboardShortcuts;
 | |
| 
 | |
|             return
 | |
|                 s.FirstOrDefault(
 | |
|                     shortcut =>
 | |
|                         s.Any(
 | |
|                             p =>
 | |
|                                 p != shortcut && p.Shift == shortcut.Shift && p.Control == shortcut.Control &&
 | |
|                                 p.Alt == shortcut.Alt &&
 | |
|                                 p.Key == shortcut.Key));
 | |
|         }
 | |
| 
 | |
|         private void DrawKeyboardListHeaderCallback(Rect rect)
 | |
|         {
 | |
|             EditorGUI.LabelField(rect, "Keyboard Shortcuts");
 | |
|         }
 | |
| 
 | |
|         private void DrawKeyboardListItemCallback(Rect rect, int index, bool isActive, bool isFocused)
 | |
|         {
 | |
|             var item = Settings.Instance.KeyboardShortcuts[index];
 | |
| 
 | |
|             rect.y += 2;
 | |
| 
 | |
|             var buttonWidth = 40;
 | |
|             var padding = 5;
 | |
| 
 | |
|             item.Control = GUI.Toggle(new Rect(rect.x, rect.y, buttonWidth, EditorGUIUtility.singleLineHeight),
 | |
|                 item.Control,
 | |
|                 "Ctrl", "Button");
 | |
|             rect.x += buttonWidth + padding;
 | |
|             rect.width -= buttonWidth + padding;
 | |
| 
 | |
|             item.Alt = GUI.Toggle(new Rect(rect.x, rect.y, buttonWidth, EditorGUIUtility.singleLineHeight), item.Alt,
 | |
|                 "Alt",
 | |
|                 "Button");
 | |
|             rect.x += buttonWidth + padding;
 | |
|             rect.width -= buttonWidth + padding;
 | |
| 
 | |
|             item.Shift = GUI.Toggle(new Rect(rect.x, rect.y, buttonWidth, EditorGUIUtility.singleLineHeight), item.Shift,
 | |
|                 "Shift",
 | |
|                 "Button");
 | |
|             rect.x += buttonWidth + padding;
 | |
|             rect.width -= buttonWidth + padding;
 | |
| 
 | |
|             item.Key =
 | |
|                 (KeyCode) EditorGUI.EnumPopup(new Rect(rect.x, rect.y, 80, EditorGUIUtility.singleLineHeight), item.Key);
 | |
| 
 | |
|             rect.x += 80 + padding;
 | |
|             rect.width -= 80 + padding;
 | |
| 
 | |
|             item.Action =
 | |
|                 (Settings.ShortcutActions)
 | |
|                     EditorGUI.EnumPopup(new Rect(rect.x, rect.y, rect.width - 4, EditorGUIUtility.singleLineHeight),
 | |
|                         item.Action);
 | |
|         }
 | |
| 
 | |
|         private void OnAddKeyboardListCallback(ReorderableList list)
 | |
|         {
 | |
|             var shortcuts = Settings.Instance.KeyboardShortcuts.ToList();
 | |
|             shortcuts.Add(new Settings.KeyboardShortcut());
 | |
| 
 | |
|             Settings.Instance.KeyboardShortcuts = shortcuts;
 | |
|             list.list = (IList) Settings.Instance.KeyboardShortcuts;
 | |
|         }
 | |
| 
 | |
|         private void OnRemoveKeyboardListCallback(ReorderableList list)
 | |
|         {
 | |
|             var shortcuts = Settings.Instance.KeyboardShortcuts.ToList();
 | |
|             shortcuts.RemoveAt(list.index);
 | |
| 
 | |
|             Settings.Instance.KeyboardShortcuts = shortcuts;
 | |
|             list.list = (IList) Settings.Instance.KeyboardShortcuts;
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
|     }
 | |
| }
 |