private void RaiseFocusSelection(Vector3 mousePosition)
 {
     if (FocusSelection != null)
     {
         FocusSelection.Invoke(mousePosition);
     }
 }
Beispiel #2
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #7
0
 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);
             }
         }
     }
 }
Beispiel #8
0
        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);
        }