internal bool RaiseProgressFeedback(object sender, DwellProgressState state, TimeSpan elapsedTime, TimeSpan triggerTime)
        {
            var args = new DwellProgressEventArgs(state, elapsedTime, triggerTime);

            DwellProgressFeedback?.Invoke(sender, args);
            return(args.Handled);
        }
예제 #2
0
        internal void SetState(DwellProgressState state, double feedbackProgress)
        {
            switch (state)
            {
                case DwellProgressState.Fixating:
                    TheBorder.Margin = new Thickness(0);
                    TheBorder.BorderBrush = null;
                    break;

                case DwellProgressState.Progressing:
                    var rangedProgress = Math.Max(0, Math.Min(1, feedbackProgress)) / 2.0;
                    var horizontalMargin = rangedProgress * TheGrid.ActualWidth;
                    var verticalMargin = rangedProgress * TheGrid.ActualHeight;
                    TheBorder.Margin = new Thickness(horizontalMargin, verticalMargin, horizontalMargin, verticalMargin);
                    TheBorder.BorderBrush = _brushProgressing;
                    break;

                case DwellProgressState.Complete:
                    TheBorder.Margin = new Thickness(0);
                    TheBorder.BorderBrush = _brushComplete;
                    break;

                case DwellProgressState.Idle:
                    Debug.Fail("Higher authority shold deal with idle");
                    break;
            }
        }
예제 #3
0
        internal void RaiseProgressEvent(DwellProgressState state)
        {
            if (_notifiedProgressState != state || state == DwellProgressState.Progressing)
            {
                var feedbackProgress = state == DwellProgressState.Progressing ?
                                       ((double)(ElapsedTime - _prevStateTime).Ticks) / (_nextStateTime - _prevStateTime).Ticks :
                                       0.0;
                ShowFeedback(state, feedbackProgress);
            }

            _notifiedProgressState = state;
        }
예제 #4
0
        protected override void ShowFeedback(DwellProgressState state, double progress)
        {
            if (state != DwellProgressState.Idle)
            {
                if (_feedbackPopup == null)
                {
                    _feedbackPopup = GetFeedbackControl();
                }

                _feedbackPopup.SetState(state, progress);
            }
            else
            {
                if (_feedbackPopup != null)
                {
                    GazeInput.GazeFeedbackPopupFactory.Return(_feedbackPopup);
                    _feedbackPopup = null;
                }
            }
        }
예제 #5
0
 protected override void ShowFeedback(DwellProgressState state, double progress)
 {
 }
        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;
        }
예제 #7
0
 protected abstract void ShowFeedback(DwellProgressState state, double progress);
 internal DwellProgressEventArgs(DwellProgressState state, TimeSpan elapsedDuration, TimeSpan triggerDuration)
 {
     State    = state;
     Progress = ((double)elapsedDuration.Ticks) / triggerDuration.Ticks;
 }