An easy to use Unity 3D library for creating illustrated Interactive Fiction games and more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

176 lines
4.0 KiB

using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
namespace Fungus.Script
{
[CustomEditor (typeof(FungusCommand), true)]
public class FungusCommandEditor : Editor
{
public static FungusCommand selectedCommand;
void OnEnable()
{
FungusCommand t = target as FungusCommand;
if (t != null)
{
t.hideFlags = HideFlags.HideInInspector;
}
}
public static CommandInfoAttribute GetCommandInfo(System.Type commandType)
{
object[] attributes = commandType.GetCustomAttributes(typeof(CommandInfoAttribute), false);
foreach (object obj in attributes)
{
CommandInfoAttribute commandInfoAttr = obj as CommandInfoAttribute;
if (commandInfoAttr != null)
{
return commandInfoAttr;
}
}
return null;
}
public virtual void DrawCommandInspectorGUI()
{
FungusCommand t = target as FungusCommand;
if (t == null)
{
return;
}
FungusScript fungusScript = t.GetFungusScript();
GUILayout.BeginVertical(GUI.skin.box);
GUILayout.BeginHorizontal();
CommandInfoAttribute commandInfoAttr = FungusCommandEditor.GetCommandInfo(t.GetType());
if (commandInfoAttr == null)
{
GUILayout.EndHorizontal();
GUILayout.EndVertical();
return;
}
string commandName = commandInfoAttr.CommandName;
GUIStyle commandStyle = new GUIStyle(GUI.skin.button);
if (t.enabled)
{
GUI.backgroundColor = commandInfoAttr.ButtonColor;
}
else
{
GUI.backgroundColor = Color.grey;
}
GUILayout.Label(commandName, commandStyle, GUILayout.MinWidth(80), GUILayout.ExpandWidth(true));
GUI.backgroundColor = Color.white;
bool enabled = GUILayout.Toggle(t.enabled, new GUIContent());
if (t.enabled != enabled)
{
Undo.RecordObject(t, "Set Enabled");
t.enabled = enabled;
}
if (fungusScript != null)
{
if (GUILayout.Button("Copy", EditorStyles.miniButton))
{
fungusScript.copyCommand = t;
}
if (fungusScript.copyCommand != null)
{
if (GUILayout.Button("Paste", EditorStyles.miniButton))
{
Sequence parentSequence = t.GetComponent<Sequence>();
if (parentSequence != null)
{
PasteCommand(fungusScript.copyCommand, parentSequence);
}
}
}
}
GUILayout.EndHorizontal();
EditorGUILayout.Separator();
DrawCommandGUI();
EditorGUILayout.Separator();
if (t.errorMessage.Length > 0)
{
GUIStyle style = new GUIStyle(GUI.skin.label);
style.normal.textColor = new Color(1,0,0);
EditorGUILayout.LabelField(new GUIContent("Error: " + t.errorMessage), style);
}
GUILayout.EndVertical();
}
public virtual void DrawCommandGUI()
{
DrawDefaultInspector();
}
static public FungusCommand PasteCommand(FungusCommand copyCommand, Sequence sequence)
{
System.Type type = copyCommand.GetType();
Component copy = Undo.AddComponent(sequence.gameObject, type);
System.Reflection.FieldInfo[] fields = type.GetFields();
foreach (System.Reflection.FieldInfo field in fields)
{
field.SetValue(copy, field.GetValue(copyCommand));
}
FungusScript fungusScript = sequence.GetFungusScript();
Undo.RecordObject(fungusScript, "Paste Command");
FungusCommand newCommand = copy as FungusCommand;
sequence.commandList.Add(newCommand);
return newCommand;
}
static public T ObjectField<T>(GUIContent label, GUIContent nullLabel, T selectedObject, List<T> objectList) where T : MonoBehaviour
{
List<GUIContent> objectNames = new List<GUIContent>();
int selectedIndex = 0;
objectNames.Add(nullLabel);
for (int i = 0; i < objectList.Count; ++i)
{
objectNames.Add(new GUIContent(objectList[i].name));
if (selectedObject == objectList[i])
{
selectedIndex = i + 1;
}
}
T result;
selectedIndex = EditorGUILayout.Popup(label, selectedIndex, objectNames.ToArray());
if (selectedIndex == 0)
{
result = null; // Null option
}
else
{
result = objectList[selectedIndex - 1];
}
return result;
}
}
}