518 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			518 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C#
		
	
	
	
| #if UNITY_EDITOR
 | |
| 
 | |
| namespace SRDebugger.Internal.Editor
 | |
| {
 | |
|     using System;
 | |
|     using System.IO;
 | |
|     using UnityEditor;
 | |
|     using UnityEngine;
 | |
| 
 | |
|     public static class SRDebugEditorUtil
 | |
|     {
 | |
|         // Path to this file from the root path
 | |
|         private const string TestPath = "SRDebugger/README.txt";
 | |
|         private static GUIStyle _bgStyle;
 | |
|         private static Texture2D _logoTexture;
 | |
|         private static Texture2D _welcomeLogoTexture;
 | |
|         private static Texture2D _bgTexture;
 | |
|         private static GUIStyle _middleAlign;
 | |
| 
 | |
|         public static string GetRootPath()
 | |
|         {
 | |
|             // Find assets that match this file name
 | |
|             var potentialAssets = AssetDatabase.FindAssets("README");
 | |
| 
 | |
|             foreach (var potentialAsset in potentialAssets)
 | |
|             {
 | |
|                 var path = AssetDatabase.GUIDToAssetPath(potentialAsset);
 | |
| 
 | |
|                 if (path.Contains(TestPath))
 | |
|                 {
 | |
|                     var rootPath = Path.GetDirectoryName(path);
 | |
|                     return rootPath;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             throw new Exception("Unable to find SRDebugger root path");
 | |
|         }
 | |
| 
 | |
|         public static T LoadResource<T>(string path) where T : UnityEngine.Object
 | |
|         {
 | |
|             var p = GetRootPath() + "/" + path;
 | |
|             //Debug.Log("[SRDebugger] Loading " + p);
 | |
|             var asset = AssetDatabase.LoadAssetAtPath(p, typeof (T));
 | |
|             return asset as T;
 | |
|         }
 | |
| 
 | |
|         public static Texture2D GetLogo()
 | |
|         {
 | |
|             if (_logoTexture != null)
 | |
|             {
 | |
|                 return _logoTexture;
 | |
|             }
 | |
| 
 | |
|             return
 | |
|                 _logoTexture =
 | |
|                     LoadResource<Texture2D>("Editor/Logo_" + (EditorGUIUtility.isProSkin ? "DarkBG" : "LightBG") +
 | |
|                                             ".png");
 | |
|         }
 | |
| 
 | |
|         public static Texture2D GetWelcomeLogo()
 | |
|         {
 | |
|             if (_welcomeLogoTexture != null)
 | |
|             {
 | |
|                 return _welcomeLogoTexture;
 | |
|             }
 | |
| 
 | |
|             return
 | |
|                 _welcomeLogoTexture =
 | |
|                     LoadResource<Texture2D>("Editor/WelcomeLogo_" +
 | |
|                                             (EditorGUIUtility.isProSkin ? "DarkBG" : "LightBG") + ".png");
 | |
|         }
 | |
| 
 | |
|         public static Texture2D GetBackground()
 | |
|         {
 | |
|             if (_bgTexture != null)
 | |
|             {
 | |
|                 return _bgTexture;
 | |
|             }
 | |
| 
 | |
|             return
 | |
|                 _bgTexture =
 | |
|                     LoadResource<Texture2D>("Editor/BG_" + (EditorGUIUtility.isProSkin ? "Dark" : "Light") + ".png");
 | |
|         }
 | |
| 
 | |
|         public static void DrawLogo(Texture2D logo)
 | |
|         {
 | |
|             if (logo == null)
 | |
|             {
 | |
|                 Debug.LogError("Error loading SRDebugger logo");
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             var rect = EditorGUILayout.BeginVertical();
 | |
| 
 | |
|             GUILayout.Space(15);
 | |
| 
 | |
|             EditorGUILayout.BeginHorizontal();
 | |
| 
 | |
|             GUILayout.FlexibleSpace();
 | |
| 
 | |
|             GUI.DrawTexture(
 | |
|                 GUILayoutUtility.GetRect(logo.width, logo.width, logo.height, logo.height, GUILayout.ExpandHeight(false),
 | |
|                     GUILayout.ExpandWidth(false)),
 | |
|                 logo);
 | |
| 
 | |
|             GUILayout.FlexibleSpace();
 | |
| 
 | |
|             EditorGUILayout.EndHorizontal();
 | |
| 
 | |
|             GUILayout.Space(15);
 | |
| 
 | |
|             EditorGUILayout.EndVertical();
 | |
| 
 | |
|             var size = EditorStyles.miniLabel.CalcSize(new GUIContent(SRDebug.Version));
 | |
|             GUI.Label(new Rect(rect.xMax - size.x, rect.yMax - size.y, size.x, size.y), SRDebug.Version,
 | |
|                 EditorStyles.miniLabel);
 | |
|         }
 | |
| 
 | |
|         public static bool DrawInspectorFoldout(bool isVisible, string content)
 | |
|         {
 | |
|             isVisible = EditorGUILayout.Foldout(isVisible, content, Styles.InspectorHeaderFoldoutStyle);
 | |
| 
 | |
|             EditorGUILayout.Separator();
 | |
| 
 | |
|             return isVisible;
 | |
|         }
 | |
| 
 | |
|         public static void BeginDrawBackground()
 | |
|         {
 | |
|             if (_bgStyle == null)
 | |
|             {
 | |
|                 _bgStyle = new GUIStyle();
 | |
|                 _bgStyle.margin = _bgStyle.padding = new RectOffset(0, 0, 0, 0);
 | |
|             }
 | |
| 
 | |
|             var rect = EditorGUILayout.BeginVertical(_bgStyle);
 | |
| 
 | |
|             DrawTextureTiled(rect, GetBackground());
 | |
|         }
 | |
| 
 | |
|         public static void EndDrawBackground()
 | |
|         {
 | |
|             EditorGUILayout.EndVertical();
 | |
|         }
 | |
| 
 | |
|         public static void DrawTextureTiled(Rect rect, Texture2D tex)
 | |
|         {
 | |
|             GUI.BeginGroup(rect);
 | |
| 
 | |
|             var tilesX = Mathf.Max(1, Mathf.CeilToInt(rect.width/tex.width));
 | |
|             var tilesY = Mathf.Max(1, Mathf.CeilToInt(rect.height/tex.height));
 | |
| 
 | |
|             for (var x = 0; x < tilesX; x++)
 | |
|             {
 | |
|                 for (var y = 0; y < tilesY; y++)
 | |
|                 {
 | |
|                     var pos = new Rect(x*tex.width, y*tex.height, tex.width, tex.height);
 | |
|                     pos.x += rect.x;
 | |
|                     pos.y += rect.y;
 | |
| 
 | |
|                     GUI.DrawTexture(pos, tex, ScaleMode.ScaleAndCrop);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             GUI.EndGroup();
 | |
|         }
 | |
| 
 | |
|         public static bool ClickableLabel(string text, GUIStyle style)
 | |
|         {
 | |
|             var rect = EditorGUILayout.BeginVertical(Styles.NoPaddingNoMargin);
 | |
| 
 | |
|             GUILayout.Label(text, style);
 | |
| 
 | |
|             EditorGUILayout.EndVertical();
 | |
| 
 | |
|             if (Event.current.type == EventType.MouseUp && rect.Contains(Event.current.mousePosition))
 | |
|             {
 | |
|                 return true;
 | |
|             }
 | |
| 
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         public static void DrawLayoutPreview(Rect rect)
 | |
|         {
 | |
|             const int profilerWidth = 120;
 | |
|             const int profilerHeight = 70;
 | |
|             const int optionsWidth = 150;
 | |
|             const int optionsHeight = 36;
 | |
| 
 | |
|             if (_middleAlign == null)
 | |
|             {
 | |
|                 _middleAlign = new GUIStyle(EditorStyles.helpBox);
 | |
|                 _middleAlign.alignment = TextAnchor.MiddleCenter;
 | |
|             }
 | |
| 
 | |
|             var iconPath = "Editor/Icons/" + (EditorGUIUtility.isProSkin ? "Light" : "Dark");
 | |
| 
 | |
|             const float consoleHeight = 90;
 | |
| 
 | |
|             GUI.Box(rect, "", EditorStyles.helpBox);
 | |
| 
 | |
|             var consoleAlignment = Settings.Instance.ConsoleAlignment;
 | |
| 
 | |
|             var consoleRect = new Rect(rect.x,
 | |
|                 consoleAlignment == ConsoleAlignment.Top ? rect.y : rect.yMax - consoleHeight, rect.width,
 | |
|                 consoleHeight);
 | |
| 
 | |
|             GUI.Box(consoleRect, new GUIContent(LoadResource<Texture2D>(iconPath + "/console-25.png"), "Console"),
 | |
|                 _middleAlign);
 | |
| 
 | |
|             var workRect = rect;
 | |
| 
 | |
|             if (consoleAlignment == ConsoleAlignment.Top)
 | |
|             {
 | |
|                 workRect.yMin += consoleHeight;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 workRect.yMax -= consoleHeight;
 | |
|             }
 | |
| 
 | |
|             var opAlignment = Settings.Instance.OptionsAlignment;
 | |
|             var proAlignment = Settings.Instance.ProfilerAlignment;
 | |
| 
 | |
|             GUI.Box(GetAlignedRect(profilerWidth, profilerHeight, proAlignment, workRect),
 | |
|                 new GUIContent(LoadResource<Texture2D>(iconPath + "/profiler-25.png"), "Profiler"), _middleAlign);
 | |
| 
 | |
|             var optionsRect = workRect;
 | |
| 
 | |
|             if ((opAlignment == PinAlignment.TopCenter && proAlignment == PinAlignment.TopLeft) || (opAlignment == PinAlignment.BottomCenter && proAlignment == PinAlignment.BottomLeft))
 | |
|             {
 | |
|                 optionsRect.x += profilerWidth;
 | |
|                 optionsRect.width -= profilerWidth;
 | |
|             } else if ((opAlignment == PinAlignment.TopCenter && proAlignment == PinAlignment.TopRight) ||
 | |
|                        opAlignment == PinAlignment.BottomCenter && proAlignment == PinAlignment.BottomRight)
 | |
|             {
 | |
|                 optionsRect.width -= profilerWidth;
 | |
|             }
 | |
| 
 | |
|             GUI.Box(GetAlignedRect(optionsWidth, optionsHeight, opAlignment, optionsRect),
 | |
|                 new GUIContent(LoadResource<Texture2D>(iconPath + "/options-25.png"), "Pinned Options"), _middleAlign);
 | |
| 
 | |
|             if (Settings.Instance.EnableTrigger != Settings.TriggerEnableModes.Off)
 | |
|             {
 | |
|                 GUI.Box(GetAlignedRect(25, 25, Settings.Instance.TriggerPosition, rect),
 | |
|                     new GUIContent("", "Entry Trigger"),
 | |
|                     _middleAlign);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static Rect GetAlignedRect(int width, int height, PinAlignment alignment, Rect workRect)
 | |
|         {
 | |
|             var rect = new Rect(0, 0, width, height);
 | |
| 
 | |
|             if (alignment == PinAlignment.BottomLeft || alignment == PinAlignment.BottomRight || alignment == PinAlignment.BottomCenter)
 | |
|             {
 | |
|                 rect.position = new Vector2(0, workRect.height - rect.height);
 | |
|             } else if (alignment == PinAlignment.CenterLeft || alignment == PinAlignment.CenterRight)
 | |
|             {
 | |
|                 rect.position = new Vector2(0, workRect.height/2 - rect.height/2);
 | |
|             }
 | |
| 
 | |
|             if (alignment == PinAlignment.TopRight || alignment == PinAlignment.BottomRight || alignment == PinAlignment.CenterRight)
 | |
|             {
 | |
|                 rect.position += new Vector2(workRect.width - rect.width, 0);
 | |
|             } else if (alignment == PinAlignment.TopCenter || alignment == PinAlignment.BottomCenter)
 | |
|             {
 | |
|                 rect.position += new Vector2(workRect.width/2 - rect.width/2, 0);
 | |
|             }
 | |
| 
 | |
|             rect.position += workRect.position;
 | |
| 
 | |
|             return rect;
 | |
|         }
 | |
| 
 | |
|         public static void RenderGif(Rect pos, Texture2D map, int frameNo, int frameWidth, int frameHeight, int perLine,
 | |
|             int paddingX = 0, int paddingY = 0)
 | |
|         {
 | |
|             var x = frameNo%perLine;
 | |
|             var y = Mathf.FloorToInt((float) frameNo/perLine);
 | |
| 
 | |
|             var xCoord = x*(frameWidth + paddingX);
 | |
|             var yCoord = (y + 1)*(frameHeight + paddingY);
 | |
| 
 | |
|             var texCoords = new Rect(
 | |
|                 xCoord/(float) map.width,
 | |
|                 (map.height - yCoord)/(float) map.height,
 | |
|                 (frameWidth)/(float) map.width,
 | |
|                 (frameHeight)/(float) map.height);
 | |
| 
 | |
|             GUI.DrawTextureWithTexCoords(pos, map, texCoords);
 | |
| 
 | |
|             //Debug.Log(texCoords);
 | |
|             //Debug.Log("x: " + x + ", y: " + y);
 | |
|         }
 | |
| 
 | |
|         public static void DrawFooterLayout(float width)
 | |
|         {
 | |
|             EditorGUILayout.BeginHorizontal();
 | |
| 
 | |
|             var margin = (EditorStyles.miniButton.padding.left)/2f;
 | |
|             width = width - margin*2;
 | |
| 
 | |
|             if (GUILayout.Button("Web Site", GUILayout.Width(width/2f - margin)))
 | |
|             {
 | |
|                 Application.OpenURL(SRDebugStrings.Current.SettingsWebSiteUrl);
 | |
|             }
 | |
| 
 | |
|             if (GUILayout.Button("Asset Store Page", GUILayout.Width(width/2f - margin)))
 | |
|             {
 | |
|                 Application.OpenURL(SRDebugStrings.Current.SettingsAssetStoreUrl);
 | |
|             }
 | |
| 
 | |
|             EditorGUILayout.EndHorizontal();
 | |
| 
 | |
|             EditorGUILayout.BeginHorizontal();
 | |
| 
 | |
|             if (GUILayout.Button("Documentation", GUILayout.Width(width/2f - margin)))
 | |
|             {
 | |
|                 Application.OpenURL(SRDebugStrings.Current.SettingsDocumentationUrl);
 | |
|             }
 | |
| 
 | |
|             if (GUILayout.Button("Support", GUILayout.Width(width/2f - margin)))
 | |
|             {
 | |
|                 Application.OpenURL(
 | |
|                     SRDebugStrings.Current.SettingsSupportUrl);
 | |
|             }
 | |
| 
 | |
|             EditorGUILayout.EndHorizontal();
 | |
|         }
 | |
| 
 | |
|         public static class Styles
 | |
|         {
 | |
|             private static GUIStyle _inspectorHeaderStyle;
 | |
|             private static GUIStyle _inspectorHeaderFoldoutStyle;
 | |
|             private static GUIStyle _settingsHeaderBoxStyle;
 | |
|             private static GUIStyle _headerLabel;
 | |
|             private static GUIStyle _paragraphLabel;
 | |
|             private static GUIStyle _radioButtonDescription;
 | |
|             private static GUIStyle _radioButton;
 | |
|             private static GUIStyle _leftToggleButton;
 | |
|             private static GUIStyle _noPaddingNoMargin;
 | |
|             private static GUIStyle _richTextLabel;
 | |
| 
 | |
|             public static string LinkColour
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     if (EditorGUIUtility.isProSkin)
 | |
|                     {
 | |
|                         return "#7C8CB9";
 | |
|                     }
 | |
| 
 | |
|                     return "#0032E6";
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             public static GUIStyle InspectorHeaderStyle
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     if (_inspectorHeaderStyle == null)
 | |
|                     {
 | |
|                         _inspectorHeaderStyle = new GUIStyle(EditorStyles.boldLabel);
 | |
|                         _inspectorHeaderStyle.fontSize = 12;
 | |
|                     }
 | |
| 
 | |
|                     return _inspectorHeaderStyle;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             public static GUIStyle InspectorHeaderFoldoutStyle
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     if (_inspectorHeaderFoldoutStyle == null)
 | |
|                     {
 | |
|                         _inspectorHeaderFoldoutStyle = new GUIStyle(EditorStyles.foldout);
 | |
|                         _inspectorHeaderFoldoutStyle.fontSize = 12;
 | |
|                         _inspectorHeaderFoldoutStyle.fontStyle = FontStyle.Bold;
 | |
|                     }
 | |
| 
 | |
|                     return _inspectorHeaderFoldoutStyle;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             public static GUIStyle SettingsHeaderBoxStyle
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     if (_settingsHeaderBoxStyle == null)
 | |
|                     {
 | |
|                         _settingsHeaderBoxStyle = new GUIStyle("OL Title");
 | |
|                         _settingsHeaderBoxStyle.padding = new RectOffset(0, 0, 0, 0);
 | |
|                         _settingsHeaderBoxStyle.margin = new RectOffset(0, 0, 0, 0);
 | |
|                         _settingsHeaderBoxStyle.clipping = TextClipping.Clip;
 | |
|                         _settingsHeaderBoxStyle.overflow = new RectOffset(0, 0, 0, 0);
 | |
|                         //_settingsHeaderBoxStyle.border = new RectOffset(1, 1, 1, 1);
 | |
|                         _settingsHeaderBoxStyle.fixedHeight = 0.5f;
 | |
|                     }
 | |
| 
 | |
|                     return _settingsHeaderBoxStyle;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             public static GUIStyle HeaderLabel
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     if (_headerLabel == null)
 | |
|                     {
 | |
|                         _headerLabel = new GUIStyle(EditorStyles.largeLabel);
 | |
|                         _headerLabel.fontSize = 18;
 | |
|                         _headerLabel.fontStyle = FontStyle.Normal;
 | |
|                         _headerLabel.margin = new RectOffset(5, 5, 5, 5);
 | |
|                     }
 | |
| 
 | |
|                     return _headerLabel;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             public static GUIStyle ParagraphLabel
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     if (_paragraphLabel == null)
 | |
|                     {
 | |
|                         _paragraphLabel = new GUIStyle(EditorStyles.label);
 | |
|                         _paragraphLabel.margin = new RectOffset(5, 5, 5, 5);
 | |
|                         _paragraphLabel.wordWrap = true;
 | |
|                         _paragraphLabel.richText = true;
 | |
|                     }
 | |
| 
 | |
|                     return _paragraphLabel;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             public static GUIStyle LeftToggleButton
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     if (_leftToggleButton == null)
 | |
|                     {
 | |
|                         _leftToggleButton = new GUIStyle(EditorStyles.label);
 | |
|                         _leftToggleButton.contentOffset = new Vector2(_leftToggleButton.contentOffset.x + 5,
 | |
|                             _leftToggleButton.contentOffset.y);
 | |
|                     }
 | |
| 
 | |
|                     return _leftToggleButton;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             public static GUIStyle RadioButton
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     if (_radioButton == null)
 | |
|                     {
 | |
|                         _radioButton = new GUIStyle(EditorStyles.radioButton);
 | |
|                         _radioButton.contentOffset = new Vector2(_radioButton.contentOffset.x + 5,
 | |
|                             _radioButton.contentOffset.y);
 | |
|                     }
 | |
| 
 | |
|                     return _radioButton;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             public static GUIStyle RadioButtonDescription
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     if (_radioButtonDescription == null)
 | |
|                     {
 | |
|                         _radioButtonDescription = new GUIStyle(ParagraphLabel);
 | |
|                         _radioButtonDescription.padding.left = (int) RadioButton.contentOffset.x +
 | |
|                                                                RadioButton.padding.left;
 | |
|                     }
 | |
| 
 | |
|                     return _radioButtonDescription;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             public static GUIStyle NoPaddingNoMargin
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     if (_noPaddingNoMargin == null)
 | |
|                     {
 | |
|                         _noPaddingNoMargin = new GUIStyle();
 | |
|                         _noPaddingNoMargin.margin = new RectOffset(0, 0, 0, 0);
 | |
|                         _noPaddingNoMargin.padding = new RectOffset(0, 0, 0, 0);
 | |
|                     }
 | |
| 
 | |
|                     return _noPaddingNoMargin;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             public static GUIStyle RichTextLabel
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     if (_richTextLabel == null)
 | |
|                     {
 | |
|                         _richTextLabel = new GUIStyle(EditorStyles.label);
 | |
|                         _richTextLabel.richText = true;
 | |
|                         _richTextLabel.margin = new RectOffset(2, 2, 0, 0);
 | |
|                     }
 | |
| 
 | |
|                     return _richTextLabel;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| #endif
 |