private void RaiseFocusSelection(Vector3 mousePosition) { if (FocusSelection != null) { FocusSelection.Invoke(mousePosition); } }
public override bool Process(LexiconRuntimeResult runtimeResult) { // There may be multiple selections, break the phrase up by selection entity. // E.g. "Move this one over here and this one over here." foreach (LexiconEntityMatch selectionMatch in runtimeResult.GetEntityMatches(Strings.Selection)) { // We expect the position entity to come after the selection entity. LexiconEntityMatch positionMatch = runtimeResult.GetEntityAfter(Strings.Position, selectionMatch); if (positionMatch != null) { FocusSelection focusSelection = selectionMatch.FocusSelection; FocusPosition focusPosition = positionMatch.FocusPosition; if (focusSelection != null && focusPosition != null) { float floorAngle = Vector3.Angle(Vector3.up, focusPosition.Normal); if (floorAngle < 45) { focusSelection.SelectedObject.transform.position = focusPosition.Position; } else { // Match the normal with vertical surfaces. focusSelection.SelectedObject.transform.position = focusPosition.Position; focusSelection.SelectedObject.transform.forward = -focusPosition.Normal; } } } } // We've consumed this intent, return true to prevent other handlers from firing. return(true); }
public void ValidateNotHandledWhenNotUIElement() { Control element = new Control(); element.XYFocusKeyboardNavigation = XYFocusKeyboardNavigationMode.Enabled; var focusManagerMock = new MockFocusManager(); var info = FocusSelection.TryDirectionalFocus(focusManagerMock, FocusNavigationDirection.Right, element); Assert.IsFalse(info.Handled); }
public void CaptureFocus() { // Get a focus position data entry from the pool. FocusPosition focusPosition = focusManager.GetPooledData <FocusPosition>(); Ray cameraRay = new Ray(mainCamera.transform.position, mainCamera.transform.forward); RaycastHit hit; if (Physics.Raycast(cameraRay, out hit)) { // This sample uses a LexiconSelectable component to determine object selectability. // You could just as easily use layers, tags, or your own scripts. LexiconSelectable selectable = hit.collider.gameObject.GetComponentInParent <LexiconSelectable>(); if (selectable != null) { FocusSelection focusSelection = focusManager.GetPooledData <FocusSelection>(); focusSelection.SelectedObject = selectable.gameObject; focusManager.AddFocusData(focusSelection); } // Set the focus position to the hit point if present. focusPosition.Position = hit.point; focusPosition.Normal = hit.normal; } else { // Set the focus position in front of the camera if no hit point. focusPosition.Position = mainCamera.transform.position + mainCamera.transform.forward * 2.0f; focusPosition.Normal = -mainCamera.transform.forward; } // Add our focus position data entry. focusManager.AddFocusData(focusPosition); // Update the pointer position. pointerSphere.transform.position = focusPosition.Position; float dist = Vector3.Distance(focusPosition.Position, mainCamera.transform.position); float scale = pointerSize * dist; pointerSphere.transform.localScale = new Vector3(scale, scale, scale); // Add a dwell position entry if the user's gaze is lingering on a spot. float speed = Vector3.Magnitude(lastPosition - focusPosition.Position) / Time.deltaTime; if (speed < dwellSpeed) { FocusDwellPosition dwellPosition = focusManager.GetPooledData <FocusDwellPosition>(); dwellPosition.Position = focusPosition.Position; dwellPosition.Normal = focusPosition.Normal; focusManager.AddFocusData(dwellPosition); } lastPosition = focusPosition.Position; }
public void ValidateShouldNotBubbleWhenModeNone() { Control element = new Control(); element.XYFocusKeyboardNavigation = XYFocusKeyboardNavigationMode.Disabled; var focusManagerMock = new MockFocusManager(); var info = FocusSelection.TryDirectionalFocus(focusManagerMock, FocusNavigationDirection.Right, element); Assert.IsFalse(info.Handled); Assert.IsFalse(info.ShouldBubble); }
public void ValidateTryDirectionalFocusMarksUnhandled() { Control element = new Control(); element.XYFocusKeyboardNavigation = XYFocusKeyboardNavigationMode.Enabled; var focusManagerMock = new MockFocusManager(); focusManagerMock.FindNextFocusResult = null; var info = FocusSelection.TryDirectionalFocus(focusManagerMock, FocusNavigationDirection.Right, element); Assert.IsFalse(info.Handled); }
void OnSpeechToTextResult(LexiconSpeechResult speechResult) { foreach (LexiconSpeechResult.WordResult wordResult in speechResult.WordResults) { if (selectionEntity.FindValueByName(wordResult.Word, true) != null) { FocusSelection focusSelection = focusManager.GetFocusData <FocusSelection>(wordResult.RealtimeStart); if (focusSelection != null) { LexiconSelectable selectable = focusSelection.SelectedObject.GetComponent <LexiconSelectable>(); selectable.Select(); selectedObjects.Add(selectable); } } } }
public void CaptureFocus() { // Get a focus position data entry from the pool. FocusPosition focusPosition = focusManager.GetPooledData <FocusPosition>(); Ray pointerRay = mainCamera.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(pointerRay, out hit)) { // This sample uses a LexiconSelectable component to determine object selectability. // You could just as easily use layers, tags, or your own scripts. LexiconSelectable selectable = hit.collider.gameObject.GetComponentInParent <LexiconSelectable>(); if (selectable != null) { FocusSelection focusSelection = focusManager.GetPooledData <FocusSelection>(); focusSelection.SelectedObject = selectable.gameObject; focusManager.AddFocusData(focusSelection); } // Set the focus position to the hit point if present. focusPosition.Position = hit.point; focusPosition.Normal = hit.normal; } else { // Set the focus position in front of the mouse if no hit point. focusPosition.Position = pointerRay.GetPoint(1.5f); focusPosition.Normal = -pointerRay.direction; } // Add our focus position data entry. focusManager.AddFocusData(focusPosition); // Add a dwell position entry if the mouse is lingering on a spot. float speed = Vector3.Magnitude(lastPosition - focusPosition.Position) / Time.deltaTime; if (speed < dwellSpeed) { FocusDwellPosition dwellPosition = focusManager.GetPooledData <FocusDwellPosition>(); dwellPosition.Position = focusPosition.Position; dwellPosition.Normal = focusPosition.Normal; focusManager.AddFocusData(dwellPosition); } lastPosition = focusPosition.Position; }
public void ValidateNavigationDirectionForKeyboardArrow() { VerifyAreEqual(FocusSelection.GetNavigationDirectionForKeyboardArrow(VirtualKey.GamepadDPadUp), FocusNavigationDirection.None); VerifyAreEqual(FocusSelection.GetNavigationDirectionForKeyboardArrow(VirtualKey.GamepadLeftThumbstickUp), FocusNavigationDirection.None); VerifyAreEqual(FocusSelection.GetNavigationDirectionForKeyboardArrow(VirtualKey.Up), FocusNavigationDirection.Up); VerifyAreEqual(FocusSelection.GetNavigationDirectionForKeyboardArrow(VirtualKey.GamepadDPadDown), FocusNavigationDirection.None); VerifyAreEqual(FocusSelection.GetNavigationDirectionForKeyboardArrow(VirtualKey.GamepadLeftThumbstickDown), FocusNavigationDirection.None); VerifyAreEqual(FocusSelection.GetNavigationDirectionForKeyboardArrow(VirtualKey.Down), FocusNavigationDirection.Down); VerifyAreEqual(FocusSelection.GetNavigationDirectionForKeyboardArrow(VirtualKey.GamepadDPadLeft), FocusNavigationDirection.None); VerifyAreEqual(FocusSelection.GetNavigationDirectionForKeyboardArrow(VirtualKey.GamepadLeftThumbstickLeft), FocusNavigationDirection.None); VerifyAreEqual(FocusSelection.GetNavigationDirectionForKeyboardArrow(VirtualKey.Left), FocusNavigationDirection.Left); VerifyAreEqual(FocusSelection.GetNavigationDirectionForKeyboardArrow(VirtualKey.GamepadDPadRight), FocusNavigationDirection.None); VerifyAreEqual(FocusSelection.GetNavigationDirectionForKeyboardArrow(VirtualKey.GamepadLeftThumbstickRight), FocusNavigationDirection.None); VerifyAreEqual(FocusSelection.GetNavigationDirectionForKeyboardArrow(VirtualKey.Right), FocusNavigationDirection.Right); }
public override bool Process(LexiconRuntimeResult runtimeResult) { // There may be multiple size matches, break the phrase up by size entity. // E.g. "Make this one bigger and this one smaller." foreach (LexiconEntityMatch sizeMatch in runtimeResult.GetEntityMatches(Strings.Size)) { // Default focus on the size entity. FocusSelection focusSelection = sizeMatch.FocusSelection; // We expect the selection entity (if present) to come before the size entity. LexiconEntityMatch selectionMatch = runtimeResult.GetEntityBefore(Strings.Selection, sizeMatch); if (selectionMatch != null) { focusSelection = selectionMatch.FocusSelection; } if (focusSelection != null) { GameObject selectedObject = focusSelection.SelectedObject; float scale = 1.0f; switch (sizeMatch.EntityValue.ValueName) { case Strings.SizeValues.Grande: scale = 2.0f; break; case Strings.SizeValues.Pequeño: scale = 0.5f; break; } // Scale the selected object by the desired amount. selectedObject.transform.localScale = selectedObject.transform.localScale * scale; } } // We've consumed this intent, return true to prevent other handlers from firing. return(true); }
public void ValidateTryDirectionalFocus() { var element = new Control(); element.XYFocusKeyboardNavigation = XYFocusKeyboardNavigationMode.Enabled; var candidate = new Control(); candidate.XYFocusKeyboardNavigation = XYFocusKeyboardNavigationMode.Disabled; var focusManagerMock = new MockFocusManager(); focusManagerMock.FindNextFocusResult = candidate; var result = new FocusMovementResult(true, false); focusManagerMock.SetFocusedElementResult = result; var info = FocusSelection.TryDirectionalFocus(focusManagerMock, FocusNavigationDirection.Right, element); Assert.IsTrue(info.Handled); }
public void ValidateShouldUpdateFocusWhenAllowFocusOnInteractionDisabled() { var elementA = new FrameworkElement(); elementA.AllowFocusOnInteraction = false; var elementB = new FrameworkElement(); elementB.AllowFocusOnInteraction = true; bool update = FocusSelection.ShouldUpdateFocus(elementA, FocusState.Pointer); Assert.IsFalse(update); //Even if the element is supposed to not allow focus, if the focus state is not a pointer, we should //still update focus update = FocusSelection.ShouldUpdateFocus(elementA, FocusState.Keyboard); Assert.IsTrue(update); //Regardless of FocusState, if we should allow focus, then we should update focus update = FocusSelection.ShouldUpdateFocus(elementB, FocusState.Pointer); Assert.IsTrue(update); }