// This code is part of the Fungus library (http://fungusgames.com) maintained by Chris Gregan (http://twitter.com/gofungus). // It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE) // Adapted from the Unity Test Tools project (MIT license) // https://bitbucket.org/Unity-Technologies/unitytesttools/src/a30d562427e9/Assets/UnityTestTools/ using System; using System.Reflection; using UnityEditor; using UnityEngine; namespace Fungus { [CustomEditor(typeof(ExecuteHandler))] public class ExecuteHandlerEditor : Editor { private readonly DropDownControl m_ComparerDropDown = new DropDownControl(); #region GUI Contents private readonly GUIContent m_GUIExecuteAfterTimeGuiContent = new GUIContent("Execute after (seconds)", "After how many seconds the script should be executed"); private readonly GUIContent m_GUIRepeatExecuteTimeGuiContent = new GUIContent("Repeat execute", "Should the execution be repeated."); private readonly GUIContent m_GUIRepeatEveryTimeGuiContent = new GUIContent("Frequency of repetitions", "How often should the execution be done"); private readonly GUIContent m_GUIExecuteAfterFramesGuiContent = new GUIContent("Execute after (frames)", "After how many frames the script should be executed"); private readonly GUIContent m_GUIRepeatExecuteFrameGuiContent = new GUIContent("Repeat execution", "Should the execution be repeated."); #endregion public ExecuteHandlerEditor() { m_ComparerDropDown.convertForButtonLabel = type => type.Name; m_ComparerDropDown.convertForGUIContent = type => type.Name; m_ComparerDropDown.ignoreConvertForGUIContent = types => false; m_ComparerDropDown.tooltip = "Comparer that will be used to compare values and determine the result of assertion."; } public override void OnInspectorGUI() { var executeHandler = (ExecuteHandler)target; EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel(new GUIContent("On Event")); executeHandler.ExecuteMethods = (ExecuteMethod)EditorGUILayout.EnumMaskField(executeHandler.ExecuteMethods, EditorStyles.popup, GUILayout.ExpandWidth(false)); EditorGUILayout.EndHorizontal(); if (executeHandler.IsExecuteMethodSelected(ExecuteMethod.AfterPeriodOfTime)) { DrawOptionsForAfterPeriodOfTime(executeHandler); } if (executeHandler.IsExecuteMethodSelected(ExecuteMethod.Update)) { DrawOptionsForOnUpdate(executeHandler); } if (Application.isPlaying) { EditorGUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button(new GUIContent("Execute Now", "Execute the script immediately."))) { executeHandler.Execute(); } GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); } } private void DrawOptionsForAfterPeriodOfTime(ExecuteHandler executeHandler) { EditorGUILayout.Space(); executeHandler.ExecuteAfterTime = EditorGUILayout.FloatField(m_GUIExecuteAfterTimeGuiContent, executeHandler.ExecuteAfterTime); if (executeHandler.ExecuteAfterTime < 0) executeHandler.ExecuteAfterTime = 0; executeHandler.RepeatExecuteTime = EditorGUILayout.Toggle(m_GUIRepeatExecuteTimeGuiContent, executeHandler.RepeatExecuteTime); if (executeHandler.RepeatExecuteTime) { executeHandler.RepeatEveryTime = EditorGUILayout.FloatField(m_GUIRepeatEveryTimeGuiContent, executeHandler.RepeatEveryTime); if (executeHandler.RepeatEveryTime < 0) executeHandler.RepeatEveryTime = 0; } } private void DrawOptionsForOnUpdate(ExecuteHandler executeHandler) { EditorGUILayout.Space(); executeHandler.ExecuteAfterFrames = EditorGUILayout.IntField(m_GUIExecuteAfterFramesGuiContent, executeHandler.ExecuteAfterFrames); if (executeHandler.ExecuteAfterFrames < 1) executeHandler.ExecuteAfterFrames = 1; executeHandler.RepeatExecuteFrame = EditorGUILayout.Toggle(m_GUIRepeatExecuteFrameGuiContent, executeHandler.RepeatExecuteFrame); if (executeHandler.RepeatExecuteFrame) { executeHandler.RepeatEveryFrame = EditorGUILayout.IntField(m_GUIRepeatEveryTimeGuiContent, executeHandler.RepeatEveryFrame); if (executeHandler.RepeatEveryFrame < 1) executeHandler.RepeatEveryFrame = 1; } } } }