private void OnItemDoubleClicked(ActionTreeItemBase item, SerializedProperty property) { var viewData = GetOrCreateViewData(property); // Double-clicking on binding or action item opens property popup. PropertiesViewBase propertyView = null; if (item is BindingTreeItem) { if (viewData.ControlPickerState == null) { viewData.ControlPickerState = new InputControlPickerState(); } propertyView = new InputBindingPropertiesView(item.property, controlPickerState: viewData.ControlPickerState, expectedControlLayout: item.expectedControlLayout, onChange: change => viewData.TreeView.Reload()); } else if (item is ActionTreeItem) { propertyView = new InputActionPropertiesView(item.property, onChange: change => viewData.TreeView.Reload()); } if (propertyView != null) { var rect = new Rect(GUIUtility.GUIToScreenPoint(Event.current.mousePosition), Vector2.zero); PropertiesViewPopup.Show(rect, propertyView); } }
private void LoadPropertiesForSelection() { m_BindingPropertyView = null; m_ActionPropertyView = null; ////TODO: preserve interaction/processor selection when reloading // Nothing else to do if we don't have a selection in the middle pane or if // multiple items are selected (we don't currently have the ability to multi-edit). if (!m_ActionsTree.HasSelection() || m_ActionsTree.GetSelection().Count != 1) { return; } var item = m_ActionsTree.GetSelectedItems().FirstOrDefault(); if (item is BindingTreeItem) { // Grab the action for the binding and see if we have an expected control layout // set on it. Pass that on to the control picking machinery. var isCompositePartBinding = item is PartOfCompositeBindingTreeItem; var isCompositeBinding = item is CompositeBindingTreeItem; var actionItem = (isCompositePartBinding ? item.parent.parent : item.parent) as ActionTreeItem; Debug.Assert(actionItem != null); if (m_ControlPickerViewState == null) { m_ControlPickerViewState = new InputControlPickerState(); } // The toolbar may constrain the set of devices we're currently interested in by either // having one specific device selected from the current scheme or having at least a control // scheme selected. var controlPathsToMatch = (IEnumerable <string>)null; if (m_Toolbar.selectedDeviceRequirement != null) { // Single device selected from set of devices in control scheme. controlPathsToMatch = new[] { m_Toolbar.selectedDeviceRequirement.Value.controlPath }; } else if (m_Toolbar.selectedControlScheme != null) { // Constrain to devices from current control scheme. controlPathsToMatch = m_Toolbar.selectedControlScheme.Value.deviceRequirements.Select(x => x.controlPath); } else { // If there's no device filter coming from a control scheme, filter by supported // devices as given by settings. controlPathsToMatch = InputSystem.settings.supportedDevices; } // Show properties for binding. m_BindingPropertyView = new InputBindingPropertiesView( item.property, change => { if (change == InputBindingPropertiesView.k_PathChanged || change == InputBindingPropertiesView.k_CompositePartAssignmentChanged || change == InputBindingPropertiesView.k_CompositeTypeChanged) { ApplyAndReloadTrees(); } else { // Simple property change that doesn't affect the rest of the UI. Apply(); } }, m_ControlPickerViewState, expectedControlLayout: item.expectedControlLayout, controlSchemes: m_Toolbar.controlSchemes, controlPathsToMatch: controlPathsToMatch); } else if (item is ActionTreeItem actionItem) { // Show properties for action. m_ActionPropertyView = new InputActionPropertiesView( actionItem.property, // Apply without reload is enough here as modifying the properties of an action will // never change the structure of the data. change => Apply()); } }