protected override void OnGUI(Rect position, GUIContent label)
        {
            position = BeginBlock(metadata, position, label);

            var togglePosition = position.VerticalSection(ref y, EditorGUIUtility.singleLineHeight);

            var inputActionAsset = Flow.Predict <PlayerInput>(m_InputSystemUnit.Target, m_Reference)?.actions;

            if (!inputActionAsset)
            {
                EditorGUI.LabelField(togglePosition, "No Actions found");
            }
            else
            {
                var value = metadata.value is InputAction ? (InputAction)metadata.value : default;

                int currentIndex = -1;
                if (value != null && value.id != default)
                {
                    int i = 0;
                    foreach (var playerInputAction in inputActionAsset)
                    {
                        if (playerInputAction.id == value.id)
                        {
                            currentIndex = i;
                            break;
                        }
                        i++;
                    }
                }

                var displayedOptions = Enumerable.Repeat(new GUIContent("<None>"), 1).Concat(inputActionAsset.Select(a => new GUIContent(a.name))).ToArray();
                currentIndex = EditorGUI.Popup(togglePosition, currentIndex + 1, displayedOptions);
                if (EndBlock(metadata))
                {
                    metadata.RecordUndo();
                    if (currentIndex == 0)
                    {
                        metadata.value = default;
                    }
                    else
                    {
                        var inputAction = inputActionAsset.ElementAt(currentIndex - 1);

                        metadata.value =
                            InputAction_DirectConverter.MakeInputActionWithId(inputAction.id.ToString(),
                                                                              inputAction.name, inputAction.expectedControlType);
                    }
                }
                return;
            }

            EndBlock(metadata);
        }
        protected override void OnGUI(Rect position, GUIContent label)
        {
            position = BeginLabeledBlock(metadata, position, label);

            var togglePosition = position.VerticalSection(ref y, EditorGUIUtility.singleLineHeight);

            if (m_InputSystemUnit == null)
            {
                EndBlock(metadata);
                return;
            }

            var inputActionAsset = Flow.Predict <PlayerInput>(m_InputSystemUnit.Target, m_Reference)?.actions;

            if (!inputActionAsset)
            {
                EditorGUI.LabelField(togglePosition, "No Actions found");
            }
            else
            {
                var value = metadata.value is InputAction ? (InputAction)metadata.value : default;

                int currentIndex = -1;
                if (value != null && value.id != default)
                {
                    int i = 0;
                    foreach (var playerInputAction in inputActionAsset)
                    {
                        if (playerInputAction.id == value.id)
                        {
                            currentIndex = i;
                            break;
                        }
                        i++;
                    }
                }

                var displayedOptions = Enumerable.Repeat(new GUIContent("<None>"), 1).Concat(inputActionAsset.Select(a => new GUIContent(a.name))).ToArray();
                var newIndex         = EditorGUI.Popup(togglePosition, currentIndex + 1, displayedOptions);
                if (EndBlock(metadata) || ActionTypeHasChanged(currentIndex, value))
                {
                    metadata.RecordUndo();
                    if (newIndex == 0)
                    {
                        metadata.value = default;
                    }
                    else
                    {
                        var inputAction = inputActionAsset.ElementAt(newIndex - 1);

                        metadata.value =
                            InputAction_DirectConverter.MakeInputActionWithId(inputAction.id.ToString(),
                                                                              inputAction.name, inputAction.expectedControlType, inputAction.type);
                        m_InputSystemUnit.Analyser(m_Reference).isDirty = true;
                    }
                }
                return;
            }

            EndBlock(metadata);

            bool ActionTypeHasChanged(int currentIndex, InputAction value)
            {
                try
                {
                    // getting the total action count would be expensive, as it would need to be computed everytime
                    return(value?.type != inputActionAsset.ElementAt(currentIndex)?.type);
                }
                catch
                {
                    return(true);
                }
            }
        }