private void DisplayStates(AnimationSequenceBehaviour behaviour)
        {
            var nodes = GetStates(behaviour);

            foreach (var node in nodes)
            {
                Undo.RecordObject(node.Item2, "Property change");
                EditorGUI.indentLevel = 1;
                _foldouts[node.Item2] = EditorGUILayout.Foldout(_foldouts[node.Item2], node.Item1);
                if (_foldouts[node.Item2])
                {
                    var serializedObject = new SerializedObject(node.Item2);
                    var iter             = serializedObject.GetIterator();
                    if (iter == null)
                    {
                        continue;
                    }
                    iter.NextVisible(true);         //required by the API
                    EditorGUI.indentLevel = 2;
                    while (iter.NextVisible(false)) // skip the first property, it's script, we don't want it to display
                    {
                        EditorGUILayout.PropertyField(iter, true);
                    }
                    serializedObject.ApplyModifiedProperties();
                }
            }
        }
 private Tuple <string, BaseSequenceState>[] GetStates(AnimationSequenceBehaviour target)
 {
     return
         (target
          .clonedRoot
          .GetAllSequenceNodes()
          .Where(n => n.state != null)
          .Select(n => new Tuple <string, BaseSequenceState>(n.state.name, n.state))
          .ToArray());
 }
        private void SetFoldouts(AnimationSequenceBehaviour target)
        {
            var nodes = GetStates(target);

            var foldouts = nodes.ToDictionary(n => n.Item2, n => true);

            if (_foldouts == null)
            {
                _foldouts = foldouts;
                return;
            }
            foreach (var kvp in _foldouts)
            {
                if (foldouts.ContainsKey(kvp.Key))
                {
                    foldouts[kvp.Key] = kvp.Value;
                }
            }
            _foldouts = foldouts;
        }