UP-Viagg-io/Viagg-io/Assets/Packages/Graphy - Ultimate Stats Mon.../Editor/GraphyDebuggerEditor.cs

578 lines
21 KiB
C#

/* ---------------------------------------
* Author: Martin Pane (martintayx@gmail.com) (@tayx94)
* Contributors: https://github.com/Tayx94/graphy/graphs/contributors
* Project: Graphy - Ultimate Stats Monitor
* Date: 02-Jan-18
* Studio: Tayx
*
* Git repo: https://github.com/Tayx94/graphy
*
* This project is released under the MIT license.
* Attribution is not required, but it is always welcomed!
* -------------------------------------*/
using System;
using UnityEngine;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
namespace Tayx.Graphy
{
[CustomEditor( typeof( GraphyDebugger ) )]
internal class GraphyDebuggerEditor : Editor
{
#region Variables -> Private
private GraphyDebugger m_target;
private int m_newDebugPacketListSize = 0;
private int m_previouslySelectedDebugPacketIndex = 0;
private int m_currentlySelectedDebugPacketIndex = 0;
private int m_selectedDebugPacketCondition = 0;
#endregion
#region Methods -> Unity Callbacks
private void OnEnable()
{
m_target = (GraphyDebugger) target;
}
#endregion
#region Methods -> Public Override
public override void OnInspectorGUI()
{
if( m_target == null && target == null )
{
base.OnInspectorGUI();
return;
}
float defaultLabelWidth = EditorGUIUtility.labelWidth;
float defaultFieldWidth = EditorGUIUtility.fieldWidth;
//===== CONTENT REGION ========================================================================
GUILayout.Space( 20 );
#region Section -> Logo
if( GraphyEditorStyle.DebuggerLogoTexture != null )
{
GUILayout.Label
(
image: GraphyEditorStyle.DebuggerLogoTexture,
style: new GUIStyle( GUI.skin.GetStyle( "Label" ) )
{
alignment = TextAnchor.UpperCenter
}
);
GUILayout.Space( 10 );
}
else
{
EditorGUILayout.LabelField
(
label: "[ GRAPHY - DEBUGGER ]",
style: GraphyEditorStyle.HeaderStyle1
);
}
#endregion
GUILayout.Space( 5 ); //Extra pixels added when the logo is used.
#region Section -> Settings
SerializedObject serObj = serializedObject;
SerializedProperty
debugPacketList =
serObj.FindProperty( "m_debugPackets" ); // Find the List in our script and create a refrence of it
//Update our list
serObj.Update();
EditorGUILayout.LabelField( "Current [Debug Packets] list size: " + debugPacketList.arraySize );
EditorGUIUtility.fieldWidth = 32;
EditorGUILayout.BeginHorizontal();
m_newDebugPacketListSize = EditorGUILayout.IntField
(
label: "Define a new list size",
value: m_newDebugPacketListSize
);
if( GUILayout.Button( "Resize List" ) )
{
if( EditorUtility.DisplayDialog
(
title:
"Resize List",
message:
"Are you sure you want to resize the entire List?\n\n" +
"Current List Size -> " +
debugPacketList.arraySize +
"\n" +
"New List Size -> " +
m_newDebugPacketListSize +
"\n" +
"This will add default entries if the value is greater than the list size, or erase the bottom values until the new size specified.",
ok:
"Resize",
cancel:
"Cancel" )
)
{
m_currentlySelectedDebugPacketIndex = 0;
if( m_newDebugPacketListSize != debugPacketList.arraySize )
{
while( m_newDebugPacketListSize > debugPacketList.arraySize )
{
debugPacketList.InsertArrayElementAtIndex( debugPacketList.arraySize );
SetDefaultDebugPacketValues( debugPacketList );
}
while( m_newDebugPacketListSize < debugPacketList.arraySize )
{
debugPacketList.DeleteArrayElementAtIndex( debugPacketList.arraySize - 1 );
}
}
}
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.LabelField( "NOT RECOMMENDED (Only use for first initialization)",
EditorStyles.centeredGreyMiniLabel );
EditorGUILayout.Space();
EditorGUILayout.Space();
if( debugPacketList.arraySize < 1 )
{
m_previouslySelectedDebugPacketIndex = 0;
m_currentlySelectedDebugPacketIndex = 0;
m_selectedDebugPacketCondition = 0;
serializedObject.ApplyModifiedProperties();
return;
}
GraphyEditorStyle.HeaderStyle2.contentOffset = Vector2.down * 3f;
EditorGUILayout.LabelField( "Selected debug packet:" );
EditorGUILayout.BeginHorizontal();
List<string> debugPacketNames = new List<string>();
for( int i = 0; i < debugPacketList.arraySize; i++ )
{
SerializedProperty listItem = debugPacketList.GetArrayElementAtIndex( i );
// NOTE: If the Popup detects two equal strings, it just paints 1, that's why I always add the "i"
char checkMark = listItem.FindPropertyRelative( "Active" ).boolValue ? '\u2714' : '\u2718';
debugPacketNames.Add
(
(i + 1) +
" (" +
checkMark +
") " +
" - ID: " +
listItem.FindPropertyRelative( "Id" ).intValue +
" (Conditions: " +
listItem.FindPropertyRelative( "DebugConditions" ).arraySize +
")"
);
}
m_currentlySelectedDebugPacketIndex =
EditorGUILayout.Popup( m_currentlySelectedDebugPacketIndex, debugPacketNames.ToArray() );
if( m_currentlySelectedDebugPacketIndex != m_previouslySelectedDebugPacketIndex )
{
m_selectedDebugPacketCondition = 0;
m_previouslySelectedDebugPacketIndex = m_currentlySelectedDebugPacketIndex;
}
Color defaultGUIColor = GUI.color;
GUI.color = new Color( 0.7f, 1f, 0.0f, 1f );
//Or add a new item to the List<> with a button
if( GUILayout.Button( "Add", GUILayout.Width( 60 ) ) )
{
debugPacketList.InsertArrayElementAtIndex( debugPacketList.arraySize );
SetDefaultDebugPacketValues( debugPacketList );
}
GUI.color = new Color( 1f, 0.7f, 0.0f, 1f );
//Remove this index from the List
if( GUILayout.Button( "Remove", GUILayout.Width( 60 ) ) )
{
debugPacketList.DeleteArrayElementAtIndex( m_currentlySelectedDebugPacketIndex );
if( m_currentlySelectedDebugPacketIndex > 0 )
{
m_currentlySelectedDebugPacketIndex--;
}
if( debugPacketList.arraySize < 1 )
{
serializedObject.ApplyModifiedProperties();
return;
}
}
GUI.color = defaultGUIColor;
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space();
//Display our list to the inspector window
SerializedProperty listItemSelected =
debugPacketList.GetArrayElementAtIndex( m_currentlySelectedDebugPacketIndex );
SerializedProperty Active = listItemSelected.FindPropertyRelative( "Active" );
SerializedProperty Id = listItemSelected.FindPropertyRelative( "Id" );
SerializedProperty ExecuteOnce = listItemSelected.FindPropertyRelative( "ExecuteOnce" );
SerializedProperty InitSleepTime = listItemSelected.FindPropertyRelative( "InitSleepTime" );
SerializedProperty ExecuteSleepTime = listItemSelected.FindPropertyRelative( "ExecuteSleepTime" );
SerializedProperty ConditionEvaluation = listItemSelected.FindPropertyRelative( "ConditionEvaluation" );
SerializedProperty DebugConditions = listItemSelected.FindPropertyRelative( "DebugConditions" );
SerializedProperty MessageType = listItemSelected.FindPropertyRelative( "MessageType" );
SerializedProperty Message = listItemSelected.FindPropertyRelative( "Message" );
SerializedProperty TakeScreenshot = listItemSelected.FindPropertyRelative( "TakeScreenshot" );
SerializedProperty ScreenshotFileName = listItemSelected.FindPropertyRelative( "ScreenshotFileName" );
SerializedProperty DebugBreak = listItemSelected.FindPropertyRelative( "DebugBreak" );
SerializedProperty UnityEvents = listItemSelected.FindPropertyRelative( "UnityEvents" );
#endregion
EditorGUILayout.LabelField
(
label:
"[ PACKET ] - ID: " +
Id.intValue +
" (Conditions: " +
DebugConditions.arraySize +
")",
style: GraphyEditorStyle.HeaderStyle2
);
EditorGUIUtility.labelWidth = 150;
EditorGUIUtility.fieldWidth = 35;
Active.boolValue = EditorGUILayout.Toggle
(
new GUIContent
(
text: "Active",
tooltip: "If false, it will not be checked"
),
value: Active.boolValue
);
Id.intValue = EditorGUILayout.IntField
(
new GUIContent
(
text: "ID",
tooltip: "Optional Id. It's used to get or remove DebugPackets in runtime"
),
value: Id.intValue
);
ExecuteOnce.boolValue = EditorGUILayout.Toggle
(
new GUIContent
(
text: "Execute once",
tooltip: "If true, once the actions are executed, this DebugPacket will delete itself"
),
value: ExecuteOnce.boolValue
);
InitSleepTime.floatValue = EditorGUILayout.FloatField
(
new GUIContent
(
text: "Init sleep time",
tooltip:
"Time to wait before checking if conditions are met (use this to avoid low fps drops triggering the conditions when loading the game)"
),
value: InitSleepTime.floatValue
);
ExecuteSleepTime.floatValue = EditorGUILayout.FloatField
(
new GUIContent
(
text: "Sleep time after execute",
tooltip:
"Time to wait before checking if conditions are met again (once they have already been met and if ExecuteOnce is false)"
),
value: ExecuteSleepTime.floatValue
);
EditorGUIUtility.labelWidth = defaultLabelWidth;
EditorGUIUtility.fieldWidth = defaultFieldWidth;
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.LabelField( "[ CONDITIONS ] (" + DebugConditions.arraySize + ")",
GraphyEditorStyle.HeaderStyle2 );
EditorGUILayout.PropertyField
(
ConditionEvaluation,
new GUIContent( "Condition evaluation" )
);
EditorGUILayout.Space();
if( DebugConditions.arraySize < 1 )
{
DebugConditions.InsertArrayElementAtIndex( DebugConditions.arraySize );
m_selectedDebugPacketCondition = 0;
}
EditorGUILayout.BeginHorizontal();
List<string> debugPacketConditionNames = new List<string>();
for( int i = 0; i < DebugConditions.arraySize; i++ )
{
SerializedProperty listItem = DebugConditions.GetArrayElementAtIndex( i );
// NOTE: If the Popup detects two equal strings, it just paints 1, that's why I always add the "i"
string conditionName = (i + 1).ToString() + " - ";
conditionName +=
GetComparerStringFromDebugVariable(
(GraphyDebugger.DebugVariable) listItem.FindPropertyRelative( "Variable" ).intValue ) + " ";
conditionName +=
GetComparerStringFromDebugComparer(
(GraphyDebugger.DebugComparer) listItem.FindPropertyRelative( "Comparer" ).intValue ) + " ";
conditionName += listItem.FindPropertyRelative( "Value" ).floatValue.ToString();
debugPacketConditionNames.Add( conditionName );
}
m_selectedDebugPacketCondition =
EditorGUILayout.Popup( m_selectedDebugPacketCondition, debugPacketConditionNames.ToArray() );
GUI.color = new Color( 0.7f, 1f, 0.0f, 1f );
if( GUILayout.Button( "Add", GUILayout.Width( 60 ) ) )
{
DebugConditions.InsertArrayElementAtIndex( DebugConditions.arraySize );
}
if( DebugConditions.arraySize > 1 )
{
GUI.color = new Color( 1f, 0.7f, 0.0f, 1f );
}
else
{
GUI.color = new Color( 1f, 0.7f, 0.0f, 0.5f );
}
//Remove this index from the List
if( GUILayout.Button( "Remove", GUILayout.Width( 60 ) ) )
{
if( DebugConditions.arraySize > 1 )
{
DebugConditions.DeleteArrayElementAtIndex( m_selectedDebugPacketCondition );
if( m_selectedDebugPacketCondition > 0 )
{
m_selectedDebugPacketCondition--;
}
}
}
GUI.color = defaultGUIColor;
EditorGUILayout.EndHorizontal();
SerializedProperty conditionListItemSelected =
DebugConditions.GetArrayElementAtIndex( m_selectedDebugPacketCondition );
SerializedProperty Variable = conditionListItemSelected.FindPropertyRelative( "Variable" );
SerializedProperty Comparer = conditionListItemSelected.FindPropertyRelative( "Comparer" );
SerializedProperty Value = conditionListItemSelected.FindPropertyRelative( "Value" );
EditorGUILayout.PropertyField
(
Variable,
new GUIContent( "Variable" )
);
EditorGUILayout.PropertyField
(
Comparer,
new GUIContent( "Comparer" )
);
EditorGUILayout.PropertyField
(
Value,
new GUIContent( "Value" )
);
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.LabelField( "[ ACTIONS ]", GraphyEditorStyle.HeaderStyle2 );
EditorGUIUtility.labelWidth = 140;
EditorGUIUtility.fieldWidth = 35;
EditorGUILayout.PropertyField
(
MessageType,
new GUIContent( "Message type" )
);
EditorGUILayout.PropertyField( Message );
TakeScreenshot.boolValue = EditorGUILayout.Toggle
(
new GUIContent
(
text: "Take screenshot",
tooltip:
"If true, it takes a screenshot and stores it. The location where the image is written to can include a directory/folder list. With no directory/folder list the image will be written into the Project folder. On mobile platforms the filename is appended to the persistent data path."
),
value: TakeScreenshot.boolValue
);
if( TakeScreenshot.boolValue )
{
EditorGUILayout.PropertyField
(
ScreenshotFileName,
new GUIContent
(
text: "Screenshot file name",
tooltip:
"Avoid this characters: * . \" / \\ [ ] : ; | = , \n\nIt will have the date appended at the end to avoid overwriting."
)
);
}
DebugBreak.boolValue = EditorGUILayout.Toggle
(
new GUIContent
(
text: "Debug Break",
tooltip: "If true, it pauses the editor"
),
DebugBreak.boolValue
);
EditorGUILayout.PropertyField( UnityEvents );
EditorGUIUtility.labelWidth = defaultLabelWidth;
EditorGUIUtility.fieldWidth = defaultFieldWidth;
serializedObject.ApplyModifiedProperties();
}
#endregion
#region Methods -> Private
private void SetDefaultDebugPacketValues( SerializedProperty debugPacketSerializedProperty )
{
GraphyDebugger.DebugPacket debugPacket = new GraphyDebugger.DebugPacket();
debugPacketSerializedProperty.GetArrayElementAtIndex( debugPacketSerializedProperty.arraySize - 1 )
.FindPropertyRelative( "Active" )
.boolValue = debugPacket.Active;
debugPacketSerializedProperty.GetArrayElementAtIndex( debugPacketSerializedProperty.arraySize - 1 )
.FindPropertyRelative( "Id" )
.intValue = debugPacketSerializedProperty.arraySize;
debugPacketSerializedProperty.GetArrayElementAtIndex( debugPacketSerializedProperty.arraySize - 1 )
.FindPropertyRelative( "ExecuteOnce" )
.boolValue = debugPacket.ExecuteOnce;
debugPacketSerializedProperty.GetArrayElementAtIndex( debugPacketSerializedProperty.arraySize - 1 )
.FindPropertyRelative( "InitSleepTime" )
.floatValue = debugPacket.InitSleepTime;
debugPacketSerializedProperty.GetArrayElementAtIndex( debugPacketSerializedProperty.arraySize - 1 )
.FindPropertyRelative( "ExecuteSleepTime" )
.floatValue = debugPacket.ExecuteSleepTime;
}
private string GetComparerStringFromDebugVariable( GraphyDebugger.DebugVariable debugVariable )
{
switch( debugVariable )
{
case GraphyDebugger.DebugVariable.Fps:
return "FPS Current";
case GraphyDebugger.DebugVariable.Fps_Min:
return "FPS Min";
case GraphyDebugger.DebugVariable.Fps_Max:
return "FPS Max";
case GraphyDebugger.DebugVariable.Fps_Avg:
return "FPS Avg";
case GraphyDebugger.DebugVariable.Ram_Allocated:
return "Ram Allocated";
case GraphyDebugger.DebugVariable.Ram_Reserved:
return "Ram Reserved";
case GraphyDebugger.DebugVariable.Ram_Mono:
return "Ram Mono";
case GraphyDebugger.DebugVariable.Audio_DB:
return "Audio DB";
default:
return null;
}
}
private string GetComparerStringFromDebugComparer( GraphyDebugger.DebugComparer debugComparer )
{
switch( debugComparer )
{
case GraphyDebugger.DebugComparer.Less_than:
return "<";
case GraphyDebugger.DebugComparer.Equals_or_less_than:
return "<=";
case GraphyDebugger.DebugComparer.Equals:
return "==";
case GraphyDebugger.DebugComparer.Equals_or_greater_than:
return ">=";
case GraphyDebugger.DebugComparer.Greater_than:
return ">";
default:
return null;
}
}
#endregion
}
}