Browse Source

Commands are now in same window as sequence nodes

master
chrisgregan 10 years ago
parent
commit
4e0c596d77
  1. 2
      Assets/Fungus/FungusScript/Editor/FungusCommandEditor.cs
  2. 114
      Assets/Fungus/FungusScript/Editor/FungusScriptEditor.cs
  3. 151
      Assets/Fungus/FungusScript/Editor/FungusScriptWindow.cs
  4. 5
      Assets/Fungus/FungusScript/Scripts/FungusScript.cs
  5. BIN
      Assets/Shuttle/ShuttleGame.unity

2
Assets/Fungus/FungusScript/Editor/FungusCommandEditor.cs

@ -148,8 +148,6 @@ namespace Fungus.Script
t.IsExecuting()) t.IsExecuting())
{ {
Rect rect = GUILayoutUtility.GetLastRect(); Rect rect = GUILayoutUtility.GetLastRect();
rect.x -= 10;
rect.width += 10;
GLDraw.DrawBox(rect, Color.green, 1.5f); GLDraw.DrawBox(rect, Color.green, 1.5f);
} }
} }

114
Assets/Fungus/FungusScript/Editor/FungusScriptEditor.cs

@ -22,25 +22,7 @@ namespace Fungus.Script
if (t != null) if (t != null)
{ {
// Hide the transform component if FungusScript & Variables are the only components on the game object t.transform.hideFlags = HideFlags.None;
// Gives a bit more room in inspector for editing commands. The transform will become visible if any non-Fungus
// components are attached to the game object.
Component[] components = t.GetComponents(typeof(Component));
int count = 0;
foreach (Component component in components)
{
System.Type type = component.GetType();
if (type == typeof(Transform) ||
type == typeof(FungusScript) ||
type == typeof(BooleanVariable) ||
type == typeof(IntegerVariable) ||
type == typeof(FloatVariable) ||
type == typeof(StringVariable))
{
count++;
}
}
t.transform.hideFlags = (count == components.Length) ? HideFlags.HideInInspector : HideFlags.None;
} }
EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck();
@ -78,79 +60,21 @@ namespace Fungus.Script
} }
GUILayout.FlexibleSpace(); GUILayout.FlexibleSpace();
GUILayout.EndHorizontal(); GUILayout.EndHorizontal();
}
EditorGUILayout.Separator(); public void DrawSequenceGUI(FungusScript fungusScript)
GUI.backgroundColor = Color.yellow; {
GUILayout.Box("Sequence Editor", GUILayout.ExpandWidth(true)); if (fungusScript.selectedSequence == null)
GUI.backgroundColor = Color.white;
GUILayout.BeginHorizontal();
if (t.selectedSequence == null)
{
GUILayout.FlexibleSpace();
}
if (GUILayout.Button(t.selectedSequence == null ? "Create Sequence" : "Create",
t.selectedSequence == null ? EditorStyles.miniButton : EditorStyles.miniButtonLeft))
{
Sequence newSequence = t.CreateSequence(t.scrollPos);
Undo.RegisterCreatedObjectUndo(newSequence, "New Sequence");
t.selectedSequence = newSequence;
}
if (t.selectedSequence == null)
{
GUILayout.FlexibleSpace();
}
if (t.selectedSequence != null)
{ {
if (GUILayout.Button("Delete", EditorStyles.miniButtonMid)) return;
{
Undo.DestroyObjectImmediate(t.selectedSequence.gameObject);
t.selectedSequence = null;
}
if (GUILayout.Button("Duplicate", EditorStyles.miniButtonRight))
{
GameObject copy = GameObject.Instantiate(t.selectedSequence.gameObject) as GameObject;
copy.transform.parent = t.transform;
copy.transform.hideFlags = HideFlags.HideInHierarchy;
copy.name = t.selectedSequence.name;
Sequence sequenceCopy = copy.GetComponent<Sequence>();
sequenceCopy.nodeRect.x += sequenceCopy.nodeRect.width + 10;
Undo.RegisterCreatedObjectUndo(copy, "Duplicate Sequence");
t.selectedSequence = sequenceCopy;
}
} }
GUILayout.EndHorizontal(); Sequence sequence = fungusScript.selectedSequence;
EditorGUILayout.Separator();
if (t.selectedSequence != null)
{
DrawSequenceGUI(t.selectedSequence);
if (!Application.isPlaying)
{
EditorGUILayout.Separator();
DrawAddCommandGUI(t.selectedSequence);
}
}
}
public void DrawSequenceGUI(Sequence sequence)
{
EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck();
string name = EditorGUILayout.TextField(new GUIContent("Sequence Name", "Name of sequence displayed in editor window"), sequence.name); string name = EditorGUILayout.TextField(new GUIContent("Sequence Name", "Name of sequence displayed in editor window"), sequence.name);
EditorGUILayout.PrefixLabel(new GUIContent("Description", "Sequence description displayed in editor window")); string desc = EditorGUILayout.TextField(new GUIContent("Description", "Sequence description displayed in editor window"), sequence.description);
GUIStyle descriptionStyle = new GUIStyle(EditorStyles.textArea);
descriptionStyle.wordWrap = true;
string desc = EditorGUILayout.TextArea(sequence.description, descriptionStyle);
EditorGUILayout.Separator(); EditorGUILayout.Separator();
@ -167,7 +91,9 @@ namespace Fungus.Script
sequence.description = desc; sequence.description = desc;
} }
EditorGUILayout.PrefixLabel("Commands"); GUI.backgroundColor = Color.yellow;
GUILayout.Box("Commands", GUILayout.ExpandWidth(true));
GUI.backgroundColor = Color.white;
FungusCommand[] commands = sequence.GetComponents<FungusCommand>(); FungusCommand[] commands = sequence.GetComponents<FungusCommand>();
int index = 1; int index = 1;
@ -176,14 +102,16 @@ namespace Fungus.Script
FungusCommandEditor commandEditor = Editor.CreateEditor(command) as FungusCommandEditor; FungusCommandEditor commandEditor = Editor.CreateEditor(command) as FungusCommandEditor;
commandEditor.DrawInspectorGUI(index++); commandEditor.DrawInspectorGUI(index++);
} }
}
public void DrawAddCommandGUI(Sequence sequence) if (Application.isPlaying)
{ {
FungusScript t = target as FungusScript; return;
}
EditorGUILayout.Separator();
GUI.backgroundColor = Color.yellow; GUI.backgroundColor = Color.yellow;
GUILayout.Box("Add Command", GUILayout.ExpandWidth(true)); GUILayout.Box("New Command", GUILayout.ExpandWidth(true));
GUI.backgroundColor = Color.white; GUI.backgroundColor = Color.white;
// Build list of categories // Build list of categories
@ -201,12 +129,12 @@ namespace Fungus.Script
EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck();
int selectedCommandIndex = EditorGUILayout.Popup("Command", t.selectedCommandIndex, commandNames.ToArray()); int selectedCommandIndex = EditorGUILayout.Popup("Command", fungusScript.selectedCommandIndex, commandNames.ToArray());
if (EditorGUI.EndChangeCheck()) if (EditorGUI.EndChangeCheck())
{ {
Undo.RecordObject(t, "Select Command"); Undo.RecordObject(fungusScript, "Select Command");
t.selectedCommandIndex = selectedCommandIndex; fungusScript.selectedCommandIndex = selectedCommandIndex;
} }
System.Type selectedType = commandTypes[selectedCommandIndex]; System.Type selectedType = commandTypes[selectedCommandIndex];

151
Assets/Fungus/FungusScript/Editor/FungusScriptWindow.cs

@ -6,9 +6,13 @@ using System.Collections.Generic;
namespace Fungus.Script namespace Fungus.Script
{ {
public class FungusScriptWindow : EditorWindow public class FungusScriptWindow : EditorWindow
{ {
float commandViewWidth;
bool resize = false;
Rect cursorChangeRect;
public const float minViewWidth = 300;
private List<Sequence> windowSequenceMap = new List<Sequence>(); private List<Sequence> windowSequenceMap = new List<Sequence>();
[MenuItem("Window/Fungus Script")] [MenuItem("Window/Fungus Script")]
@ -17,6 +21,12 @@ namespace Fungus.Script
GetWindow(typeof(FungusScriptWindow), false, "Fungus Script"); GetWindow(typeof(FungusScriptWindow), false, "Fungus Script");
} }
void OnEnable()
{
commandViewWidth = minViewWidth;
cursorChangeRect = new Rect(this.position.width - commandViewWidth, 0, 4f, this.position.height);
}
public void OnInspectorUpdate() public void OnInspectorUpdate()
{ {
Repaint(); Repaint();
@ -32,8 +42,8 @@ namespace Fungus.Script
return null; return null;
} }
void OnGUI() void OnGUI()
{ {
FungusScript fungusScript = GetFungusScript(); FungusScript fungusScript = GetFungusScript();
if (fungusScript == null) if (fungusScript == null)
{ {
@ -41,6 +51,15 @@ namespace Fungus.Script
return; return;
} }
GUILayout.BeginHorizontal();
DrawScriptView(fungusScript);
ResizeViews();
DrawCommandView(fungusScript);
GUILayout.EndHorizontal();
}
void DrawScriptView(FungusScript fungusScript)
{
EditorUtility.SetDirty(fungusScript); EditorUtility.SetDirty(fungusScript);
Sequence[] sequences = fungusScript.GetComponentsInChildren<Sequence>(); Sequence[] sequences = fungusScript.GetComponentsInChildren<Sequence>();
@ -62,28 +81,31 @@ namespace Fungus.Script
scrollViewRect.xMax += position.width * bufferScale; scrollViewRect.xMax += position.width * bufferScale;
scrollViewRect.yMax += position.height * bufferScale; scrollViewRect.yMax += position.height * bufferScale;
Rect windowRect = new Rect(0, 0, position.width, position.height); // Calc rect for left hand script view
Rect scriptViewRect = new Rect(0, 0, this.position.width - commandViewWidth, this.position.height);
// Clip GL drawing so not to overlap scrollbars // Clip GL drawing so not to overlap scrollbars
Rect clipRect = new Rect(fungusScript.scrollPos.x + scrollViewRect.x, Rect clipRect = new Rect(fungusScript.scriptScrollPos.x + scrollViewRect.x,
fungusScript.scrollPos.y + scrollViewRect.y, fungusScript.scriptScrollPos.y + scrollViewRect.y,
windowRect.width - 15, scriptViewRect.width - 15,
windowRect.height - 15); scriptViewRect.height - 15);
fungusScript.scrollPos = GLDraw.BeginScrollView(windowRect, fungusScript.scrollPos, scrollViewRect, clipRect); GUILayoutUtility.GetRect(scriptViewRect.width, scriptViewRect.height);
fungusScript.scriptScrollPos = GLDraw.BeginScrollView(scriptViewRect, fungusScript.scriptScrollPos, scrollViewRect, clipRect);
if (Event.current.type == EventType.ContextClick) if (Event.current.type == EventType.ContextClick)
{ {
GenericMenu menu = new GenericMenu(); GenericMenu menu = new GenericMenu();
Vector2 mousePos = Event.current.mousePosition; Vector2 mousePos = Event.current.mousePosition;
mousePos += fungusScript.scrollPos; mousePos += fungusScript.scriptScrollPos;
menu.AddItem (new GUIContent ("Create Sequence"), false, CreateSequenceCallback, mousePos); menu.AddItem (new GUIContent ("Create Sequence"), false, CreateSequenceCallback, mousePos);
menu.ShowAsContext (); menu.ShowAsContext ();
Event.current.Use(); Event.current.Use();
} }
BeginWindows(); BeginWindows();
GUIStyle windowStyle = new GUIStyle(GUI.skin.window); GUIStyle windowStyle = new GUIStyle(GUI.skin.window);
@ -110,7 +132,7 @@ namespace Fungus.Script
DrawConnections(fungusScript, s, true); DrawConnections(fungusScript, s, true);
} }
EndWindows(); EndWindows();
if (fungusScript.selectedSequence != null || if (fungusScript.selectedSequence != null ||
fungusScript.executingSequence != null) fungusScript.executingSequence != null)
@ -132,24 +154,101 @@ namespace Fungus.Script
} }
GLDraw.EndScrollView(); GLDraw.EndScrollView();
}
GUILayout.BeginVertical(); void ResizeViews()
GUILayout.FlexibleSpace(); {
GUILayout.BeginHorizontal(); cursorChangeRect.x = this.position.width - commandViewWidth;
GUILayout.Space(10); cursorChangeRect.height = this.position.height;
GUILayout.Label(fungusScript.name, EditorStyles.miniLabel);
GUILayout.EndHorizontal(); GUI.color = Color.grey;
GUILayout.BeginHorizontal(); GUI.DrawTexture(cursorChangeRect, EditorGUIUtility.whiteTexture);
GUILayout.Space(10); GUI.color = Color.white;
EditorGUIUtility.AddCursorRect(cursorChangeRect, MouseCursor.ResizeHorizontal);
if (Event.current.type == EventType.mouseDown && cursorChangeRect.Contains(Event.current.mousePosition))
{
resize = true;
}
if (resize)
{
commandViewWidth = this.position.width - Event.current.mousePosition.x;
commandViewWidth = Mathf.Max(minViewWidth, commandViewWidth);
commandViewWidth = Mathf.Min(this.position.width - minViewWidth, commandViewWidth);
}
if(Event.current.type == EventType.MouseUp)
{
resize = false;
}
}
void DrawCommandView(FungusScript fungusScript)
{
GUILayout.Space(5);
fungusScript.commandScrollPos = GUILayout.BeginScrollView(fungusScript.commandScrollPos);
EditorGUILayout.BeginVertical();
EditorGUILayout.Separator();
GUI.backgroundColor = Color.yellow;
GUILayout.Box("Sequence", GUILayout.ExpandWidth(true));
GUI.backgroundColor = Color.white; GUI.backgroundColor = Color.white;
if (GUILayout.Button("Show Variables"))
GUILayout.BeginHorizontal();
if (fungusScript.selectedSequence == null)
{ {
EditorWindow.GetWindow<VariablesWindow>("Fungus Variables"); GUILayout.FlexibleSpace();
} }
GUILayout.FlexibleSpace();
if (GUILayout.Button(fungusScript.selectedSequence == null ? "Create Sequence" : "Create",
fungusScript.selectedSequence == null ? EditorStyles.miniButton : EditorStyles.miniButtonLeft))
{
Sequence newSequence = fungusScript.CreateSequence(fungusScript.scriptScrollPos);
Undo.RegisterCreatedObjectUndo(newSequence, "New Sequence");
fungusScript.selectedSequence = newSequence;
}
if (fungusScript.selectedSequence == null)
{
GUILayout.FlexibleSpace();
}
if (fungusScript.selectedSequence != null)
{
if (GUILayout.Button("Delete", EditorStyles.miniButtonMid))
{
Undo.DestroyObjectImmediate(fungusScript.selectedSequence.gameObject);
fungusScript.selectedSequence = null;
}
if (GUILayout.Button("Duplicate", EditorStyles.miniButtonRight))
{
GameObject copy = GameObject.Instantiate(fungusScript.selectedSequence.gameObject) as GameObject;
copy.transform.parent = fungusScript.transform;
copy.transform.hideFlags = HideFlags.HideInHierarchy;
copy.name = fungusScript.selectedSequence.name;
Sequence sequenceCopy = copy.GetComponent<Sequence>();
sequenceCopy.nodeRect.x += sequenceCopy.nodeRect.width + 10;
Undo.RegisterCreatedObjectUndo(copy, "Duplicate Sequence");
fungusScript.selectedSequence = sequenceCopy;
}
}
GUILayout.EndHorizontal(); GUILayout.EndHorizontal();
GUILayout.Space(20);
GUILayout.EndVertical(); EditorGUILayout.Separator();
FungusScriptEditor editor = Editor.CreateEditor(fungusScript) as FungusScriptEditor;
editor.DrawSequenceGUI(fungusScript);
GUILayout.FlexibleSpace();
EditorGUILayout.EndVertical();
GUILayout.EndScrollView();
} }
void CreateSequenceCallback(object item) void CreateSequenceCallback(object item)
@ -158,7 +257,7 @@ namespace Fungus.Script
if (fungusScript != null) if (fungusScript != null)
{ {
Vector2 position = (Vector2)item; Vector2 position = (Vector2)item;
position -= fungusScript.scrollPos; position -= fungusScript.scriptScrollPos;
Sequence newSequence = fungusScript.CreateSequence(position); Sequence newSequence = fungusScript.CreateSequence(position);
Undo.RegisterCreatedObjectUndo(newSequence, "New Sequence"); Undo.RegisterCreatedObjectUndo(newSequence, "New Sequence");
fungusScript.selectedSequence = newSequence; fungusScript.selectedSequence = newSequence;

5
Assets/Fungus/FungusScript/Scripts/FungusScript.cs

@ -19,7 +19,10 @@ namespace Fungus.Script
public int selectedCommandIndex; public int selectedCommandIndex;
[HideInInspector] [HideInInspector]
public Vector2 scrollPos; public Vector2 scriptScrollPos;
[HideInInspector]
public Vector2 commandScrollPos;
public float stepTime; public float stepTime;

BIN
Assets/Shuttle/ShuttleGame.unity

Binary file not shown.
Loading…
Cancel
Save