From 6115eaa8c7190090e4c89b9c729ae325c3830755 Mon Sep 17 00:00:00 2001 From: chrisgregan Date: Wed, 13 Aug 2014 10:25:47 +0100 Subject: [PATCH] Fixed delete variable errors --- .../Editor/FungusScript/FungusScriptEditor.cs | 94 ++++-------- .../FungusScript/FungusVariableListAdaptor.cs | 145 +++++++++++++++--- 2 files changed, 152 insertions(+), 87 deletions(-) diff --git a/Assets/Fungus/Editor/FungusScript/FungusScriptEditor.cs b/Assets/Fungus/Editor/FungusScript/FungusScriptEditor.cs index 73efe6ce..b888c972 100644 --- a/Assets/Fungus/Editor/FungusScript/FungusScriptEditor.cs +++ b/Assets/Fungus/Editor/FungusScript/FungusScriptEditor.cs @@ -12,7 +12,7 @@ namespace Fungus.Script public class FungusScriptEditor : Editor { SerializedProperty variablesProperty; - + void OnEnable() { if (serializedObject != null) @@ -20,18 +20,18 @@ namespace Fungus.Script variablesProperty = serializedObject.FindProperty("variables"); } } - + public void OnInspectorUpdate() { Repaint(); } - + public override void OnInspectorGUI() { serializedObject.Update(); - + FungusScript t = target as FungusScript; - + GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Open Fungus Editor")) @@ -50,33 +50,33 @@ namespace Fungus.Script Undo.RegisterCreatedObjectUndo(go, "Sequence"); Selection.activeGameObject = go; } - + GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); - + GUIContent stepTimeLabel = new GUIContent("Step Time", "Minimum time to execute each step"); t.stepTime = EditorGUILayout.FloatField(stepTimeLabel, t.stepTime); - + GUIContent startSequenceLabel = new GUIContent("Start Sequence", "Sequence to be executed when controller starts."); t.startSequence = SequenceEditor.SequenceField(startSequenceLabel, t, t.startSequence); - + GUIContent startAutomaticallyLabel = new GUIContent("Start Automatically", "Start this Fungus Script when the scene starts."); t.startAutomatically = EditorGUILayout.Toggle(startAutomaticallyLabel, t.startAutomatically); - + if (t.startSequence == null) { GUIStyle style = new GUIStyle(GUI.skin.label); style.normal.textColor = new Color(1,0,0); EditorGUILayout.LabelField(new GUIContent("Error: Please select a Start Sequence"), style); } - + serializedObject.ApplyModifiedProperties(); } - + public void DrawVariablesGUI() { serializedObject.Update(); - + FungusScript t = target as FungusScript; ReorderableListGUI.Title("Variables"); @@ -86,66 +86,24 @@ namespace Fungus.Script GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); - + if (!Application.isPlaying && GUILayout.Button("Add Variable")) { GenericMenu menu = new GenericMenu (); - menu.AddItem(new GUIContent ("Boolean"), false, AddBooleanVariable, t); - menu.AddItem (new GUIContent ("Integer"), false, AddIntegerVariable, t); - menu.AddItem (new GUIContent ("Float"), false, AddFloatVariable, t); - menu.AddItem (new GUIContent ("String"), false, AddStringVariable, t); + menu.AddItem(new GUIContent ("Boolean"), false, AddVariable, t); + menu.AddItem (new GUIContent ("Integer"), false, AddVariable, t); + menu.AddItem (new GUIContent ("Float"), false, AddVariable, t); + menu.AddItem (new GUIContent ("String"), false, AddVariable, t); menu.ShowAsContext (); } GUILayout.EndHorizontal(); - - serializedObject.ApplyModifiedProperties(); - } - - void AddBooleanVariable(object obj) - { - FungusScript fungusScript = obj as FungusScript; - if (fungusScript == null) - { - return; - } - - Undo.RecordObject(fungusScript, "Add Boolean"); - BooleanVariable variable = fungusScript.gameObject.AddComponent(); - variable.key = MakeUniqueKey(fungusScript); - fungusScript.variables.Add(variable); - } - - void AddIntegerVariable(object obj) - { - FungusScript fungusScript = obj as FungusScript; - if (fungusScript == null) - { - return; - } - Undo.RecordObject(fungusScript, "Add Integer"); - IntegerVariable variable = fungusScript.gameObject.AddComponent(); - variable.key = MakeUniqueKey(fungusScript); - fungusScript.variables.Add(variable); - } - - void AddFloatVariable(object obj) - { - FungusScript fungusScript = obj as FungusScript; - if (fungusScript == null) - { - return; - } - - Undo.RecordObject(fungusScript, "Add Float"); - FloatVariable variable = fungusScript.gameObject.AddComponent(); - variable.key = MakeUniqueKey(fungusScript); - fungusScript.variables.Add(variable); + serializedObject.ApplyModifiedProperties(); } - - void AddStringVariable(object obj) + + void AddVariable(object obj) where T : FungusVariable { FungusScript fungusScript = obj as FungusScript; if (fungusScript == null) @@ -153,8 +111,8 @@ namespace Fungus.Script return; } - Undo.RecordObject(fungusScript, "Add String"); - StringVariable variable = fungusScript.gameObject.AddComponent(); + Undo.RecordObject(fungusScript, "Add Variable"); + T variable = fungusScript.gameObject.AddComponent(); variable.key = MakeUniqueKey(fungusScript); fungusScript.variables.Add(variable); } @@ -165,7 +123,7 @@ namespace Fungus.Script while (true) { string key = "Var" + index; - + bool found = false; foreach(FungusVariable variable in fungusScript.GetComponents()) { @@ -175,7 +133,7 @@ namespace Fungus.Script index++; } } - + if (!found) { return key; @@ -183,5 +141,5 @@ namespace Fungus.Script } } } - + } \ No newline at end of file diff --git a/Assets/Fungus/Editor/FungusScript/FungusVariableListAdaptor.cs b/Assets/Fungus/Editor/FungusScript/FungusVariableListAdaptor.cs index 89a14607..fe6acd7f 100644 --- a/Assets/Fungus/Editor/FungusScript/FungusVariableListAdaptor.cs +++ b/Assets/Fungus/Editor/FungusScript/FungusVariableListAdaptor.cs @@ -10,19 +10,83 @@ using Rotorz.ReorderableList; namespace Fungus.Script { - - public class FungusVariableListAdaptor : SerializedPropertyAdaptor - { - public FungusVariableListAdaptor(SerializedProperty arrayProperty, float fixedItemHeight) : base(arrayProperty, fixedItemHeight) - {} + public class FungusVariableListAdaptor : IReorderableListAdaptor { - public FungusVariableListAdaptor(SerializedProperty arrayProperty) : this(arrayProperty, 0f) - {} + private SerializedProperty _arrayProperty; + + public float fixedItemHeight; + + public SerializedProperty this[int index] { + get { return _arrayProperty.GetArrayElementAtIndex(index); } + } + + public SerializedProperty arrayProperty { + get { return _arrayProperty; } + } + + public FungusVariableListAdaptor(SerializedProperty arrayProperty, float fixedItemHeight) { + if (arrayProperty == null) + throw new ArgumentNullException("Array property was null."); + if (!arrayProperty.isArray) + throw new InvalidOperationException("Specified serialized propery is not an array."); + + this._arrayProperty = arrayProperty; + this.fixedItemHeight = fixedItemHeight; + } + + public FungusVariableListAdaptor(SerializedProperty arrayProperty) : this(arrayProperty, 0f) { + } + + public int Count { + get { return _arrayProperty.arraySize; } + } + + public virtual bool CanDrag(int index) { + return true; + } + + public virtual bool CanRemove(int index) { + return true; + } + + public void Add() { + int newIndex = _arrayProperty.arraySize; + ++_arrayProperty.arraySize; + ResetValue(_arrayProperty.GetArrayElementAtIndex(newIndex)); + } + + public void Insert(int index) { + _arrayProperty.InsertArrayElementAtIndex(index); + ResetValue(_arrayProperty.GetArrayElementAtIndex(index)); + } + + public void Duplicate(int index) { + _arrayProperty.InsertArrayElementAtIndex(index); + } + + public void Remove(int index) { + // Remove the Fungus Variable component + FungusVariable variable = _arrayProperty.GetArrayElementAtIndex(index).objectReferenceValue as FungusVariable; + Undo.DestroyObjectImmediate(variable); + + _arrayProperty.GetArrayElementAtIndex(index).objectReferenceValue = null; + _arrayProperty.DeleteArrayElementAtIndex(index); + } + + public void Move(int sourceIndex, int destIndex) { + if (destIndex > sourceIndex) + --destIndex; + _arrayProperty.MoveArrayElement(sourceIndex, destIndex); + } - public override void DrawItem(Rect position, int index) + public void Clear() { + _arrayProperty.ClearArray(); + } + + public void DrawItem(Rect position, int index) { FungusVariable variable = this[index].objectReferenceValue as FungusVariable; - + float width1 = 60; float width3 = 50; float width2 = Mathf.Max(position.width - width1 - width3, 100); @@ -37,7 +101,7 @@ namespace Fungus.Script Rect scopeRect = position; scopeRect.x += width1 + width2; scopeRect.width = width3; - + string type = ""; if (variable.GetType() == typeof(BooleanVariable)) { @@ -55,13 +119,13 @@ namespace Fungus.Script { type = "String"; } - + GUI.Label(typeRect, type); - + EditorGUI.BeginChangeCheck(); - + string key = variable.key; - + if (Application.isPlaying) { const float w = 100; @@ -96,21 +160,64 @@ namespace Fungus.Script keyRect.width -= 5; key = EditorGUI.TextField(keyRect, variable.key); } - + VariableScope scope = (VariableScope)EditorGUI.EnumPopup(scopeRect, variable.scope); - + if (EditorGUI.EndChangeCheck ()) { Undo.RecordObject(variable, "Set Variable"); - + char[] arr = key.Where(c => (char.IsLetterOrDigit(c) || c == '_')).ToArray(); key = new string(arr); - + variable.key = key; variable.scope = scope; } } + + public virtual float GetItemHeight(int index) { + return fixedItemHeight != 0f + ? fixedItemHeight + : EditorGUI.GetPropertyHeight(this[index], GUIContent.none, false) + ; + } + private void ResetValue(SerializedProperty element) { + switch (element.type) { + case "string": + element.stringValue = ""; + break; + case "Vector2f": + element.vector2Value = Vector2.zero; + break; + case "Vector3f": + element.vector3Value = Vector3.zero; + break; + case "Rectf": + element.rectValue = new Rect(); + break; + case "Quaternionf": + element.quaternionValue = Quaternion.identity; + break; + case "int": + element.intValue = 0; + break; + case "float": + element.floatValue = 0f; + break; + case "UInt8": + element.boolValue = false; + break; + case "ColorRGBA": + element.colorValue = Color.black; + break; + + default: + if (element.type.StartsWith("PPtr")) + element.objectReferenceValue = null; + break; + } + } } - } +