/// <summary> /// Registers the given view on this thread. /// </summary> internal void RegisterView(IInputEnabledView view) { view.EnsureNotNull(nameof(view)); m_commandQueue.Enqueue(() => { List <IInputHandler> inputHandlers = InputHandlerFactory.CreateInputHandlersForView(view); if (inputHandlers == null) { return; } if (inputHandlers.Count == 0) { return; } // Deregister old input handlers if necessary if (m_viewInputHandlers.ContainsKey(view)) { List <IInputHandler> oldList = m_viewInputHandlers[view]; foreach (IInputHandler actOldInputHanlder in oldList) { actOldInputHanlder.Stop(); } m_viewInputHandlers.Remove(view); } // Register new ones m_viewInputHandlers[view] = inputHandlers; foreach (IInputHandler actInputHandler in inputHandlers) { actInputHandler.Start(view); } }); }
/// <summary> /// Gets all possible GraphicsInputHandlers for the given view and camera types. /// </summary> /// <typeparam name="ViewType">Gets the type of the view.</typeparam> /// <param name="viewObject">The view for which to the input handlers.</param> public List <IInputHandler> GetInputHandler <ViewType>(IInputEnabledView viewObject) where ViewType : class { Type givenViewType = typeof(ViewType); return(GetInputHandler(givenViewType)); }
/// <summary> /// Gets all possible GraphicsInputHandlers for the given view and camera types. /// </summary> /// <typeparam name="TViewType">Gets the type of the view.</typeparam> /// <param name="viewObject">The view for which to the input handlers.</param> public List <IInputHandler> GetInputHandler <TViewType>(IInputEnabledView viewObject) where TViewType : class { var givenViewType = typeof(TViewType); return(this.GetInputHandler(givenViewType)); }
/// <summary> /// Starts input handling. /// </summary> /// <param name="viewObject">The view object (e. g. Direct3D11Canvas).</param> public void Start(IInputEnabledView viewObject) { m_painter = viewObject as SeeingSharpPanelPainter; if (m_painter == null) { throw new ArgumentException("Unable to handle given view object!"); } m_viewInterface = m_painter as IInputEnabledView; if (m_viewInterface == null) { throw new ArgumentException("Unable to handle given view object!"); } m_renderLoop = m_viewInterface.RenderLoop; if (m_renderLoop == null) { throw new ArgumentException("Unable to handle given view object!"); } m_dispatcher = m_painter.Disptacher; if (m_dispatcher == null) { throw new ArgumentException("Unable to get CoreDisptacher from target panel!"); } // Deligate start logic to UI thread m_dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { // Register all events m_painter.TargetPanel.PointerExited += OnTargetPanel_PointerExited; m_painter.TargetPanel.PointerEntered += OnTargetPanel_PointerEntered; m_painter.TargetPanel.PointerWheelChanged += OnTargetPanel_PointerWheelChanged; m_painter.TargetPanel.PointerPressed += OnTargetPanel_PointerPressed; m_painter.TargetPanel.PointerReleased += OnTargetPanel_PointerReleased; m_painter.TargetPanel.PointerMoved += OnTargetPanel_PointerMoved; // Create the dummy button for focus management // see posts on: https://social.msdn.microsoft.com/Forums/en-US/54e4820d-d782-45d9-a2b1-4e3a13340788/set-focus-on-swapchainpanel-control?forum=winappswithcsharp m_dummyButtonForFocus = new Button(); m_dummyButtonForFocus.Content = "Button"; m_dummyButtonForFocus.Width = 0; m_dummyButtonForFocus.Height = 0; m_dummyButtonForFocus.HorizontalAlignment = HorizontalAlignment.Left; m_dummyButtonForFocus.VerticalAlignment = VerticalAlignment.Top; m_dummyButtonForFocus.KeyDown += OnDummyButtonForFocus_KeyDown; m_dummyButtonForFocus.KeyUp += OnDummyButtonForFocus_KeyUp; m_dummyButtonForFocus.LostFocus += OnDummyButtonForFocus_LostFocus; m_dummyButtonForFocus.GotFocus += OnDummyButtonForFocus_GotFocus; m_painter.TargetPanel.Children.Add(m_dummyButtonForFocus); m_coreWindow = CoreWindow.GetForCurrentThread(); m_coreWindow.KeyDown += OnCoreWindow_KeyDown; m_coreWindow.KeyUp += OnCoreWindow_KeyUp; // Set focus on the target m_dummyButtonForFocus.Focus(FocusState.Programmatic); }).FireAndForget(); }
/// <summary> /// Starts input handling. /// </summary> /// <param name="viewObject">The view object (e. g. Direct3D11Canvas).</param> public void Start(IInputEnabledView viewObject) { m_currentControl = viewObject as Control; if (m_currentControl == null) { IInputControlHost inputControlHost = viewObject as IInputControlHost; m_currentControl = inputControlHost?.GetWinFormsInputControl(); if (m_currentControl == null) { throw new ArgumentException("Unable to handle given view object!"); } } m_focusHandler = viewObject as IInputEnabledView; if (m_focusHandler == null) { throw new ArgumentException("Unable to handle given view object!"); } m_renderLoop = m_focusHandler.RenderLoop; if (m_renderLoop == null) { throw new ArgumentException("Unable to handle given view object!"); } // Perform event registrations on UI thread viewObject.RenderLoop.UISynchronizationContext.PostAsync(() => { if (m_currentControl == null) { return; } m_currentControl.MouseEnter += OnMouseEnter; m_currentControl.MouseClick += OnMouseClick; m_currentControl.MouseUp += OnMouseUp; m_currentControl.MouseDown += OnMouseDown; m_currentControl.MouseLeave += OnMouseLeave; m_currentControl.MouseMove += OnMouseMove; m_currentControl.MouseWheel += OnMouseWheel; m_currentControl.KeyUp += OnKeyUp; m_currentControl.KeyDown += OnKeyDown; m_currentControl.LostFocus += OnLostFocus; m_currentControl.GotFocus += OnGotFocus; // Handle initial focus state if (m_currentControl.Focused || m_currentControl.ContainsFocus) { m_stateKeyboard.NotifyFocusGot(); } }).FireAndForget(); }
public void Start(IInputEnabledView viewObject) { IReadOnlyList <Gamepad> gamepads = Gamepad.Gamepads; for (int loop = 0; loop < MAX_GAMEPAD_COUNT; loop++) { if (gamepads.Count >= loop) { break; } m_gamepads[loop] = gamepads[loop]; } Gamepad.GamepadAdded += OnGamepad_GamepadAdded; Gamepad.GamepadRemoved += OnGamepad_GamepadRemoved; }
/// <summary> /// Deregisters the given view from this thread. /// </summary> internal void DeregisterView(IInputEnabledView view) { view.EnsureNotNull(nameof(view)); m_commandQueue.Enqueue(() => { if (m_viewInputHandlers.ContainsKey(view)) { List <IInputHandler> oldList = m_viewInputHandlers[view]; foreach (IInputHandler actOldInputHanlder in oldList) { actOldInputHanlder.Stop(); } m_viewInputHandlers.Remove(view); } }); }
/// <summary> /// Updates all currently active input handlers for the given view. /// </summary> /// <param name="viewObject">The object of the view control.</param> /// <param name="inputHandlers">The collection of input handlers managed by the view object.</param> /// <param name="renderLoop">The renderloop used by the view object.</param> /// <param name="currentlyDispsoing">Is the view currently disposing?</param> internal static void UpdateInputHandlerList( IInputEnabledView viewObject, List <IInputHandler> inputHandlers, RenderLoop renderLoop, bool currentlyDispsoing) { viewObject.EnsureNotNull(nameof(viewObject)); inputHandlers.EnsureNotNull(nameof(inputHandlers)); renderLoop.EnsureNotNull(nameof(renderLoop)); // Clear previous input handlers if (inputHandlers.Count > 0) { foreach (var actHandler in inputHandlers) { actHandler.Stop(); } inputHandlers.Clear(); } // Check whether this object is disposed if (currentlyDispsoing) { return; } // Check for other dependencies if ((renderLoop == null) || (renderLoop.Camera == null)) { return; } // Get all possible input handlers inputHandlers.AddRange(GraphicsCore.Current.InputHandlers.GetInputHandler( viewObject.GetType())); // Start them all foreach (var actInputHandler in inputHandlers) { actInputHandler.Start(viewObject); } }
/// <summary> /// Starts input handling. /// </summary> /// <param name="viewObject">The view object (e. g. Direct3D11Canvas).</param> public void Start(IInputEnabledView viewObject) { m_painter = viewObject as SeeingSharpCoreWindowPainter; if (m_painter == null) { throw new ArgumentException("Unable to handle given view object!"); } m_viewInterface = m_painter as IInputEnabledView; if (m_viewInterface == null) { throw new ArgumentException("Unable to handle given view object!"); } m_renderLoop = m_viewInterface.RenderLoop; if (m_renderLoop == null) { throw new ArgumentException("Unable to handle given view object!"); } m_dispatcher = m_painter.Disptacher; if (m_dispatcher == null) { throw new ArgumentException("Unable to get CoreDisptacher from target panel!"); } // Deligate start logic to UI thread m_dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { // Register all events m_painter.TargetWindow.PointerExited += OnTargetPanel_PointerExited; m_painter.TargetWindow.PointerEntered += OnTargetPanel_PointerEntered; m_painter.TargetWindow.PointerWheelChanged += OnTargetPanel_PointerWheelChanged; m_painter.TargetWindow.PointerPressed += OnTargetPanel_PointerPressed; m_painter.TargetWindow.PointerReleased += OnTargetPanel_PointerReleased; m_painter.TargetWindow.PointerMoved += OnTargetPanel_PointerMoved; m_coreWindow = CoreWindow.GetForCurrentThread(); m_coreWindow.KeyDown += OnCoreWindow_KeyDown; m_coreWindow.KeyUp += OnCoreWindow_KeyUp; }).FireAndForget(); }
/// <summary> /// Stops input handling. /// </summary> public void Stop() { // Perform event deregistrations on UI thread if (m_currentControl != null) { Control currentControl = m_currentControl; Action removeEventRegistrationsAction = new Action(() => { if (currentControl == null) { return; } currentControl.MouseEnter -= OnMouseEnter; currentControl.MouseClick -= OnMouseClick; currentControl.MouseLeave -= OnMouseLeave; currentControl.MouseMove -= OnMouseMove; currentControl.MouseWheel -= OnMouseWheel; currentControl.MouseUp -= OnMouseUp; currentControl.MouseDown -= OnMouseDown; currentControl.KeyUp -= OnKeyUp; currentControl.KeyDown -= OnKeyDown; currentControl.LostFocus -= OnLostFocus; currentControl.GotFocus -= OnGotFocus; }); if (m_currentControl.IsHandleCreated) { m_currentControl.BeginInvoke(removeEventRegistrationsAction); } else { removeEventRegistrationsAction(); } } // Set local references to zero m_currentControl = null; m_focusHandler = null; m_renderLoop = null; }
/// <summary> /// Starts input handling. /// </summary> /// <param name="viewObject">The view object (e. g. Direct3D11Canvas).</param> public void Start(IInputEnabledView viewObject) { m_rendererElement = viewObject as SeeingSharpRendererElement; if (m_rendererElement == null) { throw new ArgumentException("Unable to handle given view object!"); } // Register all events needed for mouse camera dragging m_rendererElement.Dispatcher.BeginInvoke(new Action(() => { m_rendererElement.MouseWheel += OnRendererElement_MouseWheel; m_rendererElement.MouseDown += OnRendererElement_MouseDown; m_rendererElement.MouseUp += OnRendererElement_MouseUp; m_rendererElement.MouseMove += OnRendererElement_MouseMove; m_rendererElement.MouseLeave += OnRendererElement_MouseLeave; m_rendererElement.GotFocus += OnRenderElement_GotFocus; m_rendererElement.LostFocus += OnRendererElement_LostFocus; m_rendererElement.LostKeyboardFocus += OnRendererElement_LostKeyboardFocus; m_rendererElement.PreviewMouseUp += OnRendererElement_PreviewMouseUp; m_rendererElement.KeyUp += OnRendererElement_KeyUp; m_rendererElement.KeyDown += OnRendererElement_KeyDown; })); }
/// <summary> /// Starts input handling. /// </summary> /// <param name="viewObject">The view object (e. g. Direct3D11Canvas).</param> public void Start(IInputEnabledView viewObject) { }
/// <summary> /// Creates all input handlers which are associated to one view. /// </summary> internal static List <IInputHandler> CreateInputHandlersForView(IInputEnabledView viewObject) { viewObject.EnsureNotNull(nameof(viewObject)); return(GraphicsCore.Current.InputHandlers.GetInputHandler(viewObject.GetType())); }
/// <summary> /// Starts input handling. /// </summary> /// <param name="viewObject">The view object (e. g. Direct3D11Canvas).</param> public void Start(IInputEnabledView viewObject) { _painter = viewObject as SeeingSharpPanelPainter; if (_painter == null) { throw new ArgumentException("Unable to handle given view object!"); } _viewInterface = _painter; if (_viewInterface == null) { throw new ArgumentException("Unable to handle given view object!"); } _renderLoop = _viewInterface.RenderLoop; if (_renderLoop == null) { throw new ArgumentException("Unable to handle given view object!"); } _dispatcher = _painter.Dispatcher; if (_dispatcher == null) { throw new ArgumentException("Unable to get CoreDispatcher from target panel!"); } // Delegate start logic to UI thread _ = _dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { // Register all events _targetPanel = _painter.TargetPanel; _targetPanel.PointerExited += this.OnTargetPanel_PointerExited; _targetPanel.PointerEntered += this.OnTargetPanel_PointerEntered; _targetPanel.PointerWheelChanged += this.OnTargetPanel_PointerWheelChanged; _targetPanel.PointerPressed += this.OnTargetPanel_PointerPressed; _targetPanel.PointerReleased += this.OnTargetPanel_PointerReleased; _targetPanel.PointerMoved += this.OnTargetPanel_PointerMoved; // Create the dummy button for focus management // see posts on: https://social.msdn.microsoft.com/Forums/en-US/54e4820d-d782-45d9-a2b1-4e3a13340788/set-focus-on-swapchainpanel-control?forum=winappswithcsharp _dummyButtonForFocus = new Button { Content = "Button", Width = 0, Height = 0, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, BorderThickness = new Thickness(0.0) }; _dummyButtonForFocus.KeyDown += this.OnDummyButtonForFocus_KeyDown; _dummyButtonForFocus.KeyUp += this.OnDummyButtonForFocus_KeyUp; _dummyButtonForFocus.LostFocus += this.OnDummyButtonForFocus_LostFocus; _dummyButtonForFocus.GotFocus += this.OnDummyButtonForFocus_GotFocus; _targetPanel.Children.Insert(0, _dummyButtonForFocus); _coreWindow = CoreWindow.GetForCurrentThread(); _coreWindow.KeyDown += this.OnCoreWindow_KeyDown; _coreWindow.KeyUp += this.OnCoreWindow_KeyUp; // Set focus on the target _dummyButtonForFocus.Focus(FocusState.Programmatic); }); }