Esempio n. 1
0
        private static void AddCharacterKeyBindingsTo(AdvancedDropdownItem parent, Keyboard keyboard)
        {
            foreach (var key in keyboard.children.OfType <KeyControl>())
            {
                if (!key.keyCode.IsTextInputKey())
                {
                    continue;
                }

                // We can only bind to characters that can be printed.
                var displayName = key.displayName;
                if (!displayName.All(x => x.IsPrintable()))
                {
                    continue;
                }

                if (displayName.Contains(')'))
                {
                    displayName = string.Join("", displayName.Select(x => "\\" + x));
                }

                ////TODO: should be searchable; when searching, needs different display name
                var item = new ControlDropdownItem(null, $"#({displayName})", "", keyboard.layout, "", false);
                item.name = key.displayName;

                parent.AddChild(item);
            }
        }
Esempio n. 2
0
        private void AddControlItem(DeviceDropdownItem parent, ControlDropdownItem parentControl,
                                    InputControlLayout.ControlItem control, string device, string usage, bool searchable)
        {
            // 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 ? control.name + i : control.name;
                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(controlLayout, parent, device, usage,
                                                 searchable, child);
                }
            }
        }
Esempio n. 3
0
        public ControlDropdownItem(ControlDropdownItem parent, string controlName, string displayName, string device, string usage, bool searchable)
            : base("")
        {
            m_Device = device;
            m_Usage  = usage;

            if (parent != null)
            {
                m_ControlPath = $"{parent.controlPath}/{controlName}";
            }
            else
            {
                m_ControlPath = controlName;
            }

            name = !string.IsNullOrEmpty(displayName) ? displayName : ObjectNames.NicifyVariableName(controlName);

            id     = controlPathWithDevice.GetHashCode();
            indent = parent?.indent + 1 ?? 0;

            if (searchable)
            {
                m_SearchableName = InputControlPath.ToHumanReadableString(controlPathWithDevice);
            }
        }
Esempio n. 4
0
        private void AddControlTreeItemsRecursive(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.isModifyingChildControlByPath)
                {
                    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;
                }

                var child = new ControlDropdownItem(parentControl, control.name, control.displayName,
                                                    device, usage, searchable);
                child.icon = EditorInputControlLayoutCache.GetIconForLayout(control.layout);

                if (LayoutMatchesExpectedControlLayoutFilter(control.layout))
                {
                    parent.AddChild(child);
                }

                var controlLayout = EditorInputControlLayoutCache.TryGetLayout(control.layout);
                if (controlLayout != null)
                {
                    AddControlTreeItemsRecursive(controlLayout, parent, device, usage,
                                                 searchable, child);
                }
            }

            // 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)
                {
                    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);
                }
            }
        }
Esempio n. 5
0
        private static void AddPhysicalKeyBindingsTo(AdvancedDropdownItem parent, Keyboard keyboard, bool searchable)
        {
            foreach (var key in keyboard.children.OfType <KeyControl>())
            {
                // If the key has a display name that differs from the key name, show it in the UI.
                var displayName    = key.name;
                var keyDisplayName = key.displayName;
                if (keyDisplayName.All(x => x.IsPrintable()) && keyDisplayName != key.name)
                {
                    displayName = $"{key.name} (Current Layout: {key.displayName})";
                }

                var item = new ControlDropdownItem(null, key.name, displayName,
                                                   keyboard.layout, "", searchable);

                parent.AddChild(item);
            }
        }
Esempio n. 6
0
        private static void AddPhysicalKeyBindingsTo(AdvancedDropdownItem parent, Keyboard keyboard, bool searchable)
        {
            foreach (var key in keyboard.children.OfType <KeyControl>())
            {
                // If the key has a display name that differs from the key name, show it in the UI.
                var displayName    = key.m_DisplayNameFromLayout;
                var keyDisplayName = key.displayName;
                if (keyDisplayName.All(x => x.IsPrintable()) && string.Compare(keyDisplayName, displayName,
                                                                               StringComparison.InvariantCultureIgnoreCase) != 0)
                {
                    displayName = $"{displayName} (Current Layout: {key.displayName})";
                }

                // For left/right modifier keys, prepend artificial combined version.
                ButtonControl combinedVersion = null;
                if (key == keyboard.leftShiftKey)
                {
                    combinedVersion = keyboard.shiftKey;
                }
                else if (key == keyboard.leftAltKey)
                {
                    combinedVersion = keyboard.altKey;
                }
                else if (key == keyboard.leftCtrlKey)
                {
                    combinedVersion = keyboard.ctrlKey;
                }
                if (combinedVersion != null)
                {
                    parent.AddChild(new ControlDropdownItem(null, combinedVersion.name, combinedVersion.displayName, keyboard.layout,
                                                            "", searchable));
                }

                var item = new ControlDropdownItem(null, key.name, displayName,
                                                   keyboard.layout, "", searchable);

                parent.AddChild(item);
            }
        }
        public void AddControlItem(InputControlPickerDropdown dropdown, DeviceDropdownItem parent, ControlDropdownItem parentControl,
                                   InputControlLayout.ControlItem control, string device, string usage, bool searchable)
        {
            // for the Press control, show two variants, one for single touch presses, and another for multi-touch presses
            if (control.displayName == "Press")
            {
                dropdown.AddControlItem(this, parent, parentControl, new InputControlLayout.ControlItem
                {
                    name        = new InternedString("Press"),
                    displayName = new InternedString("Press (Single touch)"),
                    layout      = control.layout
                }, device, usage, searchable);

                dropdown.AddControlItem(this, parent, parentControl, new InputControlLayout.ControlItem
                {
                    name        = new InternedString("Press"),
                    displayName = new InternedString("Press (Multi-touch)"),
                    layout      = control.layout
                }, device, usage, searchable, "touch*/Press");
            }
            else
            {
                dropdown.AddControlItem(this, parent, parentControl, control, device, usage, searchable);
            }
        }
 public void AddControlItem(InputControlPickerDropdown dropdown, DeviceDropdownItem parent,
                            ControlDropdownItem parentControl,
                            InputControlLayout.ControlItem control, string device, string usage, bool searchable)
 {
     dropdown.AddControlItem(this, parent, parentControl, control, device, usage, searchable);
 }