/* * 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(); } } }
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; }