/// <summary>
 /// Constructor
 /// </summary>
 /// <param name="deviceNode">Device from which take the input</param>
 internal InputDeviceWrapper(XRNode deviceNode)
 {
     m_inputDevice     = InputDevices.GetDeviceAtXRNode(deviceNode);
     this.m_deviceNode = deviceNode;
     this.m_isSteamVR  = m_inputDevice.subsystem != null && m_inputDevice.subsystem.SubsystemDescriptor.id == "OpenVR Input";
 }
        TreeViewItem BuildInputDevicesTree()
        {
            int id       = 0;
            var rootItem = new Item
            {
                id          = id++,
                displayName = "Devices",
                depth       = 0
            };

            // Build children.
            var inputDevices = new List <InputDevice>();

            InputDevices.GetDevices(inputDevices);

            var deviceChildren = new List <TreeViewItem>();

            // Add device children
            foreach (var device in inputDevices)
            {
                var deviceItem = new Item
                {
                    id          = device.GetHashCode(),
                    displayName = device.name,
                    // TODO: need to display new characteristics API here.
#pragma warning disable 612, 618
                    deviceRole = device.role.ToString(),
#pragma warning restore 612, 618
                    depth = 1
                };
                deviceItem.parent = rootItem;

                List <InputFeatureUsage> featureUsages = new List <InputFeatureUsage>();
                device.TryGetFeatureUsages(featureUsages);

                var featureChildren = new List <TreeViewItem>();
                foreach (var featureUsage in featureUsages)
                {
                    Type featureType = featureUsage.type;
                    var  featureItem = new Item
                    {
                        id           = device.GetHashCode() ^ (featureUsage.GetHashCode() >> 1),
                        displayName  = featureUsage.name,
                        featureType  = featureType.ToString(),
                        featureValue = GetFeatureValue(device, featureUsage),
                        depth        = 2
                    };
                    featureItem.parent = deviceItem;
                    featureChildren.Add(featureItem);
                }

                deviceItem.children = featureChildren;
                deviceChildren.Add(deviceItem);
            }

            // Sort deviceChildren by name.
            deviceChildren.Sort((a, b) => string.Compare(a.displayName, b.displayName));
            rootItem.children = deviceChildren;

            return(rootItem);
        }