Skip to content

Commit 507cd76

Browse files
FIX: UI inconsistencies - Single helpbox for repetitive default settings mentions (#2372)
1 parent 875f33b commit 507cd76

9 files changed

Lines changed: 78 additions & 45 deletions

File tree

Packages/com.unity.inputsystem/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
99

1010
### Fixed
1111

12+
- Simplified default setting messaging by consolidating repetitive messages into a single HelpBox.
1213
- Fixed a `NullPointerReferenceException` thrown in `InputManagerStateMonitors.FireStateChangeNotifications` logging by adding validation [UUM-136095].
1314
- Fixed auto-save not working for Input System actions in Project Settings when both the Project Settings and Input System Actions windows were open [UUM-134035](https://jira.unity3d.com/browse/UUM-134035)
1415
- Improved New Input System warning dialog, Native Device Inputs Not Enabled [UUM-132151].

Packages/com.unity.inputsystem/InputSystem/Actions/Interactions/HoldInteraction.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ public override void OnDrawVisualElements(VisualElement root, Action onChangedCa
135135
{
136136
m_DurationSetting.OnDrawVisualElements(root, onChangedCallback);
137137
m_PressPointSetting.OnDrawVisualElements(root, onChangedCallback);
138+
CustomOrDefaultSetting.AddSharedDefaultSettingsFooter(root,
139+
new[] { m_PressPointSetting, m_DurationSetting });
138140
}
139141

140142
private CustomOrDefaultSetting m_DurationSetting;

Packages/com.unity.inputsystem/InputSystem/Actions/Interactions/MultiTapInteraction.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ public override void OnDrawVisualElements(VisualElement root, Action onChangedCa
222222
m_TapDelaySetting.OnDrawVisualElements(root, onChangedCallback);
223223
m_TapTimeSetting.OnDrawVisualElements(root, onChangedCallback);
224224
m_PressPointSetting.OnDrawVisualElements(root, onChangedCallback);
225+
CustomOrDefaultSetting.AddSharedDefaultSettingsFooter(root,
226+
new[] { m_TapTimeSetting, m_TapDelaySetting, m_PressPointSetting });
225227
}
226228

227229
private readonly GUIContent m_TapCountLabel = new GUIContent("Tap Count", "How many taps need to be performed in succession. Two means double-tap, three means triple-tap, and so on.");

Packages/com.unity.inputsystem/InputSystem/Actions/Interactions/PressInteraction.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,8 @@ public override void OnDrawVisualElements(VisualElement root, Action onChangedCa
237237
root.Add(behaviourDropdown);
238238

239239
m_PressPointSetting.OnDrawVisualElements(root, onChangedCallback);
240+
CustomOrDefaultSetting.AddSharedDefaultSettingsFooter(root,
241+
new[] { m_PressPointSetting });
240242
}
241243

242244
private CustomOrDefaultSetting m_PressPointSetting;

Packages/com.unity.inputsystem/InputSystem/Actions/Interactions/SlowTapInteraction.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ public override void OnDrawVisualElements(VisualElement root, Action onChangedCa
9999
{
100100
m_DurationSetting.OnDrawVisualElements(root, onChangedCallback);
101101
m_PressPointSetting.OnDrawVisualElements(root, onChangedCallback);
102+
CustomOrDefaultSetting.AddSharedDefaultSettingsFooter(root,
103+
new[] { m_DurationSetting, m_PressPointSetting });
102104
}
103105

104106
private CustomOrDefaultSetting m_DurationSetting;

Packages/com.unity.inputsystem/InputSystem/Actions/Interactions/TapInteraction.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ public override void OnDrawVisualElements(VisualElement root, Action onChangedCa
125125
{
126126
m_DurationSetting.OnDrawVisualElements(root, onChangedCallback);
127127
m_PressPointSetting.OnDrawVisualElements(root, onChangedCallback);
128+
CustomOrDefaultSetting.AddSharedDefaultSettingsFooter(root,
129+
new[] { m_DurationSetting, m_PressPointSetting });
128130
}
129131

130132
private CustomOrDefaultSetting m_DurationSetting;

Packages/com.unity.inputsystem/InputSystem/Controls/Processors/AxisDeadzoneProcessor.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ public override void OnDrawVisualElements(VisualElement root, Action onChangedCa
104104
{
105105
m_MinSetting.OnDrawVisualElements(root, onChangedCallback);
106106
m_MaxSetting.OnDrawVisualElements(root, onChangedCallback);
107+
CustomOrDefaultSetting.AddSharedDefaultSettingsFooter(root,
108+
new[] { m_MinSetting, m_MaxSetting });
107109
}
108110

109111
private CustomOrDefaultSetting m_MinSetting;

Packages/com.unity.inputsystem/InputSystem/Controls/Processors/StickDeadzoneProcessor.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ public override void OnDrawVisualElements(VisualElement root, Action onChangedCa
9393
{
9494
m_MinSetting.OnDrawVisualElements(root, onChangedCallback);
9595
m_MaxSetting.OnDrawVisualElements(root, onChangedCallback);
96+
CustomOrDefaultSetting.AddSharedDefaultSettingsFooter(root,
97+
new[] { m_MinSetting, m_MaxSetting });
9698
}
9799

98100
private CustomOrDefaultSetting m_MinSetting;

Packages/com.unity.inputsystem/InputSystem/Editor/InputParameterEditor.cs

Lines changed: 63 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -215,14 +215,65 @@ public void Initialize(string label, string tooltip, string defaultName, Func<fl
215215
? $"If enabled, the default {label.ToLowerInvariant()} configured globally in the input settings is used. See Edit >> Project Settings... >> Input (NEW)."
216216
: "If enabled, the default value is used.");
217217
m_ValueLabel = EditorGUIUtility.TrTextContent(label, tooltip);
218-
if (defaultComesFromInputSettings)
219-
m_OpenInputSettingsLabel = EditorGUIUtility.TrTextContent("Open Input Settings");
220218
m_DefaultInitializedValue = defaultInitializedValue;
221219
m_UseDefaultValue = Mathf.Approximately(getValue(), defaultInitializedValue);
222220
m_DefaultComesFromInputSettings = defaultComesFromInputSettings;
223-
m_HelpBoxText =
224-
EditorGUIUtility.TrTextContent(
225-
$"Uses \"{defaultName}\" set in project-wide input settings.");
221+
m_DefaultName = defaultName;
222+
}
223+
224+
/// <summary>
225+
/// Raised when the "use default" toggle changes. Allows multiple subscribers to react
226+
/// (e.g. refreshing shared footers) without overwriting each other.
227+
/// </summary>
228+
internal event Action onUseDefaultChanged;
229+
230+
internal static void AddSharedDefaultSettingsFooter(VisualElement root,
231+
IReadOnlyList<CustomOrDefaultSetting> settings)
232+
{
233+
if (settings == null || settings.Count == 0)
234+
return;
235+
236+
var footerContainer = new VisualElement();
237+
var helpBox = new HelpBox("", HelpBoxMessageType.None);
238+
var buttonContainer = new VisualElement { style = { flexDirection = FlexDirection.RowReverse } };
239+
var openInputSettingsButton = new Button(InputSettingsProvider.Open)
240+
{
241+
text = EditorGUIUtility.TrTextContent("Open Input Settings").text
242+
};
243+
openInputSettingsButton.AddToClassList("open-settings-button");
244+
buttonContainer.Add(openInputSettingsButton);
245+
footerContainer.Add(helpBox);
246+
footerContainer.Add(buttonContainer);
247+
248+
void RefreshFooter()
249+
{
250+
var namesInUse = new List<string>(settings.Count);
251+
foreach (var s in settings)
252+
{
253+
if (s.m_UseDefaultValue && s.m_DefaultComesFromInputSettings)
254+
namesInUse.Add(s.m_DefaultName);
255+
}
256+
if (namesInUse.Count > 0)
257+
{
258+
var quotedNames = new List<string>(namesInUse.Count);
259+
foreach (var n in namesInUse)
260+
quotedNames.Add($"\"{n}\"");
261+
var combinedNames = string.Join(", ", quotedNames);
262+
helpBox.text = EditorGUIUtility.TrTextContent(
263+
$"Uses {combinedNames} set in Input System Package Settings.").text;
264+
footerContainer.style.display = DisplayStyle.Flex;
265+
}
266+
else
267+
{
268+
footerContainer.style.display = DisplayStyle.None;
269+
}
270+
}
271+
272+
foreach (var s in settings)
273+
s.onUseDefaultChanged += RefreshFooter;
274+
275+
RefreshFooter();
276+
root.Add(footerContainer);
226277
}
227278

228279
public void OnDrawVisualElements(VisualElement root, Action onChangedCallback)
@@ -250,8 +301,6 @@ public void OnDrawVisualElements(VisualElement root, Action onChangedCallback)
250301
m_FloatField.RegisterCallback<BlurEvent>(_ => OnEditEnd(onChangedCallback));
251302
m_FloatField.SetEnabled(!m_UseDefaultValue);
252303

253-
m_HelpBox = new HelpBox(m_HelpBoxText.text, HelpBoxMessageType.None);
254-
255304
m_DefaultToggle = new Toggle("Default")
256305
{
257306
value = m_UseDefaultValue,
@@ -263,28 +312,9 @@ public void OnDrawVisualElements(VisualElement root, Action onChangedCallback)
263312
m_DefaultToggle.RegisterValueChangedCallback(evt => ToggleUseDefaultValue(evt, onChangedCallback));
264313
m_DefaultToggle.Q<Label>().style.minWidth = new StyleLength(StyleKeyword.Auto);
265314

266-
var buttonContainer = new VisualElement
267-
{
268-
style =
269-
{
270-
flexDirection = FlexDirection.RowReverse
271-
}
272-
};
273-
m_OpenInputSettingsButton = new Button(InputSettingsProvider.Open){text = m_OpenInputSettingsLabel.text};
274-
m_OpenInputSettingsButton.AddToClassList("open-settings-button");
275-
276315
settingsContainer.Add(m_FloatField);
277316
settingsContainer.Add(m_DefaultToggle);
278317
container.Add(settingsContainer);
279-
280-
if (m_UseDefaultValue)
281-
{
282-
buttonContainer.Add(m_OpenInputSettingsButton);
283-
container.Add(m_HelpBox);
284-
}
285-
286-
container.Add(buttonContainer);
287-
288318
root.Add(container);
289319
}
290320

@@ -314,7 +344,7 @@ private void ChangeSettingValue(ChangeEvent<float> evt)
314344

315345
private void OnEditEnd(Action onChangedCallback)
316346
{
317-
onChangedCallback.Invoke();
347+
onChangedCallback?.Invoke();
318348
}
319349

320350
private void ToggleUseDefaultValue(ChangeEvent<bool> evt, Action onChangedCallback)
@@ -327,6 +357,7 @@ private void ToggleUseDefaultValue(ChangeEvent<bool> evt, Action onChangedCallba
327357

328358
m_UseDefaultValue = evt.newValue;
329359
m_FloatField?.SetEnabled(!m_UseDefaultValue);
360+
onUseDefaultChanged?.Invoke();
330361
}
331362

332363
private void SetValue(float newValue)
@@ -361,15 +392,15 @@ public void OnGUI()
361392
if ((value - float.Epsilon) == m_DefaultInitializedValue)
362393
value = m_DefaultInitializedValue;
363394

364-
////TODO: use slider rather than float field
365395
var newValue = EditorGUILayout.FloatField(m_ValueLabel, value, GUILayout.ExpandWidth(false));
366396
if (!m_UseDefaultValue)
367397
SetValue(newValue);
368398

369399
EditorGUI.EndDisabledGroup();
370400

371401
var newUseDefault = GUILayout.Toggle(m_UseDefaultValue, m_ToggleLabel, GUILayout.ExpandWidth(false));
372-
if (newUseDefault != m_UseDefaultValue)
402+
var useDefaultChanged = newUseDefault != m_UseDefaultValue;
403+
if (useDefaultChanged)
373404
{
374405
if (!newUseDefault)
375406
m_SetValue(m_GetDefaultValue());
@@ -378,19 +409,9 @@ public void OnGUI()
378409
}
379410

380411
m_UseDefaultValue = newUseDefault;
412+
if (useDefaultChanged)
413+
onUseDefaultChanged?.Invoke();
381414
EditorGUILayout.EndHorizontal();
382-
383-
// If we're using a default from global InputSettings, show info text for that and provide
384-
// button to open input settings.
385-
if (m_UseDefaultValue && m_DefaultComesFromInputSettings)
386-
{
387-
EditorGUILayout.HelpBox(m_HelpBoxText);
388-
EditorGUILayout.BeginHorizontal();
389-
GUILayout.FlexibleSpace();
390-
if (GUILayout.Button(m_OpenInputSettingsLabel, EditorStyles.miniButton))
391-
InputSettingsProvider.Open();
392-
EditorGUILayout.EndHorizontal();
393-
}
394415
}
395416

396417
private Func<float> m_GetValue;
@@ -399,14 +420,11 @@ public void OnGUI()
399420
private bool m_UseDefaultValue;
400421
private bool m_DefaultComesFromInputSettings;
401422
private float m_DefaultInitializedValue;
423+
private string m_DefaultName;
402424
private GUIContent m_ToggleLabel;
403425
private GUIContent m_ValueLabel;
404-
private GUIContent m_OpenInputSettingsLabel;
405-
private GUIContent m_HelpBoxText;
406426
private FloatField m_FloatField;
407-
private Button m_OpenInputSettingsButton;
408427
private Toggle m_DefaultToggle;
409-
private HelpBox m_HelpBox;
410428
}
411429
}
412430
}

0 commit comments

Comments
 (0)