// -------------------- static private void AddDigitalBindingAxisSubMenu(GenericMenu menu, string axis, BindingDescription desc, System.Action onRefreshCallback) { DigitalBinding digiBinding = (DigitalBinding)desc.binding; string menuPath = desc.menuPath + desc.nameFormatted + "/"; for (int i = -1; i < digiBinding.axisList.Count; ++i) { string menuItemPath = ""; DigitalBinding.AxisElem axisElem = digiBinding.GetAxisElem(i); if (i < 0) { menuItemPath = menuPath + "Add as new axis target/"; } else { if (string.IsNullOrEmpty(axisElem.axisName)) { menuItemPath = menuPath + "Replace EMPTY (" + i + ")/"; } else { menuItemPath = menuPath + "Replace \"" + axisElem.axisName + "\" (" + (axisElem.axisPositiveSide ? "Positive" : "Negative") + ") (" + i + ")/"; } } for (int sideIndex = 0; sideIndex < 2; ++sideIndex) { UniversalBindingAssignment o = new UniversalBindingAssignment(); o.undoLabel = "Bind " + axis + " axis to " + desc.name; o.undoObject = desc.undoObject; o.binding = desc.binding; o.onRefreshCallback = onRefreshCallback; o.digiAxisName = axis; o.digiAxisElemId = i; o.digiBindToPositiveAxis = ((sideIndex == 0) ? true : false); menu.AddItem(new GUIContent(menuItemPath + ((sideIndex == 0) ? "As Positive" : "As Negative")), false, o.Execute); } if ((i < 0) && (digiBinding.keyList.Count > 0)) { menu.AddSeparator(menuPath); } } }
// ---------------------- static private void AddDigitalBindingKeySubMenu(GenericMenu menu, KeyCode key, BindingDescription desc, System.Action onRefreshCallback) { DigitalBinding digiBinding = (DigitalBinding)desc.binding; string menuPath = desc.menuPath + desc.nameFormatted + "/"; for (int i = -1; i < digiBinding.keyList.Count; ++i) { UniversalBindingAssignment o = new UniversalBindingAssignment(); o.undoLabel = "Bind " + key + " key to " + desc.name; o.undoObject = desc.undoObject; o.binding = desc.binding; o.onRefreshCallback = onRefreshCallback; o.digiKey = key; o.digiKeyElemId = i; string menuItemLabel = ""; if (i < 0) { menuItemLabel = "Add new as new key target."; } else { menuItemLabel = "Replace \"" + digiBinding.keyList[i] + "\" (" + i + ")."; } menu.AddItem(new GUIContent(menuPath + menuItemLabel), true, o.Execute); if ((i < 0) && (digiBinding.keyList.Count > 0)) { menu.AddSeparator(menuPath); } } }
// ------------------ static private void AddAnalogBindingAxisSubMenu(GenericMenu menu, string axis, BindingDescription desc, System.Action onRefreshCallback) { AxisBinding bind = (AxisBinding)desc.binding; string menuPath = desc.menuPath + desc.nameFormatted + "/"; for (int i = -1; i < bind.targetList.Count; ++i) { string menuItemPath = ""; AxisBinding.TargetElem axisElem = bind.GetTarget(i); if (i < 0) { menuItemPath = menuPath + "Add as new axis target/"; } else { if (axisElem.separateAxes) { menuItemPath = menuPath + "Replace separated(+,-) " + (string.IsNullOrEmpty(axisElem.positiveAxis) ? "EMPTY" : ("\"" + axisElem.positiveAxis + "\"" + (axisElem.positiveAxisAsPositive ? "" : " (as negative)"))) + " : " + (string.IsNullOrEmpty(axisElem.negativeAxis) ? "EMPTY" : ("\"" + axisElem.negativeAxis + "\"" + (axisElem.negativeAxisAsPositive ? "(as positive)" : ""))) + " (" + i + ")/"; } else { if (string.IsNullOrEmpty(axisElem.singleAxis)) { menuItemPath = menuPath + "Replace single EMPTY (" + i + ")/"; } else { menuItemPath = menuPath + "Replace single \"" + axisElem.singleAxis + "\"" + (axisElem.reverseSingleAxis ? " (Flipped)" : "") + " (" + i + ")/"; } } } for (int targetModeIndex = 0; targetModeIndex < 6; ++targetModeIndex) { UniversalBindingAssignment o = new UniversalBindingAssignment(); o.undoLabel = "Bind " + axis + " axis to " + desc.name; o.undoObject = desc.undoObject; o.binding = desc.binding; o.onRefreshCallback = onRefreshCallback; o.analogAxisName = axis; o.analogElemId = i; string modeName = ""; switch (targetModeIndex) { case 0: modeName = "Single"; o.analogSeparate = false; o.analogFlip = false; break; case 1: modeName = "Single (Flipped)"; o.analogSeparate = false; o.analogFlip = true; break; case 2: modeName = "Separated, Positive Side"; o.analogSeparate = true; o.analogPositiveSide = true; o.analogFlip = false; break; case 3: modeName = "Separated, Positive Side (Flipped)"; o.analogSeparate = true; o.analogPositiveSide = true; o.analogFlip = true; break; case 4: modeName = "Separated, Negative Side"; o.analogSeparate = true; o.analogPositiveSide = false; o.analogFlip = false; break; case 5: modeName = "Separated, Negative Side (Flipped)"; o.analogSeparate = true; o.analogPositiveSide = false; o.analogFlip = true; break; } menu.AddItem(new GUIContent(menuItemPath + modeName), false, o.Execute); if ((targetModeIndex & 1) == 1) { menu.AddSeparator(menuItemPath); } } if ((i < 0) && (bind.targetList.Count > 0)) { menu.AddSeparator(menuPath); } } }
// ------------------------ static public void CreateContextMenuForKeyBinding(Object panelOrRig, KeyCode key, System.Action onRefreshCallback = null) { InputRig rig = (panelOrRig as InputRig); TouchControlPanel panel = (panelOrRig as TouchControlPanel); string axisName = null; //bool displayPanelName = false; if (panel != null) { rig = panel.rig; } else if (rig != null) { // Auto Select panel... panel = TouchControlWizardUtils.GetRigPanel(rig); //displayPanelName = true; } else { return; } List <TouchControl> controlList = rig.GetTouchControls(); GenericMenu menu = new GenericMenu(); string commandName = (string.IsNullOrEmpty(axisName) ? ("\"" + key.ToString() + "\" keycode ") : ("\"" + axisName + "\" axis ")); menu.AddDisabledItem(new GUIContent("Actions for : " + commandName)); menu.AddSeparator(""); { UniversalBindingAssignment.AddBindingContainerToMenu(menu, rig, onRefreshCallback, BindingDescription.BindingType.Digital, commandName, "Bind to Input Rig/", rig, key, null); //, null); menu.AddSeparator(""); if (panel == null) { menu.AddDisabledItem(new GUIContent("Add a Touch Control Panel to this rig to create and bind commands to Touch Controls!")); } else { UniversalBindingAssignment.AddControlListBindingsToMenu(menu, controlList, onRefreshCallback, BindingDescription.BindingType.Digital, commandName, "Bind to Touch Controls/", key, null); // true); //, null); menu.AddSeparator(""); AddTouchControlCreationItemsToMenuForAxisOrKey(menu, panel, null, key, onRefreshCallback); } } menu.ShowAsContext(); }
// ---------------------- static public void AddBindingContainerToMenu( GenericMenu menu, IBindingContainer bc, System.Action onRefreshCallback, BindingDescription.BindingType typeMask, string commandName, string menuPath, Object undoObject, KeyCode digiKey = KeyCode.None, string axisName = null, int axisInputSourceMask = ((1 << 16) - 1)) //bool digiBindToPositiveAxis = true) //string joyName = null) { BindingDescriptionList bindingDescList = new BindingDescriptionList(typeMask, false, axisInputSourceMask, FormatBindingMenuLabel); //bc.GetSubBindingDescriptions(bindingDescList, typeMask, undoObject, menuPath, false, axisInputSourceMask); bc.GetSubBindingDescriptions(bindingDescList, undoObject, menuPath); for (int i = 0; i < bindingDescList.Count; ++i) { BindingDescription desc = bindingDescList[i]; string itemLabel = ""; bool itemEnabled = false; DigitalBinding digiBinding = (desc.binding as DigitalBinding); AxisBinding analogBinding = (desc.binding as AxisBinding); EmuTouchBinding touchBinding = (desc.binding as EmuTouchBinding); MousePositionBinding mouseBinding = (desc.binding as MousePositionBinding); // Digi binding... if (digiBinding != null) { // o.digiKey = digiKey; // o.digiAxisName = axisName; // o.digiBindToPositiveAxis = true; if (digiKey != KeyCode.None) { AddDigitalBindingKeySubMenu(menu, digiKey, desc, onRefreshCallback); } else if (!string.IsNullOrEmpty(axisName)) { AddDigitalBindingAxisSubMenu(menu, axisName, desc, onRefreshCallback); } } // Analog binding... else if (analogBinding != null) { AddAnalogBindingAxisSubMenu(menu, axisName, desc, onRefreshCallback); } // Touch binding... else if (touchBinding != null) { UniversalBindingAssignment o = new UniversalBindingAssignment(); o.undoObject = desc.undoObject; o.binding = desc.binding; o.onRefreshCallback = onRefreshCallback; o.undoLabel = "Bind [" + desc.nameFormatted + "] to Eumlated Touch."; itemLabel = o.undoLabel; menu.AddItem(new GUIContent(desc.menuPath + itemLabel), itemEnabled, o.Execute); } // Mouse binding... else if (mouseBinding != null) { UniversalBindingAssignment o = new UniversalBindingAssignment(); o.undoObject = desc.undoObject; o.binding = desc.binding; o.onRefreshCallback = onRefreshCallback; o.undoLabel = "Bind [" + desc.nameFormatted + "] to Mouse Position."; itemLabel = o.undoLabel; menu.AddItem(new GUIContent(desc.menuPath + itemLabel), itemEnabled, o.Execute); } else { continue; } } }
// ------------------------ static public void CreateContextMenuForEmuTouchBinding(Object panelOrRig, System.Action onRefreshCallback = null) { InputRig rig = (panelOrRig as InputRig); TouchControlPanel panel = (panelOrRig as TouchControlPanel); //bool displayPanelName = false; if (panel != null) { rig = panel.rig; } else if (rig != null) { // Auto Select panel... panel = TouchControlWizardUtils.GetRigPanel(rig); //displayPanelName = true; } else { return; } List <TouchControl> controlList = rig.GetTouchControls(); GenericMenu menu = new GenericMenu(); string commandName = ("Emuulated Touch "); menu.AddDisabledItem(new GUIContent("Actions for : " + commandName)); menu.AddSeparator(""); UniversalBindingAssignment.AddBindingContainerToMenu(menu, rig, onRefreshCallback, BindingDescription.BindingType.EmuTouch, commandName, "Bind to Input Rig/", rig); menu.AddSeparator(""); if (panel == null) { menu.AddDisabledItem(new GUIContent("Add a Touch Control Panel to this rig to create and bind commands to Touch Controls!")); } else { UniversalBindingAssignment.AddControlListBindingsToMenu(menu, controlList, onRefreshCallback, BindingDescription.BindingType.EmuTouch, commandName, "Bind to Touch Controls/"); menu.AddSeparator(""); WizardMenuItem.AddToMenu(menu, "Create a Super Touch Zone/Super Touch Zone with " + commandName + "bound to [Single-finger Touch]...", panel, typeof(SuperTouchZoneCreationWizard), SuperTouchZoneCreationWizard.BindingSetup.EmuTouch(1), onRefreshCallback); WizardMenuItem.AddToMenu(menu, "Create a Super Touch Zone/Super Touch Zone with " + commandName + "bound to [Two-finger Touch]...", panel, typeof(SuperTouchZoneCreationWizard), SuperTouchZoneCreationWizard.BindingSetup.EmuTouch(2), onRefreshCallback); menu.AddSeparator("Create a Super Touch Zone/"); WizardMenuItem.AddToMenu(menu, "Create a Super Touch Zone/Super Touch Zone...", panel, typeof(SuperTouchZoneCreationWizard), null, onRefreshCallback); } menu.ShowAsContext(); }
// ------------------------ static public void CreateContextMenuForMousePositionBinding(Object panelOrRig, System.Action onRefreshCallback = null) { InputRig rig = (panelOrRig as InputRig); TouchControlPanel panel = (panelOrRig as TouchControlPanel); //bool displayPanelName = false; if (panel != null) { rig = panel.rig; } else if (rig != null) { // Auto Select panel... panel = TouchControlWizardUtils.GetRigPanel(rig); //displayPanelName = true; } else { return; } List <TouchControl> controlList = rig.GetTouchControls(); GenericMenu menu = new GenericMenu(); string commandName = ("Mouse Position "); menu.AddDisabledItem(new GUIContent("Actions for : " + commandName)); menu.AddSeparator(""); UniversalBindingAssignment.AddBindingContainerToMenu(menu, rig, onRefreshCallback, BindingDescription.BindingType.MousePos, commandName, "Bind to Input Rig/", rig); menu.AddSeparator(""); if (panel == null) { menu.AddDisabledItem(new GUIContent("Add a Touch Control Panel to this rig to create and bind commands to Touch Controls!")); } else { UniversalBindingAssignment.AddControlListBindingsToMenu(menu, controlList, onRefreshCallback, BindingDescription.BindingType.MousePos, commandName, "Bind to Touch Controls/"); menu.AddSeparator(""); int mouseTargetMaxId = CFUtils.GetEnumMaxValue(typeof(SuperTouchZoneCreationWizard.BindingSetup.MouseBindingTarget)); for (int i = 1; i <= 2; ++i) { for (int j = 1; j <= mouseTargetMaxId; ++j) { SuperTouchZoneCreationWizard.BindingSetup.MouseBindingTarget mouseTarget = (SuperTouchZoneCreationWizard.BindingSetup.MouseBindingTarget)j; WizardMenuItem.AddToMenu(menu, "Create a Super Touch Zone/Super Touch Zone with " + commandName + "bound to [" + ((i == 1) ? "Single-finger" : "Two-finger") + mouseTarget.ToString() + "]...", panel, typeof(SuperTouchZoneCreationWizard), SuperTouchZoneCreationWizard.BindingSetup.MousePos(i, mouseTarget), onRefreshCallback); } } menu.AddSeparator("Create a Super Touch Zone/"); WizardMenuItem.AddToMenu(menu, "Create a Super Touch Zone/Super Touch Zone...", panel, typeof(SuperTouchZoneCreationWizard), null, onRefreshCallback); } menu.ShowAsContext(); }
// ------------------------ static public void CreateContextMenuForAxisBinding(Object panelOrRig, string axisName, /*InputRig.InputSource sourceType, */ System.Action onRefreshCallback = null) { InputRig rig = (panelOrRig as InputRig); TouchControlPanel panel = (panelOrRig as TouchControlPanel); //bool displayPanelName = false; if (panel != null) { rig = panel.rig; } else if (rig != null) { // Auto Select panel... panel = TouchControlWizardUtils.GetRigPanel(rig); //displayPanelName = true; } else { return; } List <TouchControl> controlList = rig.GetTouchControls(); GenericMenu menu = new GenericMenu(); string commandName = ("\"" + axisName + "\" axis "); menu.AddDisabledItem(new GUIContent("Actions for : " + commandName)); menu.AddSeparator(""); InputRig.AxisConfig axisConfig = rig.GetAxisConfig(axisName); if (axisConfig == null) { AxisCreationMenuItem.AddAllMenuItems(menu, axisName, "", rig, onRefreshCallback); } else { int axisSourceTypeMask = axisConfig.GetSupportedInputSourceMask(); BindingDescription.BindingType bindingTypeMask = BindingDescription.BindingType.Axis | BindingDescription.BindingType.Digital; UniversalBindingAssignment.AddBindingContainerToMenu(menu, rig, onRefreshCallback, bindingTypeMask, commandName, "Bind to Input Rig/", rig, KeyCode.None, axisName, axisSourceTypeMask); //, true); //, null); menu.AddSeparator(""); if (panel == null) { menu.AddDisabledItem(new GUIContent("Add a Touch Control Panel to this rig to create and bind commands to Touch Controls!")); } else { UniversalBindingAssignment.AddControlListBindingsToMenu(menu, controlList, onRefreshCallback, bindingTypeMask, commandName, "Bind to Touch Controls/", KeyCode.None, axisName); //, true); //, null); menu.AddSeparator(""); AddTouchControlCreationItemsToMenuForAxisOrKey(menu, panel, axisName, KeyCode.None, onRefreshCallback); } } menu.ShowAsContext(); }