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.
243 lines
6.5 KiB
243 lines
6.5 KiB
using UnityEditor; |
|
using UnityEngine; |
|
using System.Collections; |
|
using System.Collections.Generic; |
|
using Rotorz.ReorderableList; |
|
using System.Linq; |
|
using System.Reflection; |
|
using System.IO; |
|
|
|
namespace Fungus |
|
{ |
|
[CustomEditor (typeof(Flowchart))] |
|
public class FlowchartEditor : Editor |
|
{ |
|
protected class AddVariableInfo |
|
{ |
|
public Flowchart flowchart; |
|
public System.Type variableType; |
|
} |
|
|
|
protected SerializedProperty descriptionProp; |
|
protected SerializedProperty colorCommandsProp; |
|
protected SerializedProperty hideComponentsProp; |
|
protected SerializedProperty stepPauseProp; |
|
protected SerializedProperty saveSelectionProp; |
|
protected SerializedProperty localizationIdProp; |
|
protected SerializedProperty variablesProp; |
|
|
|
protected Texture2D addTexture; |
|
|
|
protected virtual void OnEnable() |
|
{ |
|
descriptionProp = serializedObject.FindProperty("description"); |
|
colorCommandsProp = serializedObject.FindProperty("colorCommands"); |
|
hideComponentsProp = serializedObject.FindProperty("hideComponents"); |
|
stepPauseProp = serializedObject.FindProperty("stepPause"); |
|
saveSelectionProp = serializedObject.FindProperty("saveSelection"); |
|
localizationIdProp = serializedObject.FindProperty("localizationId"); |
|
variablesProp = serializedObject.FindProperty("variables"); |
|
|
|
addTexture = Resources.Load("Icons/add_small") as Texture2D; |
|
} |
|
|
|
public override void OnInspectorGUI() |
|
{ |
|
serializedObject.Update(); |
|
|
|
Flowchart flowchart = target as Flowchart; |
|
|
|
flowchart.UpdateHideFlags(); |
|
|
|
EditorGUILayout.PropertyField(descriptionProp); |
|
EditorGUILayout.PropertyField(colorCommandsProp); |
|
EditorGUILayout.PropertyField(hideComponentsProp); |
|
EditorGUILayout.PropertyField(stepPauseProp); |
|
EditorGUILayout.PropertyField(saveSelectionProp); |
|
EditorGUILayout.PropertyField(localizationIdProp); |
|
|
|
GUILayout.BeginHorizontal(); |
|
GUILayout.FlexibleSpace(); |
|
if (GUILayout.Button("Flowchart Window")) |
|
{ |
|
EditorWindow.GetWindow(typeof(FlowchartWindow), false, "Flowchart"); |
|
} |
|
|
|
GUILayout.FlexibleSpace(); |
|
GUILayout.EndHorizontal(); |
|
|
|
serializedObject.ApplyModifiedProperties(); |
|
} |
|
|
|
public virtual void DrawVariablesGUI() |
|
{ |
|
serializedObject.Update(); |
|
|
|
Flowchart t = target as Flowchart; |
|
|
|
if (t.variables.Count == 0) |
|
{ |
|
t.variablesExpanded = true; |
|
} |
|
|
|
if (!t.variablesExpanded) |
|
{ |
|
if (GUILayout.Button ("Variables (" + t.variables.Count + ")", GUILayout.Height(24))) |
|
{ |
|
t.variablesExpanded = true; |
|
} |
|
|
|
// Draw disclosure triangle |
|
Rect lastRect = GUILayoutUtility.GetLastRect(); |
|
lastRect.x += 5; |
|
lastRect.y += 5; |
|
EditorGUI.Foldout(lastRect, false, ""); |
|
} |
|
else |
|
{ |
|
Rect listRect = new Rect(); |
|
|
|
if (t.variables.Count > 0) |
|
{ |
|
// Remove any null variables from the list |
|
// Can sometimes happen when upgrading to a new version of Fungus (if .meta GUID changes for a variable class) |
|
for (int i = t.variables.Count - 1; i >= 0; i--) |
|
{ |
|
if (t.variables[i] == null) |
|
{ |
|
t.variables.RemoveAt(i); |
|
} |
|
} |
|
|
|
ReorderableListGUI.Title("Variables"); |
|
VariableListAdaptor adaptor = new VariableListAdaptor(variablesProp, 0); |
|
|
|
ReorderableListFlags flags = ReorderableListFlags.DisableContextMenu | ReorderableListFlags.HideAddButton; |
|
|
|
ReorderableListControl.DrawControlFromState(adaptor, null, flags); |
|
listRect = GUILayoutUtility.GetLastRect(); |
|
} |
|
else |
|
{ |
|
GUILayoutUtility.GetRect(300, 24); |
|
listRect = GUILayoutUtility.GetLastRect(); |
|
listRect.y += 20; |
|
} |
|
|
|
float plusWidth = 32; |
|
float plusHeight = 24; |
|
|
|
Rect buttonRect = listRect; |
|
float buttonHeight = 24; |
|
buttonRect.x = 4; |
|
buttonRect.y -= buttonHeight - 1; |
|
buttonRect.height = buttonHeight; |
|
if (!Application.isPlaying) |
|
{ |
|
buttonRect.width -= 30; |
|
} |
|
|
|
if (GUI.Button (buttonRect, "Variables")) |
|
{ |
|
t.variablesExpanded = false; |
|
} |
|
|
|
// Draw disclosure triangle |
|
Rect lastRect = buttonRect; |
|
lastRect.x += 5; |
|
lastRect.y += 5; |
|
EditorGUI.Foldout(lastRect, true, ""); |
|
|
|
Rect plusRect = listRect; |
|
plusRect.x += plusRect.width - plusWidth; |
|
plusRect.y -= plusHeight - 1; |
|
plusRect.width = plusWidth; |
|
plusRect.height = plusHeight; |
|
|
|
if (!Application.isPlaying && |
|
GUI.Button(plusRect, addTexture)) |
|
{ |
|
GenericMenu menu = new GenericMenu (); |
|
List<System.Type> types = FindAllDerivedTypes<Variable>(); |
|
|
|
// Add variable types without a category |
|
foreach (System.Type type in types) |
|
{ |
|
VariableInfoAttribute variableInfo = VariableEditor.GetVariableInfo(type); |
|
if (variableInfo == null || |
|
variableInfo.Category != "") |
|
{ |
|
continue; |
|
} |
|
|
|
AddVariableInfo addVariableInfo = new AddVariableInfo(); |
|
addVariableInfo.flowchart = t; |
|
addVariableInfo.variableType = type; |
|
|
|
GUIContent typeName = new GUIContent(variableInfo.VariableType); |
|
|
|
menu.AddItem(typeName, false, AddVariable, addVariableInfo); |
|
} |
|
|
|
// Add types with a category |
|
foreach (System.Type type in types) |
|
{ |
|
VariableInfoAttribute variableInfo = VariableEditor.GetVariableInfo(type); |
|
if (variableInfo == null || |
|
variableInfo.Category == "") |
|
{ |
|
continue; |
|
} |
|
|
|
AddVariableInfo info = new AddVariableInfo(); |
|
info.flowchart = t; |
|
info.variableType = type; |
|
|
|
GUIContent typeName = new GUIContent(variableInfo.Category + "/" + variableInfo.VariableType); |
|
|
|
menu.AddItem(typeName, false, AddVariable, info); |
|
} |
|
|
|
menu.ShowAsContext (); |
|
} |
|
} |
|
|
|
serializedObject.ApplyModifiedProperties(); |
|
} |
|
|
|
protected virtual void AddVariable(object obj) |
|
{ |
|
AddVariableInfo addVariableInfo = obj as AddVariableInfo; |
|
if (addVariableInfo == null) |
|
{ |
|
return; |
|
} |
|
|
|
Flowchart flowchart = addVariableInfo.flowchart; |
|
System.Type variableType = addVariableInfo.variableType; |
|
|
|
Undo.RecordObject(flowchart, "Add Variable"); |
|
Variable newVariable = flowchart.gameObject.AddComponent(variableType) as Variable; |
|
newVariable.key = flowchart.GetUniqueVariableKey(""); |
|
flowchart.variables.Add(newVariable); |
|
} |
|
|
|
public static List<System.Type> FindAllDerivedTypes<T>() |
|
{ |
|
return FindAllDerivedTypes<T>(Assembly.GetAssembly(typeof(T))); |
|
} |
|
|
|
public static List<System.Type> FindAllDerivedTypes<T>(Assembly assembly) |
|
{ |
|
var derivedType = typeof(T); |
|
return assembly |
|
.GetTypes() |
|
.Where(t => |
|
t != derivedType && |
|
derivedType.IsAssignableFrom(t) |
|
).ToList(); |
|
|
|
} |
|
} |
|
|
|
} |