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); } } }