Esempio n. 1
0
        private void TransitionTableGUI()
        {
            Separator();
            EditorGUILayout.HelpBox("Click on any State's name to see the Transitions it contains, or click the Pencil/Wrench icon to see its Actions.", MessageType.Info);
            Separator();

            // For each fromState
            for (int i = 0; i < _fromStates.Count; i++)
            {
                var stateRect = BeginVertical(ContentStyle.WithPaddingAndMargins);
                EditorGUI.DrawRect(stateRect, ContentStyle.LightGray);

                var transitions = _transitionsByFromStates[i];

                // State Header
                var headerRect = BeginHorizontal();
                {
                    BeginVertical();
                    string label = transitions[0].SerializedTransition.FromState.objectReferenceValue.name;
                    if (i == 0)
                    {
                        label += " (Initial State)";
                    }

                    headerRect.height = EditorGUIUtility.singleLineHeight;
                    GUILayoutUtility.GetRect(headerRect.width, headerRect.height);
                    headerRect.x += 5;

                    // Toggle
                    {
                        var toggleRect = headerRect;
                        toggleRect.width -= 140;
                        _toggledIndex     =
                            EditorGUI.BeginFoldoutHeaderGroup(toggleRect, _toggledIndex == i, label, ContentStyle.StateListStyle) ?
                            i : _toggledIndex == i ? -1 : _toggledIndex;
                    }

                    Separator();
                    EndVertical();

                    // State Header Buttons
                    {
                        bool Button(Rect position, string icon) => GUI.Button(position, EditorGUIUtility.IconContent(icon));

                        var buttonRect = new Rect(x: headerRect.width - 25, y: headerRect.y, width: 35, height: 20);

                        // Move state down
                        if (i < _fromStates.Count - 1)
                        {
                            if (Button(buttonRect, "scrolldown"))
                            {
                                ReorderState(i, false);
                                EarlyOut();
                                return;
                            }
                            buttonRect.x -= 40;
                        }

                        // Move state up
                        if (i > 0)
                        {
                            if (Button(buttonRect, "scrollup"))
                            {
                                ReorderState(i, true);
                                EarlyOut();
                                return;
                            }
                            buttonRect.x -= 40;
                        }

                        // Switch to state editor
                        if (Button(buttonRect, "SceneViewTools"))
                        {
                            DisplayStateEditor(transitions[0].SerializedTransition.FromState.objectReferenceValue);
                            EarlyOut();
                            return;
                        }

                        void EarlyOut()
                        {
                            EndHorizontal();
                            EndFoldoutHeaderGroup();
                            EndVertical();
                            EndHorizontal();
                        }
                    }
                }
                EndHorizontal();

                if (_toggledIndex == i)
                {
                    EditorGUI.BeginChangeCheck();
                    stateRect.y += EditorGUIUtility.singleLineHeight * 2;

                    foreach (var transition in transitions)                     // Display all the transitions in the state
                    {
                        if (transition.Display(ref stateRect))                  // Return if there were changes
                        {
                            EditorGUI.EndChangeCheck();
                            EndFoldoutHeaderGroup();
                            EndVertical();
                            EndHorizontal();
                            return;
                        }
                        Separator();
                    }
                    if (EditorGUI.EndChangeCheck())
                    {
                        serializedObject.ApplyModifiedProperties();
                    }
                }

                EndFoldoutHeaderGroup();
                EndVertical();
                Separator();
            }

            var rect = BeginHorizontal();

            Space(rect.width - 55);

            // Display add transition button
            _addTransitionHelper.Display(rect);

            EndHorizontal();
        }
        private void TransitionTableGUI()
        {
            Separator();
            EditorGUILayout.HelpBox("Click on any State's name to see the Transitions it contains, or click the Pencil/Wrench icon to see its Actions.", MessageType.Info);
            Separator();

            serializedObject.UpdateIfRequiredOrScript();

            // For each fromState
            for (int i = 0; i < _fromStates.Count; i++)
            {
                var stateRect = BeginVertical(ContentStyle.WithPaddingAndMargins);
                EditorGUI.DrawRect(stateRect, ContentStyle.LightGray);

                var transitions = _transitionsByFromStates[i];

                // State Header
                var headerRect = BeginHorizontal();
                {
                    BeginVertical();
                    string label = transitions[0].SerializedTransition.FromState.objectReferenceValue.name;
                    if (i == 0)
                    {
                        label += " (Initial State)";
                    }

                    headerRect.height = EditorGUIUtility.singleLineHeight;
                    GUILayoutUtility.GetRect(headerRect.width, headerRect.height);
                    headerRect.x += 5;

                    // Toggle
                    {
                        var toggleRect = headerRect;
                        toggleRect.width -= 140;
                        _toggles[i]       = EditorGUI.BeginFoldoutHeaderGroup(toggleRect,
                                                                              foldout: _toggles[i],
                                                                              content: label,
                                                                              style: ContentStyle.StateListStyle);
                    }

                    Separator();
                    EndVertical();

                    // State Header Buttons
                    {
                        bool Button(Rect position, string icon) => GUI.Button(position, EditorGUIUtility.IconContent(icon));

                        var buttonRect = new Rect(
                            x: headerRect.width - 105,
                            y: headerRect.y,
                            width: 35,
                            height: 20);

                        // Switch to state editor
                        if (Button(buttonRect, "SceneViewTools"))
                        {
                            if (_cachedStateEditor == null)
                            {
                                _cachedStateEditor = CreateEditor(transitions[0].SerializedTransition.FromState.objectReferenceValue, typeof(StateEditor));
                            }
                            else
                            {
                                CreateCachedEditor(transitions[0].SerializedTransition.FromState.objectReferenceValue, typeof(StateEditor), ref _cachedStateEditor);
                            }

                            _displayStateEditor = true;
                            return;
                        }

                        buttonRect.x += 40;
                        // Move state up
                        if (Button(buttonRect, "scrollup"))
                        {
                            if (ReorderState(i, true))
                            {
                                return;
                            }
                        }

                        buttonRect.x += 40;
                        // Move state down
                        if (Button(buttonRect, "scrolldown"))
                        {
                            if (ReorderState(i, false))
                            {
                                return;
                            }
                        }
                    }
                }
                EndHorizontal();

                // If state is open
                if (_toggles[i])
                {
                    DisableAllStateTogglesExcept(i);
                    EditorGUI.BeginChangeCheck();

                    stateRect.y += EditorGUIUtility.singleLineHeight * 2;
                    // Display all the transitions in the state
                    foreach (var transition in transitions)
                    {
                        if (transition.Display(ref stateRect))
                        {
                            return;
                        }
                        Separator();
                    }
                    if (EditorGUI.EndChangeCheck())
                    {
                        serializedObject.ApplyModifiedProperties();
                    }
                }

                EndFoldoutHeaderGroup();
                EndVertical();
                //GUILayout.HorizontalSlider(0, 0, 0);
                Separator();
            }

            var rect = BeginHorizontal();

            Space(rect.width - 55);

            // Display add transition button
            _addTransitionHelper.Display(rect);

            EndHorizontal();
        }