Advertisement
thebeardphantom

EventManagerGUI

Dec 12th, 2013
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.25 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEditor;
  5. using System.Linq;
  6. using BSGTools.Utility;
  7.  
  8. namespace BSGTools {
  9.     namespace Events {
  10.         [CustomEditor(typeof(EventManager))]
  11.         public class EventManagerGUI : Editor {
  12.             Vector2 scroll = Vector2.zero;
  13.             delegate string[] GetNames(MonoBehaviour[] behavior);
  14.             float delay = 0f;
  15.             string name = "";
  16.             List<bool> foldouts = new List<bool>();
  17.             EventManager manager;
  18.  
  19.             void Reset() {
  20.                 manager = manager ?? target as EventManager;
  21.                 manager.tasks = manager.tasks ?? new List<ScriptableObject>();
  22.             }
  23.  
  24.             public override void OnInspectorGUI() {
  25.                 EditorGUI.indentLevel = 1;
  26.                 manager = manager ?? target as EventManager;
  27.                 DrawDefaultInspector();
  28.                 CreateEventButton();
  29.                 CreateDelayButton();
  30.  
  31.                 scroll = EditorGUILayout.BeginScrollView(scroll);
  32.                 EditorGUILayout.BeginVertical();
  33.                 GUILayout.Space(20f);
  34.  
  35.                 if(foldouts.Count == 0) {
  36.                     foldouts.Clear();
  37.                     foreach(ScriptableObject so in manager.tasks)
  38.                         foldouts.Add(false);
  39.                 }
  40.  
  41.                 for(int i = 0; i < manager.tasks.Count; i++) {
  42.                     EditorGUI.indentLevel = 1;
  43.                     ScriptableObject e = manager.tasks[i];
  44.  
  45.                     foldouts[i] = EditorGUILayout.Foldout(foldouts[i], GetFoldoutName(e));
  46.                     if(!foldouts[i])
  47.                         continue;
  48.                     EditorGUI.indentLevel = 3;
  49.                     EditorGUILayout.BeginVertical();
  50.                     if(EditorGUILayout.ToggleLeft("Delete", false) && ShowEventDeleteConfirmation(e)) {
  51.                         manager.tasks.RemoveAt(i);
  52.                         foldouts.RemoveAt(i);
  53.                         continue;
  54.                     }
  55.                     if(EditorGUILayout.ToggleLeft("Move Up", false)) {
  56.                         manager.tasks.ModifyIndex(i, -1);
  57.                         foldouts.ModifyIndex(i, -1);
  58.                     }
  59.                     if(EditorGUILayout.ToggleLeft("Move Down", false)) {
  60.                         manager.tasks.ModifyIndex(i, 1);
  61.                         foldouts.ModifyIndex(i, 1);
  62.                     }
  63.  
  64.                     if(e.GetType().Equals(typeof(EventTask)))
  65.                         DrawEventTask(e as EventTask);
  66.                     else if(e.GetType().Equals(typeof(DelayTask)))
  67.                         DrawDelayTask(e as DelayTask);
  68.                     EditorGUILayout.EndVertical();
  69.                 }
  70.                 EditorGUILayout.EndVertical();
  71.                 EditorGUILayout.EndScrollView();
  72.                 if(GUI.changed)
  73.                     EditorUtility.SetDirty(manager);
  74.             }
  75.  
  76.             private bool ShowEventDeleteConfirmation(ScriptableObject e) {
  77.                 if(e.GetType().Equals(typeof(DelayTask)))
  78.                     return true;
  79.                 return EditorUtility.DisplayDialog(string.Format("Delete Event '{0}' ?", GetFoldoutName(e)), "This is irreversible!", "DELETE!", "DON'T DELETE!");
  80.             }
  81.  
  82.             private string GetFoldoutName(ScriptableObject e) {
  83.                 if(e.GetType().Equals(typeof(EventTask))) {
  84.                     return ((EventTask) e).eventNickname;
  85.                 }
  86.                 else {
  87.                     return string.Format("DelayTask: {0}", ((DelayTask) e).delay);
  88.                 }
  89.             }
  90.  
  91.             private void CreateEventButton() {
  92.                 EditorGUILayout.BeginHorizontal();
  93.                 bool newEventBtn = GUILayout.Button("Create New Task");
  94.                 name = EditorGUILayout.TextField("Nickname", name);
  95.                 if(newEventBtn) {
  96.                     EventTask task = ScriptableObject.CreateInstance<EventTask>();
  97.                     task.eventNickname = name.Length == 0 ? string.Format("EventTask_{0}", manager.tasks.Count) : name;
  98.                     manager.tasks.Add(task);
  99.                     foldouts.Add(false);
  100.                 }
  101.                 EditorGUILayout.EndHorizontal();
  102.             }
  103.  
  104.             private void DrawDelayTask(DelayTask delayTask) {
  105.                 if(delayTask.delay <= 0f)
  106.                     delayTask.delay = 1f;
  107.                 delayTask.delay = EditorGUILayout.FloatField("Delay Time", delayTask.delay);
  108.             }
  109.  
  110.             private void DrawEventTask(EventTask e) {
  111.                 e.waitForFinish = EditorGUILayout.ToggleLeft("Wait For Finish", e.waitForFinish);
  112.                 e.targetGameObj = EditorGUILayout.ObjectField(e.targetGameObj, typeof(GameObject), true) as GameObject;
  113.  
  114.                 MonoBehaviour[] behaviors = EventManager.GetObjBehaviors(e.targetGameObj);
  115.                 if(behaviors.Length != 0) {
  116.                     int currentBehaviourIndex = behaviors.ToList().IndexOf(e.targetBehavior);
  117.                     currentBehaviourIndex = (currentBehaviourIndex < 0) ? 0 : currentBehaviourIndex;
  118.                     GetNames GetBNames = l => { string[] names = new string[l.Length]; for(int i = 0; i < l.Length; i++) { names[i] = l[i].GetType().Name; } return names; };
  119.                     string[] bNames = GetBNames(behaviors);
  120.                     int newBehaviourIndex = EditorGUILayout.Popup("", currentBehaviourIndex, bNames, GUILayout.ExpandWidth(false));
  121.                     e.targetBehavior = behaviors[newBehaviourIndex];
  122.  
  123.                     string[] methodNames = EventManager.GetBehaviorMethods(behaviors[newBehaviourIndex]);
  124.  
  125.                     if(methodNames.Length != 0) {
  126.                         int currentMethodIndex = methodNames.ToList().IndexOf(e.targetMethod);
  127.                         currentMethodIndex = (currentMethodIndex < 0) ? 0 : currentMethodIndex;
  128.                         int newMethodIndex = EditorGUILayout.Popup(currentMethodIndex, methodNames, GUILayout.ExpandWidth(true));
  129.                         e.targetMethod = methodNames[newMethodIndex];
  130.                     }
  131.                 }
  132.             }
  133.  
  134.             private void CreateDelayButton() {
  135.                 EditorGUILayout.BeginHorizontal();
  136.                 bool newDelayBtn = GUILayout.Button("Create New Delay");
  137.                 if(delay <= 0f)
  138.                     delay = 1f;
  139.                 delay = EditorGUILayout.FloatField("Delay Time", delay);
  140.                 if(newDelayBtn && delay > 0f) {
  141.                     DelayTask task = ScriptableObject.CreateInstance<DelayTask>();
  142.                     task.delay = delay;
  143.                     manager.tasks.Add(task);
  144.                     foldouts.Add(false);
  145.                 }
  146.                 EditorGUILayout.EndHorizontal();
  147.             }
  148.         }
  149.     }
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement