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/Editor/SRIntegrityCheckWindow.cs

183 lines
5.5 KiB
C#

3 months ago
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
namespace SRDebugger.Editor
{
[InitializeOnLoad]
class SRIntegrityCheckWindow : EditorWindow
{
private List<IntegrityIssue> _results;
private Vector2 _scrollPosition;
private bool _applyingFix;
private static bool _isOpen;
static SRIntegrityCheckWindow()
{
// Delay call to prevent any UI stalls after compile complete.
EditorApplication.delayCall += () =>
{
if (!_isOpen && SRDebugEditor.QuickIntegrityCheck().Any())
{
Debug.Log("[SRDebugger] Some issues have been detected with SRDebugger, opening integrity check window.");
Open();
}
};
}
public static void Open()
{
var window = GetWindow<SRIntegrityCheckWindow>(true, "SRDebugger Integrity Check", true);
window.minSize = new Vector2(640, 400);
window.Show();
}
private void OnEnable()
{
_isOpen = true;
RefreshIntegrityCheck();
}
private void OnDisable()
{
_isOpen = false;
}
public void RefreshIntegrityCheck()
{
_results = SRDebugEditor.QuickIntegrityCheck().ToList();
}
private void OnGUI()
{
// Draw header area
SRInternalEditorUtil.BeginDrawBackground();
SRInternalEditorUtil.DrawLogo(SRInternalEditorUtil.GetLogo());
SRInternalEditorUtil.EndDrawBackground();
// Draw header/content divider
EditorGUILayout.BeginVertical(SRInternalEditorUtil.Styles.SettingsHeaderBoxStyle);
EditorGUILayout.EndVertical();
GUILayout.Label(
"SRDebugger automatically scans your project to find common issues with the SRDebugger installation.");
EditorGUILayout.Space();
// TODO: Enable button when there are some more 'expensive' integrity checks. For now no point as alt the checks are really quick
if (GUILayout.Button("Refresh"))
{
RefreshIntegrityCheck();
}
if (_applyingFix)
{
if (!EditorApplication.isCompiling && !EditorApplication.isUpdating)
{
_applyingFix = false;
RefreshIntegrityCheck();
}
EditorGUI.BeginDisabledGroup(_applyingFix);
}
EditorGUILayout.Space();
if (_results == null)
{
_results = new List<IntegrityIssue>();
}
EditorGUILayout.TextArea("Issues Detected: " + _results.Count, EditorStyles.boldLabel);
EditorGUILayout.Separator();
EditorGUILayout.Space();
if (_results.Count == 0)
{
EditorGUILayout.HelpBox("No issues have been found!", MessageType.None);
}
else
{
EditorGUILayout.HelpBox("It is highly recommended to backup your project before using this tool.", MessageType.Warning);
_scrollPosition = GUILayout.BeginScrollView(_scrollPosition, false, false,
GUILayout.Width(position.width));
DrawIssuesList();
EditorGUILayout.EndScrollView();
}
if (_applyingFix)
{
EditorGUI.EndDisabledGroup();
}
}
private void DrawIssuesList()
{
EditorGUILayout.BeginVertical();
for (var i = 0; i < _results.Count; i++)
{
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
GUILayout.Label(_results[i].Title, EditorStyles.boldLabel);
GUILayout.Label(_results[i].Description, SRInternalEditorUtil.Styles.ParagraphLabel);
var fixes = _results[i].GetFixes();
if (fixes.Count > 0)
{
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.BeginVertical();
GUILayout.Label("Possible Fixes:", EditorStyles.miniBoldLabel);
foreach (Fix fix in fixes)
{
EditorGUILayout.BeginHorizontal(EditorStyles.helpBox);
GUILayout.Space(10);
EditorGUILayout.BeginVertical();
GUILayout.Label(fix.Name, EditorStyles.boldLabel);
GUILayout.Label(fix.Description, SRInternalEditorUtil.Styles.ParagraphLabelItalic);
if (fix.IsAutoFix && GUILayout.Button("Apply Fix", GUILayout.Width(90)))
{
fix.Execute();
_applyingFix = true;
}
GUILayout.Space(2);
EditorGUILayout.EndVertical();
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
}
EditorGUILayout.EndVertical();
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
}
}
GUILayout.FlexibleSpace();
EditorGUILayout.EndVertical();
}
}
}