Skip to content

Commit e972f16

Browse files
Add fix for multiple null refs caused by a control scheme being deleted by Undoing the creation of it via ctrl+z.
1 parent d1d72d5 commit e972f16

File tree

3 files changed

+41
-16
lines changed

3 files changed

+41
-16
lines changed

Packages/com.unity.inputsystem/InputSystem/Editor/UITKAssetEditor/Commands/ControlSchemeCommands.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,16 @@ public static Command ResetSelectedControlScheme()
145145
{
146146
return (in InputActionsEditorState state) =>
147147
{
148-
var controlSchemeSerializedProperty = state.selectedControlSchemeIndex == -1 ? null :
149-
state.serializedObject
150-
.FindProperty(nameof(InputActionAsset.m_ControlSchemes))
151-
.GetArrayElementAtIndex(state.selectedControlSchemeIndex);
148+
SerializedProperty controlSchemeSerializedProperty = null;
149+
var serializedProperty = state.serializedObject
150+
.FindProperty(nameof(InputActionAsset.m_ControlSchemes));
151+
152+
if (state.selectedControlSchemeIndex < serializedProperty.arraySize)
153+
{
154+
controlSchemeSerializedProperty = state.selectedControlSchemeIndex == -1 ? null :
155+
serializedProperty
156+
.GetArrayElementAtIndex(state.selectedControlSchemeIndex);
157+
}
152158

153159
if (controlSchemeSerializedProperty == null)
154160
{

Packages/com.unity.inputsystem/InputSystem/Editor/UITKAssetEditor/Views/ControlSchemesView.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ private void RemoveDeviceRequirement()
108108
public override void RedrawUI(InputControlScheme viewState)
109109
{
110110
rootElement.Q<TextField>(kControlSchemeNameTextField).value = string.IsNullOrEmpty(m_NewName) ? viewState.name : m_NewName;
111-
112111
m_ListView.itemsSource?.Clear();
113112
m_ListView.itemsSource = viewState.deviceRequirements.Count > 0 ?
114113
viewState.deviceRequirements.Select(r => (r.controlPath, r.isOptional)).ToList() :
@@ -128,7 +127,7 @@ private void SaveAndClose()
128127
CloseView();
129128
}
130129

131-
private void Cancel()
130+
internal void Cancel()
132131
{
133132
// Reload the selected ControlScheme values from the SerilaizedProperty and throw away any changes
134133
Dispatch(ControlSchemeCommands.ResetSelectedControlScheme());

Packages/com.unity.inputsystem/InputSystem/Editor/UITKAssetEditor/Views/InputActionsEditorView.cs

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ internal class InputActionsEditorView : ViewBase<InputActionsEditorView.ViewStat
2323
private readonly ToolbarButton m_SaveButton;
2424

2525
private readonly Action m_SaveAction;
26+
27+
private ControlSchemesView m_ControlSchemesView;
2628

2729
public InputActionsEditorView(VisualElement root, StateContainer stateContainer, bool isProjectSettings,
2830
Action saveAction)
@@ -91,7 +93,7 @@ public InputActionsEditorView(VisualElement root, StateContainer stateContainer,
9193

9294
// only register the state changed event here in the parent. Changes will be cascaded
9395
// into child views.
94-
stateContainer.StateChanged += OnStateChanged;
96+
stateContainer.StateChanged += StateChanged(stateContainer);
9597

9698
CreateSelector(
9799
s => s.selectedControlSchemeIndex,
@@ -106,6 +108,22 @@ public InputActionsEditorView(VisualElement root, StateContainer stateContainer,
106108
s_OnPasteCutElements.Add(this);
107109
}
108110

111+
private Action<InputActionsEditorState, UIRebuildMode> StateChanged(StateContainer stateContainer)
112+
{
113+
return (inputActionsEditorState, uiRebuildMode) =>
114+
{
115+
var state = stateContainer.GetState();
116+
var viewState = ViewStateSelector.GetViewState(state);
117+
var elementAtOrDefault = viewState.controlSchemes?.ElementAtOrDefault(viewState.selectedControlSchemeIndex);
118+
if (viewState.selectedControlSchemeIndex != -1 && elementAtOrDefault == default(InputControlScheme))
119+
{
120+
m_ControlSchemesView?.Cancel();
121+
}
122+
123+
OnStateChanged(inputActionsEditorState, uiRebuildMode);
124+
};
125+
}
126+
109127
private void OnReset()
110128
{
111129
Dispatch(Commands.ReplaceActionMaps(ProjectWideActionsAsset.GetDefaultAssetJson()));
@@ -156,9 +174,8 @@ private void SetUpControlSchemesMenu(ViewState viewState)
156174

157175
if (viewState.controlSchemes.Any())
158176
{
159-
m_ControlSchemesToolbar.text = viewState.selectedControlSchemeIndex == -1
160-
? "All Control Schemes"
161-
: viewState.controlSchemes.ElementAt(viewState.selectedControlSchemeIndex).name;
177+
var elementAtOrDefault = viewState.controlSchemes.ElementAtOrDefault(viewState.selectedControlSchemeIndex);
178+
m_ControlSchemesToolbar.text = elementAtOrDefault == default ? "All Control Schemes" : elementAtOrDefault.name;
162179

163180
m_ControlSchemesToolbar.menu.AppendAction("All Control Schemes", _ => SelectControlScheme(-1),
164181
viewState.selectedControlSchemeIndex == -1 ? DropdownMenuAction.Status.Checked : DropdownMenuAction.Status.Normal);
@@ -186,7 +203,7 @@ private void SetUpDevicesMenu(ViewState viewState)
186203
return;
187204
}
188205
m_DevicesToolbar.SetEnabled(true);
189-
var currentControlScheme = viewState.controlSchemes.ElementAt(viewState.selectedControlSchemeIndex);
206+
var currentControlScheme = viewState.controlSchemes.ElementAtOrDefault(viewState.selectedControlSchemeIndex);
190207
if (viewState.selectedDeviceIndex == -1)
191208
m_DevicesToolbar.text = "All Devices";
192209

@@ -228,12 +245,15 @@ private void DeleteControlScheme(DropdownMenuAction obj)
228245

229246
private void ShowControlSchemeEditor(VisualElement parent, bool updateExisting = false)
230247
{
231-
var controlSchemesView = CreateChildView(new ControlSchemesView(parent, stateContainer, updateExisting));
232-
controlSchemesView.UpdateView(stateContainer.GetState());
233-
234-
controlSchemesView.OnClosing += _ => DestroyChildView(controlSchemesView);
248+
m_ControlSchemesView = CreateChildView(new ControlSchemesView(parent, stateContainer, updateExisting));
249+
m_ControlSchemesView.UpdateView(stateContainer.GetState());
250+
m_ControlSchemesView.OnClosing += _ =>
251+
{
252+
DestroyChildView(m_ControlSchemesView);
253+
m_ControlSchemesView = null;
254+
};
235255
}
236-
256+
237257
private void SelectControlScheme(int controlSchemeIndex)
238258
{
239259
Dispatch(ControlSchemeCommands.SelectControlScheme(controlSchemeIndex));

0 commit comments

Comments
 (0)