Skip to content
Snippets Groups Projects
PulseEngineDriverEditor.cs 3.33 KiB
Newer Older
/* Distributed under the Apache License, Version 2.0.
   See accompanying NOTICE file for details.*/

using UnityEngine;
using UnityEditor;
using System.IO;

[CustomEditor(typeof(PulseEngineDriver), true)]
public class PulseEngineDriverEditor : Editor
{
    SerializedProperty stateFileProperty;   // serialized initial state file
    SerializedProperty timeStepProperty;
    SerializedProperty formatProperty;

    void OnEnable()
    {
        stateFileProperty = serializedObject.FindProperty("initialStateFile");
        timeStepProperty = serializedObject.FindProperty("timeStepProperty");
        formatProperty = serializedObject.FindProperty("serializationFormat");
    }

    public override void OnInspectorGUI()
    {
        // Ensure serialized properties are up to date with component
        serializedObject.Update();

        // Check that pulse data files are in the streaming asset folder
        var driver = target as PulseEngineDriver;
        string path = Application.streamingAssetsPath + "/" + driver.engineDataPath;
        DirectoryInfo directoryInfo = new DirectoryInfo(path);
        bool valid = false;
        if (directoryInfo.Exists)
            DirectoryInfo[] pulseDirectories = directoryInfo.GetDirectories();
            bool ecg = false,
            environments = false,
            nutrition = false,
            substances = false;
            foreach (DirectoryInfo dir in pulseDirectories)
            {
                if (dir.Name.Equals("ecg"))
                    ecg = true;
                else if (dir.Name.Equals("environments"))
                    environments = true;
                else if (dir.Name.Equals("nutrition"))
                    nutrition = true;
                else if (dir.Name.Equals("substances"))
                    substances = true;
            }
            valid = ecg && environments && nutrition && substances;
            string message = "Missing data files expected at '" + path + "'.\n" +
                "Copy the '" + driver.engineDataPath + "' folder located in the " +
                "'StreamingAssets' of the Pulse asset to the top-level 'StreamingAssets' " +
                "folder of your Unity project (in 'Assets/StreamingAssets').";

            EditorGUILayout.HelpBox(message, MessageType.Warning);

            serializedObject.ApplyModifiedProperties();
            return;
        }

        // Draw UI to select initial state file
        EditorGUILayout.PropertyField(stateFileProperty,
                                      new GUIContent("Initial State File"));
        var state = stateFileProperty.objectReferenceValue as TextAsset;
        if (state == null)
        {
            string message = "A state file is required to initialize the " +
                "Pulse engine. You can find an example file in 'Data/states' " +
                "or generate one by running the Pulse engine and save a " +
                "state to file (Unity will only accept '.txt' files).";
            EditorGUILayout.HelpBox(message, MessageType.Warning);
            return;
        }

        // Show the default inspector property editor without the script field
        DrawPropertiesExcluding(serializedObject, "m_Script", "initialStateFile");

        // Apply modifications back to the component
        serializedObject.ApplyModifiedProperties();
    }
}