private void AddControlTreeItemsRecursive(IInputControlPickerLayout controlPickerLayout, InputControlLayout layout, DeviceDropdownItem parent, string device, string usage, bool searchable, ControlDropdownItem parentControl = null) { foreach (var control in layout.controls.OrderBy(a => a.name)) { if (control.isModifyingExistingControl) { continue; } // Skip variants except the default variant and variants dictated by the layout itself. if (!control.variants.IsEmpty() && control.variants != InputControlLayout.DefaultVariant && (layout.variants.IsEmpty() || !InputControlLayout.VariantsMatch(layout.variants, control.variants))) { continue; } controlPickerLayout.AddControlItem(this, parent, parentControl, control, device, usage, searchable); } // Add optional controls for devices. var optionalControls = EditorInputControlLayoutCache.GetOptionalControlsForLayout(layout.name); if (optionalControls.Any() && layout.isDeviceLayout) { var optionalGroup = new AdvancedDropdownItem("Optional Controls"); foreach (var optionalControl in optionalControls) { ////FIXME: this should list children, too ////FIXME: this should handle arrays, too if (LayoutMatchesExpectedControlLayoutFilter(optionalControl.layout)) { var child = new OptionalControlDropdownItem(optionalControl, device, usage); child.icon = EditorInputControlLayoutCache.GetIconForLayout(optionalControl.layout); optionalGroup.AddChild(child); } } if (optionalGroup.children.Any()) { var deviceName = EditorInputControlLayoutCache.TryGetLayout(device).m_DisplayName ?? ObjectNames.NicifyVariableName(device); parent.AddSeparator("Controls Present on More Specific " + deviceName.GetPlural()); parent.AddChild(optionalGroup); } } }
internal void AddControlItem(IInputControlPickerLayout controlPickerLayout, DeviceDropdownItem parent, ControlDropdownItem parentControl, InputControlLayout.ControlItem control, string device, string usage, bool searchable, string controlNameOverride = default) { var controlName = controlNameOverride ?? control.name; // If it's an array, generate a control entry for each array element. for (var i = 0; i < (control.isArray ? control.arraySize : 1); ++i) { var name = control.isArray ? controlName + i : controlName; var displayName = !string.IsNullOrEmpty(control.displayName) ? (control.isArray ? $"{control.displayName} #{i}" : control.displayName) : name; var child = new ControlDropdownItem(parentControl, name, displayName, device, usage, searchable); child.icon = EditorInputControlLayoutCache.GetIconForLayout(control.layout); var controlLayout = EditorInputControlLayoutCache.TryGetLayout(control.layout); if (LayoutMatchesExpectedControlLayoutFilter(control.layout)) { parent.AddChild(child); } else if (controlLayout.controls.Any(x => LayoutMatchesExpectedControlLayoutFilter(x.layout))) { child.enabled = false; parent.AddChild(child); } // Add children. if (controlLayout != null) { AddControlTreeItemsRecursive(controlPickerLayout, controlLayout, parent, device, usage, searchable, child); } } }