diff --git a/Editor/IValidator.cs b/Editor/IValidator.cs index 6bab4f5..92082fb 100644 --- a/Editor/IValidator.cs +++ b/Editor/IValidator.cs @@ -1,8 +1,8 @@ namespace Validator.Editor { - public interface IValidator - { - public string MenuName { get; } - public Report Validate(); - } + public interface IValidator + { + public string MenuName { get; } + public Report Validate(); + } } \ No newline at end of file diff --git a/Editor/ValidatorEditorWindow.cs b/Editor/ValidatorEditorWindow.cs index 340d7b9..bae6cde 100644 --- a/Editor/ValidatorEditorWindow.cs +++ b/Editor/ValidatorEditorWindow.cs @@ -8,152 +8,152 @@ using Object = UnityEngine.Object; namespace Validator.Editor { - public class ValidatorEditorWindow : EditorWindow - { - private class ValidatorInfo + public class ValidatorEditorWindow : EditorWindow + { + private class ValidatorInfo { - public IValidator validator = null; - public bool isEnabled = true; + public IValidator validator = null; + public bool isEnabled = true; - public ValidatorInfo(IValidator validator) + public ValidatorInfo(IValidator validator) { - this.validator = validator; + this.validator = validator; } - } + } - private class ReportStats + private class ReportStats { - public int infoCount = 0; - public int warningCount = 0; - public int errorCount = 0; - } + public int infoCount = 0; + public int warningCount = 0; + public int errorCount = 0; + } - private class Settings + private class Settings { public bool showInfo = true; public bool showWarning = true; public bool showError = true; - public string searchInput = ""; + public string searchInput = ""; public readonly Color lightColor = new Color(0.25f, 0.25f, 0.25f, 1); public readonly Color darkColor = new Color(0.22f, 0.22f, 0.22f, 1); } - private static readonly List validators = new List(); - private static readonly List reports = new List(); + private static readonly List validators = new List(); + private static readonly List reports = new List(); private static readonly Settings settings = new Settings(); private static ReportStats reportStats = new ReportStats(); private MultiColumnHeaderState multiColumnHeaderState; - private MultiColumnHeader multiColumnHeader; - private MultiColumnHeaderState.Column[] columns; - private Vector2 scrollPosition; - private float multiColumnHeaderWidth; - private float rows; + private MultiColumnHeader multiColumnHeader; + private MultiColumnHeaderState.Column[] columns; + private Vector2 scrollPosition; + private float multiColumnHeaderWidth; + private float rows; - [MenuItem("Window/General/Validator")] - private static void Init() - { - ValidatorEditorWindow window = (ValidatorEditorWindow)GetWindow(typeof(ValidatorEditorWindow)); - window.titleContent = new GUIContent("Validator", EditorGUIUtility.IconContent("d_UnityEditor.ConsoleWindow").image); - window.Show(); - window.LoadValidators(); - } + [MenuItem("Window/General/Validator")] + private static void Init() + { + ValidatorEditorWindow window = (ValidatorEditorWindow)GetWindow(typeof(ValidatorEditorWindow)); + window.titleContent = new GUIContent("Validator", EditorGUIUtility.IconContent("d_UnityEditor.ConsoleWindow").image); + window.Show(); + window.LoadValidators(); + } private void OnGUI() - { - using (new EditorGUILayout.VerticalScope(GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true))) - { - DrawMenu(); - GUILayout.Space(EditorGUIUtility.standardVerticalSpacing); - DrawMultiColumnScope(); - } - } - - private void InitializeMultiColumn() { - columns = new MultiColumnHeaderState.Column[] - { - new MultiColumnHeaderState.Column() - { - allowToggleVisibility = false, // At least one column must be there. - autoResize = false, - width = 36f, - minWidth = 36f, - maxWidth = 36f, - canSort = false, - sortingArrowAlignment = TextAlignment.Right, - headerContent = EditorGUIUtility.IconContent("d_console.erroricon.inactive.sml", "Warning Type."), - headerTextAlignment = TextAlignment.Center, - }, - new MultiColumnHeaderState.Column() - { - allowToggleVisibility = true, - autoResize = false, - width = 36f, - minWidth = 36f, - maxWidth = 36f, - canSort = false, - sortingArrowAlignment = TextAlignment.Right, - headerContent = EditorGUIUtility.IconContent("Animation.FilterBySelection", "Target Objects"), - headerTextAlignment = TextAlignment.Center, - }, - new MultiColumnHeaderState.Column() - { - allowToggleVisibility = true, - autoResize = true, - width = 75.0f, - minWidth = 75.0f, - canSort = false, - sortingArrowAlignment = TextAlignment.Right, - headerContent = new GUIContent("Category", "Warning Category."), - headerTextAlignment = TextAlignment.Center, - }, - new MultiColumnHeaderState.Column() - { - allowToggleVisibility = true, - autoResize = true, - width = 200.0f, - minWidth = 200.0f, - canSort = false, - sortingArrowAlignment = TextAlignment.Right, - headerContent = new GUIContent("Message", "Warning Message."), - headerTextAlignment = TextAlignment.Center, - }, - new MultiColumnHeaderState.Column() - { - allowToggleVisibility = true, - autoResize = true, - width = 200.0f, - minWidth = 200.0f, - canSort = false, - sortingArrowAlignment = TextAlignment.Right, - headerContent = new GUIContent("Solution", "Warning Solution."), - headerTextAlignment = TextAlignment.Center, - }, - }; + using (new EditorGUILayout.VerticalScope(GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true))) + { + DrawMenu(); + GUILayout.Space(EditorGUIUtility.standardVerticalSpacing); + DrawMultiColumnScope(); + } + } - multiColumnHeaderState = new MultiColumnHeaderState(columns); - multiColumnHeader = new MultiColumnHeader(multiColumnHeaderState); - multiColumnHeader.ResizeToFit(); - } - - private void DrawMenu() + private void InitializeMultiColumn() { - using (new EditorGUILayout.HorizontalScope(EditorStyles.toolbar)) - { - if (GUILayout.Button(EditorGUIUtility.IconContent("Refresh", "Refresh"), EditorStyles.toolbarButton)) - { - LoadValidators(); - } + columns = new MultiColumnHeaderState.Column[] + { + new MultiColumnHeaderState.Column() + { + allowToggleVisibility = false, // At least one column must be there. + autoResize = false, + width = 36f, + minWidth = 36f, + maxWidth = 36f, + canSort = false, + sortingArrowAlignment = TextAlignment.Right, + headerContent = EditorGUIUtility.IconContent("d_console.erroricon.inactive.sml", "Warning Type."), + headerTextAlignment = TextAlignment.Center, + }, + new MultiColumnHeaderState.Column() + { + allowToggleVisibility = true, + autoResize = false, + width = 36f, + minWidth = 36f, + maxWidth = 36f, + canSort = false, + sortingArrowAlignment = TextAlignment.Right, + headerContent = EditorGUIUtility.IconContent("Animation.FilterBySelection", "Target Objects"), + headerTextAlignment = TextAlignment.Center, + }, + new MultiColumnHeaderState.Column() + { + allowToggleVisibility = true, + autoResize = true, + width = 75.0f, + minWidth = 75.0f, + canSort = false, + sortingArrowAlignment = TextAlignment.Right, + headerContent = new GUIContent("Category", "Warning Category."), + headerTextAlignment = TextAlignment.Center, + }, + new MultiColumnHeaderState.Column() + { + allowToggleVisibility = true, + autoResize = true, + width = 200.0f, + minWidth = 200.0f, + canSort = false, + sortingArrowAlignment = TextAlignment.Right, + headerContent = new GUIContent("Message", "Warning Message."), + headerTextAlignment = TextAlignment.Center, + }, + new MultiColumnHeaderState.Column() + { + allowToggleVisibility = true, + autoResize = true, + width = 200.0f, + minWidth = 200.0f, + canSort = false, + sortingArrowAlignment = TextAlignment.Right, + headerContent = new GUIContent("Solution", "Warning Solution."), + headerTextAlignment = TextAlignment.Center, + }, + }; + + multiColumnHeaderState = new MultiColumnHeaderState(columns); + multiColumnHeader = new MultiColumnHeader(multiColumnHeaderState); + multiColumnHeader.ResizeToFit(); + } + + private void DrawMenu() + { + using (new EditorGUILayout.HorizontalScope(EditorStyles.toolbar)) + { + if (GUILayout.Button(EditorGUIUtility.IconContent("Refresh", "Refresh"), EditorStyles.toolbarButton)) + { + LoadValidators(); + } if (GUILayout.Button(EditorGUIUtility.IconContent("d_Settings", "Select validator"), EditorStyles.toolbarButton)) { GenericMenu validatorOptionsMenu = new GenericMenu(); validatorOptionsMenu.AddItem(new GUIContent($"All"), false, OnValidatorInfoVisibilityAllEvent); validatorOptionsMenu.AddItem(new GUIContent($"None"), false, OnValidatorInfoVisibilityNoneEvent); - validatorOptionsMenu.AddSeparator(""); + validatorOptionsMenu.AddSeparator(""); foreach (ValidatorInfo validatorInfo in validators) { validatorOptionsMenu.AddItem(new GUIContent($"{validatorInfo.validator.MenuName}"), validatorInfo.isEnabled, OnValidatorInfoVisibilityChangedEvent, validatorInfo); @@ -162,278 +162,278 @@ namespace Validator.Editor } if (GUILayout.Button(EditorGUIUtility.IconContent("PlayButton", "Run all"), EditorStyles.toolbarButton)) - { - RunValidators(); - UpdateStats(); - } - - GUILayout.FlexibleSpace(); - - settings.searchInput = GUILayout.TextField(settings.searchInput, EditorStyles.toolbarSearchField, GUILayout.MaxWidth(300)); - - if(reportStats != null) { - settings.showInfo = GUILayout.Toggle(settings.showInfo, new GUIContent($"{reportStats.infoCount}", EditorGUIUtility.IconContent(GetWarningIconName(WarningType.Info)).image), EditorStyles.toolbarButton); - settings.showWarning = GUILayout.Toggle(settings.showWarning, new GUIContent($"{reportStats.warningCount}", EditorGUIUtility.IconContent(GetWarningIconName(WarningType.Warning)).image), EditorStyles.toolbarButton); - settings.showError = GUILayout.Toggle(settings.showError, new GUIContent($"{reportStats.errorCount}", EditorGUIUtility.IconContent(GetWarningIconName(WarningType.Error)).image), EditorStyles.toolbarButton); + RunValidators(); + UpdateStats(); } - } - } - private void DrawMultiColumnScope() - { - //GUILayout.FlexibleSpace(); // If nothing has been drawn yet, uncomment this because GUILayoutUtility.GetLastRect() needs it. - Rect windowRect = GUILayoutUtility.GetLastRect(); - windowRect.width = position.width; - windowRect.height = position.height; + GUILayout.FlexibleSpace(); - if (multiColumnHeader == null) - { - InitializeMultiColumn(); - } + settings.searchInput = GUILayout.TextField(settings.searchInput, EditorStyles.toolbarSearchField, GUILayout.MaxWidth(300)); - float columnHeight = EditorGUIUtility.singleLineHeight * 2; + if(reportStats != null) + { + settings.showInfo = GUILayout.Toggle(settings.showInfo, new GUIContent($"{reportStats.infoCount}", EditorGUIUtility.IconContent(GetWarningIconName(WarningType.Info)).image), EditorStyles.toolbarButton); + settings.showWarning = GUILayout.Toggle(settings.showWarning, new GUIContent($"{reportStats.warningCount}", EditorGUIUtility.IconContent(GetWarningIconName(WarningType.Warning)).image), EditorStyles.toolbarButton); + settings.showError = GUILayout.Toggle(settings.showError, new GUIContent($"{reportStats.errorCount}", EditorGUIUtility.IconContent(GetWarningIconName(WarningType.Error)).image), EditorStyles.toolbarButton); + } + } + } - Rect headerRect = new Rect(windowRect) - { - height = EditorGUIUtility.singleLineHeight, - }; + private void DrawMultiColumnScope() + { + //GUILayout.FlexibleSpace(); // If nothing has been drawn yet, uncomment this because GUILayoutUtility.GetLastRect() needs it. + Rect windowRect = GUILayoutUtility.GetLastRect(); + windowRect.width = position.width; + windowRect.height = position.height; - Rect scrollViewPositionRect = GUILayoutUtility.GetRect(0, float.MaxValue, 0, float.MaxValue); - scrollViewPositionRect.y += headerRect.height - EditorGUIUtility.standardVerticalSpacing; - scrollViewPositionRect.height -= headerRect.height - EditorGUIUtility.standardVerticalSpacing; - - Rect scrollViewRect = new Rect(windowRect) - { - width = multiColumnHeaderState.widthOfAllVisibleColumns, - height = rows * columnHeight - }; - - Rect rowRect = new Rect(windowRect) - { - width = multiColumnHeaderWidth, - height = columnHeight, - }; - - // Draw column header. - multiColumnHeader.OnGUI(headerRect, scrollPosition.x); - - // Draw scroll view. - using (GUI.ScrollViewScope scope = new GUI.ScrollViewScope(scrollViewPositionRect, scrollPosition, scrollViewRect, false, false)) + if (multiColumnHeader == null) { - scrollPosition = scope.scrollPosition; - multiColumnHeaderWidth = Mathf.Max(scrollViewPositionRect.width + scrollPosition.x, multiColumnHeaderWidth); + InitializeMultiColumn(); + } - rows = 0; - for (int i = 0; i < reports.Count; i++) - { - for (int j = 0; j < reports[i].Reports.Count; j++) - { - // Type filter. + float columnHeight = EditorGUIUtility.singleLineHeight * 2; + + Rect headerRect = new Rect(windowRect) + { + height = EditorGUIUtility.singleLineHeight, + }; + + Rect scrollViewPositionRect = GUILayoutUtility.GetRect(0, float.MaxValue, 0, float.MaxValue); + scrollViewPositionRect.y += headerRect.height - EditorGUIUtility.standardVerticalSpacing; + scrollViewPositionRect.height -= headerRect.height - EditorGUIUtility.standardVerticalSpacing; + + Rect scrollViewRect = new Rect(windowRect) + { + width = multiColumnHeaderState.widthOfAllVisibleColumns, + height = rows * columnHeight + }; + + Rect rowRect = new Rect(windowRect) + { + width = multiColumnHeaderWidth, + height = columnHeight, + }; + + // Draw column header. + multiColumnHeader.OnGUI(headerRect, scrollPosition.x); + + // Draw scroll view. + using (GUI.ScrollViewScope scope = new GUI.ScrollViewScope(scrollViewPositionRect, scrollPosition, scrollViewRect, false, false)) + { + scrollPosition = scope.scrollPosition; + multiColumnHeaderWidth = Mathf.Max(scrollViewPositionRect.width + scrollPosition.x, multiColumnHeaderWidth); + + rows = 0; + for (int i = 0; i < reports.Count; i++) + { + for (int j = 0; j < reports[i].Reports.Count; j++) + { + // Type filter. switch (reports[i].Reports[j].WarningType) { case WarningType.Info: - if (!settings.showInfo) - continue; + if (!settings.showInfo) + continue; break; case WarningType.Warning: - if (!settings.showWarning) - continue; - break; + if (!settings.showWarning) + continue; + break; case WarningType.Error: - if (!settings.showError) - continue; - break; + if (!settings.showError) + continue; + break; default: break; } - // Search filter. - if (!string.IsNullOrWhiteSpace(settings.searchInput)) + // Search filter. + if (!string.IsNullOrWhiteSpace(settings.searchInput)) { if (!reports[i].Reports[j].Category.Contains(settings.searchInput) && !reports[i].Reports[j].Message.Contains(settings.searchInput) && !reports[i].Reports[j].Solution.Contains(settings.searchInput)) { - continue; + continue; } } // Only draw what is visible within the view. if (rowRect.yMax > windowRect.y + scrollPosition.y && rowRect.yMin < windowRect.height + scrollPosition.y) { - if (rows % 2 == 0) - { - EditorGUI.DrawRect(rowRect, settings.darkColor); - } - else - { - EditorGUI.DrawRect(rowRect, settings.lightColor); - } + if (rows % 2 == 0) + { + EditorGUI.DrawRect(rowRect, settings.darkColor); + } + else + { + EditorGUI.DrawRect(rowRect, settings.lightColor); + } - // Warning Field. - int columnIndex = 0; - if (multiColumnHeader.IsColumnVisible(columnIndex)) - { - int visibleColumnIndex = multiColumnHeader.GetVisibleColumnIndex(columnIndex); - Rect columnRect = multiColumnHeader.GetColumnRect(visibleColumnIndex); - columnRect.y = rowRect.y; - columnRect.height = rowRect.height; + // Warning Field. + int columnIndex = 0; + if (multiColumnHeader.IsColumnVisible(columnIndex)) + { + int visibleColumnIndex = multiColumnHeader.GetVisibleColumnIndex(columnIndex); + Rect columnRect = multiColumnHeader.GetColumnRect(visibleColumnIndex); + columnRect.y = rowRect.y; + columnRect.height = rowRect.height; - Rect labelFieldRect = multiColumnHeader.GetCellRect(visibleColumnIndex, columnRect); - labelFieldRect.x += 9; - labelFieldRect.width -= 9; + Rect labelFieldRect = multiColumnHeader.GetCellRect(visibleColumnIndex, columnRect); + labelFieldRect.x += 9; + labelFieldRect.width -= 9; - EditorGUI.LabelField( - labelFieldRect, - EditorGUIUtility.IconContent(GetWarningIconName(reports[i].Reports[j].WarningType), $"{reports[i].Reports[j].WarningType}") - ); - } + EditorGUI.LabelField( + labelFieldRect, + EditorGUIUtility.IconContent(GetWarningIconName(reports[i].Reports[j].WarningType), $"{reports[i].Reports[j].WarningType}") + ); + } - // Target Field. - columnIndex = 1; - if (multiColumnHeader.IsColumnVisible(columnIndex)) - { - int visibleColumnIndex = multiColumnHeader.GetVisibleColumnIndex(columnIndex); - Rect columnRect = multiColumnHeader.GetColumnRect(visibleColumnIndex); - columnRect.y = rowRect.y; - columnRect.height = rowRect.height; + // Target Field. + columnIndex = 1; + if (multiColumnHeader.IsColumnVisible(columnIndex)) + { + int visibleColumnIndex = multiColumnHeader.GetVisibleColumnIndex(columnIndex); + Rect columnRect = multiColumnHeader.GetColumnRect(visibleColumnIndex); + columnRect.y = rowRect.y; + columnRect.height = rowRect.height; - if(reports[i].Reports[j].Target != null) + if(reports[i].Reports[j].Target != null) { - if (GUI.Button( - multiColumnHeader.GetCellRect(visibleColumnIndex, columnRect), - EditorGUIUtility.IconContent("Animation.FilterBySelection", "Ping Object") - )) - { - Selection.objects = new Object[] { reports[i].Reports[j].Target }; + if (GUI.Button( + multiColumnHeader.GetCellRect(visibleColumnIndex, columnRect), + EditorGUIUtility.IconContent("Animation.FilterBySelection", "Ping Object") + )) + { + Selection.objects = new Object[] { reports[i].Reports[j].Target }; - if (!Selection.activeObject) - { - Debug.Log($"{nameof(Selection.activeObject)} is null."); - continue; - } + if (!Selection.activeObject) + { + Debug.Log($"{nameof(Selection.activeObject)} is null."); + continue; + } - foreach (Object o in Selection.objects) - { - EditorGUIUtility.PingObject(o); - } - } + foreach (Object o in Selection.objects) + { + EditorGUIUtility.PingObject(o); + } + } } - } + } - // Category Field. - columnIndex = 2; - if (multiColumnHeader.IsColumnVisible(columnIndex)) - { - int visibleColumnIndex = multiColumnHeader.GetVisibleColumnIndex(columnIndex); - Rect columnRect = multiColumnHeader.GetColumnRect(visibleColumnIndex); - columnRect.y = rowRect.y; - columnRect.height = rowRect.height; + // Category Field. + columnIndex = 2; + if (multiColumnHeader.IsColumnVisible(columnIndex)) + { + int visibleColumnIndex = multiColumnHeader.GetVisibleColumnIndex(columnIndex); + Rect columnRect = multiColumnHeader.GetColumnRect(visibleColumnIndex); + columnRect.y = rowRect.y; + columnRect.height = rowRect.height; - Rect labelFieldRect = multiColumnHeader.GetCellRect(visibleColumnIndex, columnRect); - labelFieldRect.x += 7; - labelFieldRect.width -= 7; + Rect labelFieldRect = multiColumnHeader.GetCellRect(visibleColumnIndex, columnRect); + labelFieldRect.x += 7; + labelFieldRect.width -= 7; - EditorGUI.LabelField( - labelFieldRect, - new GUIContent($"{reports[i].Reports[j].Category}") - ); - } + EditorGUI.LabelField( + labelFieldRect, + new GUIContent($"{reports[i].Reports[j].Category}") + ); + } - // Message Field. - columnIndex = 3; - if (multiColumnHeader.IsColumnVisible(columnIndex)) - { - int visibleColumnIndex = multiColumnHeader.GetVisibleColumnIndex(columnIndex); - Rect columnRect = multiColumnHeader.GetColumnRect(visibleColumnIndex); - columnRect.y = rowRect.y; - columnRect.height = rowRect.height; + // Message Field. + columnIndex = 3; + if (multiColumnHeader.IsColumnVisible(columnIndex)) + { + int visibleColumnIndex = multiColumnHeader.GetVisibleColumnIndex(columnIndex); + Rect columnRect = multiColumnHeader.GetColumnRect(visibleColumnIndex); + columnRect.y = rowRect.y; + columnRect.height = rowRect.height; - Rect labelFieldRect = multiColumnHeader.GetCellRect(visibleColumnIndex, columnRect); - labelFieldRect.x += 7; - labelFieldRect.width -= 7; + Rect labelFieldRect = multiColumnHeader.GetCellRect(visibleColumnIndex, columnRect); + labelFieldRect.x += 7; + labelFieldRect.width -= 7; - EditorGUI.LabelField( - labelFieldRect, - new GUIContent($"{reports[i].Reports[j].Message}") - ); - } + EditorGUI.LabelField( + labelFieldRect, + new GUIContent($"{reports[i].Reports[j].Message}") + ); + } - // Solution Field. - columnIndex = 4; - if (multiColumnHeader.IsColumnVisible(columnIndex)) - { - int visibleColumnIndex = multiColumnHeader.GetVisibleColumnIndex(columnIndex); - Rect columnRect = multiColumnHeader.GetColumnRect(visibleColumnIndex); - columnRect.y = rowRect.y; - columnRect.height = rowRect.height; + // Solution Field. + columnIndex = 4; + if (multiColumnHeader.IsColumnVisible(columnIndex)) + { + int visibleColumnIndex = multiColumnHeader.GetVisibleColumnIndex(columnIndex); + Rect columnRect = multiColumnHeader.GetColumnRect(visibleColumnIndex); + columnRect.y = rowRect.y; + columnRect.height = rowRect.height; - Rect labelFieldRect = multiColumnHeader.GetCellRect(visibleColumnIndex, columnRect); - labelFieldRect.x += 7; - labelFieldRect.width -= 7; + Rect labelFieldRect = multiColumnHeader.GetCellRect(visibleColumnIndex, columnRect); + labelFieldRect.x += 7; + labelFieldRect.width -= 7; - EditorGUI.LabelField( - labelFieldRect, - new GUIContent($"{reports[i].Reports[j].Solution}") - ); - } - } + EditorGUI.LabelField( + labelFieldRect, + new GUIContent($"{reports[i].Reports[j].Solution}") + ); + } + } - rowRect.y += columnHeight; - rows++; - } - } - scope.handleScrollWheel = true; - } - } - - private void LoadValidators() - { - for (int i = validators.Count - 1; i >= 0; i--) - { - if (validators[i].validator == null) - { - validators.RemoveAt(i); - } - } - - foreach (Type type in GetValidatorTypes()) - { - bool hasValidator = false; - foreach (ValidatorInfo validatorInfo in validators) - { - if (validatorInfo.validator.GetType() == type) - { - hasValidator = true; - } - } - - if (!hasValidator) - { - IValidator validator = (IValidator)Activator.CreateInstance(type); - if (validator != null) - { - validators.Add(new ValidatorInfo(validator)); - } - } - } - } - - private void RunValidators() - { - reports.Clear(); - - foreach (ValidatorInfo validatorInfo in validators) - { - if (validatorInfo.isEnabled) - { - reports.Add(validatorInfo.validator.Validate()); - } + rowRect.y += columnHeight; + rows++; + } + } + scope.handleScrollWheel = true; } } - private void UpdateStats() + private void LoadValidators() { - reportStats = new ReportStats(); + for (int i = validators.Count - 1; i >= 0; i--) + { + if (validators[i].validator == null) + { + validators.RemoveAt(i); + } + } + + foreach (Type type in GetValidatorTypes()) + { + bool hasValidator = false; + foreach (ValidatorInfo validatorInfo in validators) + { + if (validatorInfo.validator.GetType() == type) + { + hasValidator = true; + } + } + + if (!hasValidator) + { + IValidator validator = (IValidator)Activator.CreateInstance(type); + if (validator != null) + { + validators.Add(new ValidatorInfo(validator)); + } + } + } + } + + private void RunValidators() + { + reports.Clear(); + + foreach (ValidatorInfo validatorInfo in validators) + { + if (validatorInfo.isEnabled) + { + reports.Add(validatorInfo.validator.Validate()); + } + } + } + + private void UpdateStats() + { + reportStats = new ReportStats(); foreach (Report report in reports) { @@ -442,7 +442,7 @@ namespace Validator.Editor switch (report.Reports[i].WarningType) { case WarningType.Info: - reportStats.infoCount++; + reportStats.infoCount++; break; case WarningType.Warning: reportStats.warningCount++; @@ -451,26 +451,26 @@ namespace Validator.Editor reportStats.errorCount++; break; default: - break; + break; } } } } private void OnValidatorInfoVisibilityChangedEvent(object info) - { - if(info is ValidatorInfo validatorInfo) + { + if(info is ValidatorInfo validatorInfo) { - validatorInfo.isEnabled = !validatorInfo.isEnabled; - } + validatorInfo.isEnabled = !validatorInfo.isEnabled; + } } - private void OnValidatorInfoVisibilityAllEvent() + private void OnValidatorInfoVisibilityAllEvent() { foreach (ValidatorInfo validatorInfo in validators) { - validatorInfo.isEnabled = true; - } + validatorInfo.isEnabled = true; + } } private void OnValidatorInfoVisibilityNoneEvent() @@ -483,10 +483,10 @@ namespace Validator.Editor private static Type[] GetValidatorTypes() { - return TypeCache.GetTypesDerivedFrom().ToArray(); - } + return TypeCache.GetTypesDerivedFrom().ToArray(); + } - private static string GetWarningIconName(WarningType warningType) + private static string GetWarningIconName(WarningType warningType) { return warningType switch { diff --git a/Editor/Validators/RequiredAttributeValidator.cs b/Editor/Validators/RequiredAttributeValidator.cs index 41db6b6..4b108e6 100644 --- a/Editor/Validators/RequiredAttributeValidator.cs +++ b/Editor/Validators/RequiredAttributeValidator.cs @@ -16,7 +16,7 @@ namespace Validator.Editor { Report report = new Report(nameof(RequiredAttributeAssetValidator)); - List objects = AssetValidator.FindAssetsByType(); + List objects = ValidatableAssetValidator.FindAssetsByType(); for (int i = 0; i < objects.Count; i++) { @@ -52,7 +52,7 @@ namespace Validator.Editor { Report report = new Report(nameof(RequiredAttributeSceneValidator)); - List objects = SceneValidator.FindAllObjectsOfType(); + List objects = ValidatableSceneValidator.FindAllObjectsOfType(); for (int i = 0; i < objects.Count; i++) { diff --git a/Editor/Validators/SceneValidator.cs b/Editor/Validators/SceneValidator.cs deleted file mode 100644 index 6fa6060..0000000 --- a/Editor/Validators/SceneValidator.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System.Collections.Generic; -using UnityEditor; -using UnityEngine; -using UnityEngine.SceneManagement; - -namespace Validator.Editor -{ - public class SceneValidator : IValidator - { - public string MenuName => nameof(SceneValidator); - - public Report Validate() - { - Report report = new Report(nameof(SceneValidator)); - - List objects = FindAllObjectsOfType(); - for (int i = 0; i < objects.Count; i++) - { - EditorUtility.DisplayProgressBar("SceneValidator", "Validate...", (float)i / objects.Count); - - objects[i].Validate(report); - } - EditorUtility.ClearProgressBar(); - - return report; - } - - private static List GetAllRootGameObjects() - { - List gameObjects = new List(); - - for (int i = 0; i < SceneManager.sceneCount; i++) - { - EditorUtility.DisplayProgressBar("SceneValidator", "GetAllRootGameObjects...", (float)i / SceneManager.sceneCount); - gameObjects.AddRange(SceneManager.GetSceneAt(i).GetRootGameObjects()); - } - EditorUtility.ClearProgressBar(); - - return gameObjects; - } - - public static List FindAllObjectsOfType() - { - List objects = new List(); - - List gameObjects = GetAllRootGameObjects(); - for (int i = 0; i < gameObjects.Count; i++) - { - EditorUtility.DisplayProgressBar("SceneValidator", "FindAllObjectsOfType...", (float)i / gameObjects.Count); - objects.AddRange(gameObjects[i].GetComponentsInChildren(true)); - } - EditorUtility.ClearProgressBar(); - - return objects; - } - } -} \ No newline at end of file diff --git a/Editor/Validators/AssetValidator.cs b/Editor/Validators/ValidatableAssetValidator.cs similarity index 85% rename from Editor/Validators/AssetValidator.cs rename to Editor/Validators/ValidatableAssetValidator.cs index 3cee642..4c38b68 100644 --- a/Editor/Validators/AssetValidator.cs +++ b/Editor/Validators/ValidatableAssetValidator.cs @@ -4,13 +4,13 @@ using UnityEngine; namespace Validator.Editor { - public class AssetValidator : IValidator + public class ValidatableAssetValidator : IValidator { - public string MenuName => nameof(AssetValidator); + public string MenuName => nameof(ValidatableAssetValidator); public Report Validate() { - Report report = new Report(nameof(AssetValidator)); + Report report = new Report(nameof(ValidatableAssetValidator)); List objects = FindAssetsByType(); for (int i = 0; i < objects.Count; i++) diff --git a/Editor/Validators/AssetValidator.cs.meta b/Editor/Validators/ValidatableAssetValidator.cs.meta similarity index 100% rename from Editor/Validators/AssetValidator.cs.meta rename to Editor/Validators/ValidatableAssetValidator.cs.meta diff --git a/Editor/Validators/ValidatableSceneValidator.cs b/Editor/Validators/ValidatableSceneValidator.cs new file mode 100644 index 0000000..ac6d379 --- /dev/null +++ b/Editor/Validators/ValidatableSceneValidator.cs @@ -0,0 +1,57 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace Validator.Editor +{ + public class ValidatableSceneValidator : IValidator + { + public string MenuName => nameof(ValidatableSceneValidator); + + public Report Validate() + { + Report report = new Report(nameof(ValidatableSceneValidator)); + + List objects = FindAllObjectsOfType(); + for (int i = 0; i < objects.Count; i++) + { + EditorUtility.DisplayProgressBar("SceneValidator", "Validate...", (float)i / objects.Count); + + objects[i].Validate(report); + } + EditorUtility.ClearProgressBar(); + + return report; + } + + private static List GetAllRootGameObjects() + { + List gameObjects = new List(); + + for (int i = 0; i < SceneManager.sceneCount; i++) + { + EditorUtility.DisplayProgressBar("SceneValidator", "GetAllRootGameObjects...", (float)i / SceneManager.sceneCount); + gameObjects.AddRange(SceneManager.GetSceneAt(i).GetRootGameObjects()); + } + EditorUtility.ClearProgressBar(); + + return gameObjects; + } + + public static List FindAllObjectsOfType() + { + List objects = new List(); + + List gameObjects = GetAllRootGameObjects(); + for (int i = 0; i < gameObjects.Count; i++) + { + EditorUtility.DisplayProgressBar("SceneValidator", "FindAllObjectsOfType...", (float)i / gameObjects.Count); + objects.AddRange(gameObjects[i].GetComponentsInChildren(true)); + } + EditorUtility.ClearProgressBar(); + + return objects; + } + } +} \ No newline at end of file diff --git a/Editor/Validators/SceneValidator.cs.meta b/Editor/Validators/ValidatableSceneValidator.cs.meta similarity index 100% rename from Editor/Validators/SceneValidator.cs.meta rename to Editor/Validators/ValidatableSceneValidator.cs.meta diff --git a/Runtime/ReportCategories.cs b/Runtime/ReportCategories.cs index 4a08f2c..6dd2c39 100644 --- a/Runtime/ReportCategories.cs +++ b/Runtime/ReportCategories.cs @@ -1,9 +1,9 @@ namespace Validator { - public static partial class ReportCategories - { - public const string Art = "Art"; - public const string Design = "Design"; - public const string Code = "Code"; - } + public static partial class ReportCategories + { + public const string Art = "Art"; + public const string Design = "Design"; + public const string Code = "Code"; + } } \ No newline at end of file diff --git a/Runtime/Validators/Attributes/RequiredAttribute.cs b/Runtime/Validators/Attributes/RequiredAttribute.cs index 3bff5e7..4b061a1 100644 --- a/Runtime/Validators/Attributes/RequiredAttribute.cs +++ b/Runtime/Validators/Attributes/RequiredAttribute.cs @@ -2,10 +2,10 @@ using System; namespace Validator { - [AttributeUsage(AttributeTargets.Field, Inherited = true, AllowMultiple = false)] - public class RequiredAttribute : Attribute - { - public WarningType WarningType { get; private set; } = WarningType.Error; + [AttributeUsage(AttributeTargets.Field, Inherited = true, AllowMultiple = false)] + public class RequiredAttribute : Attribute + { + public WarningType WarningType { get; private set; } = WarningType.Error; public string Category { get; private set; } = ReportCategories.Design; public RequiredAttribute() { }