/// <summary>
        /// Daws a list of all transitions of the state machine
        /// </summary>
        private void DrawTransitionList()
        {
            this.showTransitions = EditorGUILayout.Foldout(this.showTransitions, "Transitions");

            if (this.showTransitions)
            {
                GUILayoutUtils.Ident(() =>
                {
                    this.transitionSearchFilter = EditorGUILayout.TextField("Search", this.transitionSearchFilter);

                    EditorGUILayout.Space();

                    string filterKeyword = this.transitionSearchFilter.ToLower();

                    foreach (var transition in this.graph.Transitions)
                    {
                        GUILayoutUtils.HorizontalGroup(() =>
                        {
                            if (transition != null && transition.ID.ToLower().Contains(filterKeyword))
                            {
                                EditorGUILayout.LabelField(transition.ID);

                                if (GUILayout.Button(this.selectButtonContent, EditorStyles.miniButton, GUILayout.Width(50)))
                                {
                                    EditorWindowCommands.OpenStateMachineGraph(this.stateMachine).SelectTransition(transition);
                                }
                            }
                        });
                    }
                });
            }
        }
        /// <summary>
        /// Draws a list of all states of the state machine
        /// </summary>
        private void DrawStateList()
        {
            this.showStates = EditorGUILayout.Foldout(this.showStates, this.stateListFoldoutContent);

            if (this.showStates)
            {
                GUILayoutUtils.Ident(() =>
                {
                    this.stateSearchFilter = EditorGUILayout.TextField("Search", this.stateSearchFilter);

                    EditorGUILayout.Space();

                    string filterKeyword = this.stateSearchFilter.ToLower();

                    foreach (var node in this.graph.Nodes)
                    {
                        if (node is State state)
                        {
                            GUILayoutUtils.HorizontalGroup(() =>
                            {
                                if (state.ID.ToLower().Contains(filterKeyword))
                                {
                                    EditorGUILayout.LabelField(state.ID);

                                    if (GUILayout.Button(this.selectButtonContent, EditorStyles.miniButton, GUILayout.Width(50)))
                                    {
                                        EditorWindowCommands.OpenStateMachineGraph(this.stateMachine).SelectState(state);
                                    }
                                }
                            });
                        }
                    }
                });
            }
        }
        /// <summary>
        /// Draws the button to open the State Machine Graph Editor
        /// </summary>
        private void DrawGraphButton()
        {
            GUILayoutUtils.HorizontalGroup(() =>
            {
                EditorGUILayout.LabelField("Graph Editor");

                if (GUILayout.Button(this.openButtonContent, EditorStyles.miniButton, GUILayout.Width(50)))
                {
                    var castedTarget = (this.target as StateMachine);

                    EditorWindowCommands.OpenStateMachineGraph(castedTarget);
                }
            });
        }
        public override void OnInspectorGUI()
        {
            if (this.stateMachine == null)
            {
                return;
            }

            this.serializedObject.Update();

            GUILayoutUtils.VerticalSpace(8);

            DrawGraphButton();

            GUILayoutUtils.VerticalSpace(4);

            DrawStateList();
            DrawTransitionList();

            this.serializedObject.ApplyModifiedProperties();
        }