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.
142 lines
4.0 KiB
142 lines
4.0 KiB
using UnityEngine; |
|
using UnityEditor; |
|
using System.Collections; |
|
|
|
namespace Fungus |
|
{ |
|
/** |
|
* Temp hidden object which lets us use the entire inspector window to inspect |
|
* the sequence command list. |
|
*/ |
|
public class SequenceInspector : ScriptableObject |
|
{ |
|
public Sequence sequence; |
|
} |
|
|
|
/** |
|
* Custom editor for the temp hidden object. |
|
*/ |
|
[CustomEditor (typeof(SequenceInspector), true)] |
|
public class SequenceInspectorEditor : Editor |
|
{ |
|
protected Vector2 sequenceScrollPos; |
|
protected Vector2 commandScrollPos; |
|
protected bool resize = false; |
|
protected float topPanelHeight = 50; |
|
|
|
public override void OnInspectorGUI () |
|
{ |
|
SequenceInspector sequenceInspector = target as SequenceInspector; |
|
Sequence sequence = sequenceInspector.sequence; |
|
|
|
if (sequence == null) |
|
{ |
|
return; |
|
} |
|
|
|
FungusScript fungusScript = sequence.GetFungusScript(); |
|
|
|
SequenceEditor sequenceEditor = Editor.CreateEditor(sequence) as SequenceEditor; |
|
sequenceEditor.DrawSequenceName(fungusScript); |
|
|
|
// Using a custom rect area to get the correct 5px indent for the scroll views |
|
Rect sequenceRect = new Rect(5, topPanelHeight, Screen.width - 6, Screen.height); |
|
GUILayout.BeginArea(sequenceRect); |
|
|
|
sequenceScrollPos = GUILayout.BeginScrollView(sequenceScrollPos, GUILayout.Height(fungusScript.sequenceViewHeight)); |
|
sequenceEditor.DrawSequenceGUI(fungusScript); |
|
GUILayout.EndScrollView(); |
|
|
|
Command inspectCommand = null; |
|
if (fungusScript.selectedCommands.Count == 1) |
|
{ |
|
inspectCommand = fungusScript.selectedCommands[0]; |
|
} |
|
|
|
if (Application.isPlaying && |
|
inspectCommand != null && |
|
inspectCommand.parentSequence != sequence) |
|
{ |
|
Repaint(); |
|
DestroyImmediate(sequenceEditor); |
|
return; |
|
} |
|
|
|
ResizeScrollView(fungusScript); |
|
|
|
GUILayout.Space(7); |
|
|
|
sequenceEditor.DrawButtonToolbar(); |
|
|
|
commandScrollPos = GUILayout.BeginScrollView(commandScrollPos); |
|
|
|
if (inspectCommand != null) |
|
{ |
|
CommandEditor commandEditor = Editor.CreateEditor(inspectCommand) as CommandEditor; |
|
commandEditor.DrawCommandInspectorGUI(); |
|
DestroyImmediate(commandEditor); |
|
} |
|
|
|
GUILayout.EndScrollView(); |
|
|
|
GUILayout.EndArea(); |
|
|
|
// Draw the resize bar after everything else has finished drawing |
|
// This is mainly to avoid incorrect indenting. |
|
Rect resizeRect = new Rect(0, topPanelHeight + fungusScript.sequenceViewHeight + 1, Screen.width, 4f); |
|
GUI.color = new Color(0.64f, 0.64f, 0.64f); |
|
GUI.DrawTexture(resizeRect, EditorGUIUtility.whiteTexture); |
|
resizeRect.height = 1; |
|
GUI.color = new Color32(132, 132, 132, 255); |
|
GUI.DrawTexture(resizeRect, EditorGUIUtility.whiteTexture); |
|
resizeRect.y += 3; |
|
GUI.DrawTexture(resizeRect, EditorGUIUtility.whiteTexture); |
|
GUI.color = Color.white; |
|
|
|
Repaint(); |
|
|
|
DestroyImmediate(sequenceEditor); |
|
} |
|
|
|
private void ResizeScrollView(FungusScript fungusScript) |
|
{ |
|
Rect cursorChangeRect = new Rect(0, fungusScript.sequenceViewHeight + 1, Screen.width, 4f); |
|
|
|
EditorGUIUtility.AddCursorRect(cursorChangeRect, MouseCursor.ResizeVertical); |
|
|
|
if (Event.current.type == EventType.mouseDown && cursorChangeRect.Contains(Event.current.mousePosition)) |
|
{ |
|
resize = true; |
|
} |
|
|
|
if (resize) |
|
{ |
|
Undo.RecordObject(fungusScript, "Resize view"); |
|
fungusScript.sequenceViewHeight = Event.current.mousePosition.y; |
|
} |
|
|
|
// Make sure sequence view is always visible |
|
float height = fungusScript.sequenceViewHeight; |
|
height = Mathf.Max(200, height); |
|
height = Mathf.Min(Screen.height - 200,height); |
|
fungusScript.sequenceViewHeight = height; |
|
|
|
// Stop resizing if mouse is outside inspector window. |
|
// This isn't standard Unity UI behavior but it is robust and safe. |
|
if (resize && Event.current.type == EventType.mouseDrag) |
|
{ |
|
Rect windowRect = new Rect(0, 0, Screen.width, Screen.height); |
|
if (!windowRect.Contains(Event.current.mousePosition)) |
|
{ |
|
resize = false; |
|
} |
|
} |
|
|
|
if (Event.current.type == EventType.MouseUp) |
|
{ |
|
resize = false; |
|
} |
|
} |
|
} |
|
|
|
}
|
|
|