コード例 #1
0
        /*
         * private const string[] pointerStates =
         * {
         *  "Exit",
         *  "PreEnter",
         *  "Enter",
         *  "Fixation",
         *  "Dwel",
         *  "DwellRepeat"
         * };
         */

        private void RaiseGazePointerEvent(GazeTargetItem target, PointerState state, TimeSpan elapsedTime)
        {
            var control = target?.TargetElement;

            // assert(target != _rootElement);
            var gpea = new StateChangedEventArgs(control, state, elapsedTime);

            /*
             * if (control is Button buttonObj && buttonObj.Content != null)
             * {
             *     var buttonText = buttonObj.Content as string;
             *     Debug.WriteLine("GPE: {0} . {1}, {2}", buttonText, PointerStates[(int)state], elapsedTime);
             * }
             * else
             * {
             *     Debug.WriteLine("GPE: 0x%08x . %s, %d", target != null ? target.GetHashCode() : 0, PointerStates[(int)state], elapsedTime);
             * }
             */

            var gazeElement = target != null?GazeInput.GetGazeElement(control) : null;

            if (gazeElement != null)
            {
                gazeElement.RaiseStateChanged(control, gpea);
            }

            if (state == PointerState.Dwell)
            {
                var handled = false;

                if (gazeElement != null)
                {
                    var args = new DwellInvokedRoutedEventArgs();
                    gazeElement.RaiseInvoked(control, args);
                    handled = args.Handled;
                }

                if (!handled)
                {
                    target.Invoke();
                }
            }
        }
コード例 #2
0
        private void RaiseProgressEvent(DwellProgressState state)
        {
            // TODO: We should eliminate non-invokable controls before we arrive here!
            if (TargetElement is Page)
            {
                return;
            }

            if (_notifiedProgressState != state || state == DwellProgressState.Progressing)
            {
                var handled = false;

                var gazeElement = GazeInput.GetGazeElement(TargetElement);
                if (gazeElement != null)
                {
                    handled = gazeElement.RaiseProgressFeedback(TargetElement, state, ElapsedTime - _prevStateTime, _nextStateTime - _prevStateTime);
                }

                if (!handled && state != DwellProgressState.Idle)
                {
                    if (_feedbackPopup == null)
                    {
                        _feedbackPopup = GazePointer.Instance.GazeFeedbackPopupFactory.Get();
                    }

                    var control = TargetElement as FrameworkElement;

                    var transform = control.TransformToVisual(_feedbackPopup);
                    var bounds    = transform.TransformBounds(new Rect(
                                                                  new Point(0, 0),
                                                                  new Size((float)control.ActualWidth, (float)control.ActualHeight)));
                    var rectangle = (Windows.UI.Xaml.Shapes.Rectangle)_feedbackPopup.Child;

                    if (state == DwellProgressState.Progressing)
                    {
                        var progress = ((double)(ElapsedTime - _prevStateTime).Ticks) / (_nextStateTime - _prevStateTime).Ticks;

                        if (progress >= 0 && progress < 1)
                        {
                            rectangle.Stroke = GazeInput.DwellFeedbackProgressBrush;
                            rectangle.Width  = (1 - progress) * bounds.Width;
                            rectangle.Height = (1 - progress) * bounds.Height;

                            _feedbackPopup.HorizontalOffset = bounds.Left + (progress * bounds.Width / 2);
                            _feedbackPopup.VerticalOffset   = bounds.Top + (progress * bounds.Height / 2);
                        }
                    }
                    else
                    {
                        rectangle.Stroke = state == DwellProgressState.Fixating ?
                                           GazeInput.DwellFeedbackEnterBrush : GazeInput.DwellFeedbackCompleteBrush;
                        rectangle.Width  = bounds.Width;
                        rectangle.Height = bounds.Height;

                        _feedbackPopup.HorizontalOffset = bounds.Left;
                        _feedbackPopup.VerticalOffset   = bounds.Top;
                    }

                    _feedbackPopup.IsOpen = true;
                }
                else
                {
                    if (_feedbackPopup != null)
                    {
                        GazePointer.Instance.GazeFeedbackPopupFactory.Return(_feedbackPopup);
                        _feedbackPopup = null;
                    }
                }
            }

            _notifiedProgressState = state;
        }